天天看點

Oracle 11g AMM與ASMM切換

現在的Oracle正在往智能化方向發展。如果我們現在找一些8i/9i時代的Oracle書籍,怎麼樣配置合适的資料庫各記憶體池大小是非常重要的話題。但是進入10g之後,自動記憶體池調節成為一個重要Oracle特性。 在10g時,Oracle推出了ASMM(Automatic Shared Memory Management),實作了Oracle SGA和PGA内部結構的自調節。進入11g之後,AMM(Automatic Memory Management)實作了參數MEMORY_TARGET,将SGA和PGA的規劃全部統籌起來對待。 預設情況下,Oracle 11g是使用AMM的。我們在安裝過程中,指定Oracle使用記憶體的百分比,這個取值就作為MEMORY_TARGET和MEMORY_MAX_TARGET的初始取值使用。如果這兩個參數設定為非零取值,那麼Oracle就是采用AMM管理政策的。 同時,如果我們設定這兩個參數為0,則AMM自動關閉。對應的SGA_TARGET、PGA_AGGREGATE_TARGET參數取值非零之後,Oracle自動退化使用ASMM特性。 本篇簡單介紹一下AMM和ASMM的互相切換。

1、實驗環境介紹我們選擇11.2.0.3進行試驗,目前狀态為ASMM。SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ProductionPL/SQL Release 11.2.0.3.0 - ProductionCORE        11.2.0.3.0         Production

目前MEMORY_TARGET設定為零,AMM沒有啟用。SQL> show parameter target NAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------archive_lag_target                   integer     0db_flashback_retention_target        integer     1440fast_start_io_target                 integer     0fast_start_mttr_target               integer     0memory_max_target                    big integer 0memory_target                        big integer 0parallel_servers_target              integer     16pga_aggregate_target                 big integer 108Msga_target                           big integer 252M

2、從ASMM到AMM

在11g中,如果使用ASMM,對應的記憶體共享段是真實的共享段。[oracle@SimpleLinux ~]$ ipcs -m ------ Shared Memory Segments --------key        shmid      owner      perms      bytes      nattch     status     0x00000000 32768      oracle    640        4194304    32                     0x00000000 65537      oracle    640        260046848  32                     0x01606d30 98306      oracle    640        4194304    32  

下面進行參數的調整,這裡筆者有一個建議,很多時候啟動umount階段故障都是由于不當的參數修改造成的。在進行參數修改之前,可以使用create pfile進行一下參數備份,可以加快故障出現時候的系統修複速度。SQL> show parameter spfileNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------spfile                               string      /u01/app/oracle/dbs/spfileora11g.ora SQL> create pfile from spfile;Done

修改系統參數,将sga和pga的target值設定為0,memory的target設定非0。注意,這個過程很多參數是靜态的參數,可以都在spfile可見性中進行修改,之後重新開機伺服器生效。SQL> alter system set memory_max_target=360m scope=spfile;System altered SQL> alter system set memory_target=360m scope=spfile;System altered SQL> alter system set sga_target=0m scope=spfile;System altered SQL> alter system set sga_max_size=0 scope=spfile;System altered SQL> alter system set pga_aggregate_target=0 scope=spfile;System altered

重新啟動資料庫伺服器,檢視參數配置。SQL> conn / as sysdbaConnected.SQL> startup forceORACLE instance started. Total System Global Area  263651328 bytesFixed Size                  1344284 bytesVariable Size             176164068 bytesDatabase Buffers           83886080 bytesRedo Buffers                2256896 bytesDatabase mounted.Database opened. SQL> show parameter targetNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------archive_lag_target                   integer     0db_flashback_retention_target        integer     1440fast_start_io_target                 integer     0fast_start_mttr_target               integer     0memory_max_target                    big integer 360Mmemory_target                        big integer 360Mparallel_servers_target              integer     16pga_aggregate_target                 big integer 0sga_target                           big integer 0

AMM啟動之後,系統共享段變為“虛拟”共享段。[oracle@SimpleLinux dbs]$ ipcs -m ------ Shared Memory Segments --------key        shmid      owner      perms      bytes      nattch     status     0x00000000 163840     oracle    640        4096       0                      0x00000000 196609     oracle    640        4096       0                      0x01606d30 229378     oracle    640        4096       0  

3、從AMM到ASMM下面是如何從AMM到ASMM。要完全關閉AMM,一定将MEMORY_TARGET和MEMORY_MAX_TARGET都設定為0才行。SQL> alter system set memory_max_target=0 scope=spfile;System altered SQL> alter system set memory_target=0 scope=spfile;System altered SQL> alter system set pga_aggregate_target=100m scope=spfile;System altered SQL> alter system set sga_target=260m scope=spfile;System altered SQL> alter system set sga_max_size=260m scope=spfile;System altered

注意,此時如果重新啟動系統,會報錯。SQL> startup forceORA-00843: Parameter not taking MEMORY_MAX_TARGET into accountORA-00849: SGA_TARGET 272629760 cannot be set to more than MEMORY_MAX_TARGET 0.SQL>

這個問題的原因是Oracle啟動過程中對于參數的内部檢查。因為MEMORY_MAX_TARGET被“顯示”的指派,與SGA_TARGET指派相沖突。 解決的方法就是使用參數預設值。建立出pfile之後,将顯示指派為0的MEMORY_TARGET和MEMORY_MAX_TARGET記錄行删除掉。再利用pfile啟動資料庫,重建spfile。

SQL> create pfile from spfile  2  ; File created. --修改前*.db_recovery_file_dest='/u01/app/fast_recovery_area'*.db_recovery_file_dest_size=10737418240*.diagnostic_dest='/u01/app'*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora11gXDB)'*.log_checkpoints_to_alert=TRUE*.memory_max_target=0*.memory_target=0*.open_cursors=300*.pga_aggregate_target=104857600*.processes=150 --修改後*.db_recovery_file_dest='/u01/app/fast_recovery_area'*.db_recovery_file_dest_size=10737418240*.diagnostic_dest='/u01/app'*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora11gXDB)'*.log_checkpoints_to_alert=TRUE*.open_cursors=300*.pga_aggregate_target=104857600*.processes=150*.remote_login_passwordfile='EXCLUSIVE'

使用pfile啟動資料庫,重建spfile。SQL> conn / as sysdbaConnected to an idle instance.SQL> startup pfile=/u01/app/oracle/dbs/initora11g.oraORACLE instance started. Total System Global Area  272011264 bytesFixed Size                  1344372 bytesVariable Size             176163980 bytesDatabase Buffers           88080384 bytesRedo Buffers                6422528 bytesDatabase mounted.Database opened.SQL> show parameter target NAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------archive_lag_target                   integer     0db_flashback_retention_target        integer     1440fast_start_io_target                 integer     0fast_start_mttr_target               integer     0memory_max_target                    big integer 0memory_target                        big integer 0parallel_servers_target              integer     16pga_aggregate_target                 big integer 100Msga_target                           big integer 260M SQL> create spfile from pfile  2  ; File created.

重新啟動之後,ASMM切換完成。

SQL> startup forceORACLE instance started. Total System Global Area  272011264 bytesFixed Size                  1344372 bytesVariable Size             176163980 bytesDatabase Buffers           88080384 bytesRedo Buffers                6422528 bytesDatabase mounted.Database opened. --真實的共享記憶體段結構[oracle@SimpleLinux dbs]$ ipcs -m ------ Shared Memory Segments --------key        shmid      owner      perms      bytes      nattch     status     0x00000000 425984     oracle    640        8388608    25                     0x00000000 458753     oracle    640        264241152  25                     0x01606d30 491522     oracle    640        4194304    25  --HugePage使用情況[oracle@SimpleLinux dbs]$ grep Huge /proc/meminfoHugePages_Total:    67HugePages_Free:      1HugePages_Rsvd:      0Hugepagesize:     4096 kB[oracle@SimpleLinux dbs]$

4、結論AMM和ASMM是我們管理資料庫非常重要的工具,借助自我調節的機制,我們可以做到資料庫自我管理。11g的AMM應該說是很友善的,但是在一些情況下,如HugePage,我們可能需要切換回ASMM。權當記錄,留需要的朋友待查。

 轉。

文章可以轉載,必須以連結形式标明出處。

本文轉自 張沖andy 部落格園部落格,原文連結:http://www.cnblogs.com/andy6/p/5856349.html   ,如需轉載請自行聯系原作者