在生產環境的EM檢查ADDM,最近總會看到增加SGA大小的建議,當前SGA是4G,決定根據建議提高到5G。

       環境:
               雙節點RAC環境,節點1 pdmcn1節點2pdmcn2

               數據庫 pdmcn 實例1 pdmcn1 實例2 pdmcn2

               Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
               CRS 10.2.0.4.0
               32G內存
     
        注意:在RAC環境下修改 SGA一定是要指定實例逐個修改,sga_max_size是允許分配的最大的SGA大小,本次設置為8G,以為是靜態參數所以要修改spfile并重啟實例,sga_target是當前要分配的SGA大小根據ADDM的建議到5G,這是個動態參數可以動態修改。


一、修改操作系統內核參數

A、節點1
[root@pdmcn1 ~]# vi /etc/sysctl.conf
kernel.shmall = 4194304  #即支持最大16G共享內存段可用,我們這次要設置最大SGA為8G,所以要修改這個參數。
[root@pdmcn1 ~]# sysctl -p #生效修改

B、節點2
[root@pdmcn2~]# vi /etc/sysctl.conf
kernel.shmall = 4194304  #即支持最大16G共享內存段可用,我們這次要設置最大SGA為8G,所以要修改這個參數。
[root@pdmcn2 ~]# sysctl -p  #生效修改

關于shmall的一點補充:

kernel.shmall
該參數控制系統一次可以使用的共享內存總量(以頁為單位,一頁4k=4098),這個值的設定需要根據kernel.shmmax 大小來確定
kernel.shmall = 2097152  就是 2097152*4098= 8G 即最大一次可用8G的內存(這個在調整SGA時需要注意,SGA大小設置不可超過該值)
該值默認 2097152 ,但根據系統內存大小和使用的不同可以參考如下:
kernel.shmall = 2097152    ---內存8G
kernel.shmall = 4194304    ---內存16G
kernel.shmall = 8388608    ---內存32G

 

二、修改SGA

A、修改實例2的SGA

檢查實例
[oracle@pdmcn2 ~]$ srvctl status database -d pdmcn

Instance pdmcn1 is running on node pdmcn1
Instance pdmcn2 is running on node pdmcn2

確定各個實例均運行正常

開始關閉實例2

[oracle@pdmcn2 ~]$ srvctl stop instance  -d pdmcn -i pdmcn2
檢查實例

[oracle@pdmcn2 ~]$srvctl status database -d pdmcn

Instance pdmcn1 is running on node pdmcn1
Instance pdmcn2 is not running on node pdmcn2

確定實例2已關閉

確定一個數據庫實例時候業務正常

db 2上啟動數據庫到mount狀態
[oracle@pdmcn2 ~]srvctl start instance -d pdmcn -i pdmcn2 -o mount

修改實例2的sga_max_size到8G
修改db2的sga_target到5G

[oracle@pdmcn2 ~]$ sqlplus / as sysdba
ALTER SYSTEM SET sga_max_size = 8589934592 COMMENT='internally adjusted' SCOPE=SPFILE SID='pdmcn2'
System altered.

ALTER SYSTEM SET sga_target = 5368709120 SCOPE=SPFILE SID='pdmcn2'
System altered.

關閉實例2
srvctl stop instance -d pdmcn-i pdmcn2

啟動實例2
srvctl start instance  -d pdmcn-i pdmcn2 open

查看實例2的SGA信息
[oracle@wtdb2 ~]$ sqlplus / as sysdba

SQL> show parameter sga;

NAME               TYPE  VALUE
------------------------------------ ----------- ------------------------------
lock_sga            boolean  FALSE
pre_page_sga        boolean  FALSE
sga_max_size        big integer 8G
sga_target          big integer 5G


SGA修改成功

B、修改實例1的SGA

關閉實例1
[oracle@wtdb1 ~]$ srvctl stop instance -d pdmcn -i pdmcn1

檢查實例狀態
[oracle@wtdb1 ~]$ srvctl status database -d pdmcn

Instance pdmcn1 is not running on node pdmcn1
Instance pdmcn2 is running on node pdmcn2

確定實例1已經關閉

db1上啟動數據庫到mount狀態
srvctl start instance -d pdmcn -i pdmcn1 -o mount

修改實例1的sga_max_size到8G
修改db2的sga_target到5G

[oracle@pdmcn2 ~]$ sqlplus / as sysdba
ALTER SYSTEM SET sga_max_size = 8589934592 COMMENT='internally adjusted' SCOPE=SPFILE SID='pdmcn1'
System altered.
ALTER SYSTEM SET sga_target = 5368709120 SCOPE=SPFILE SID='pdmcn1'
System altered.

關閉實例1
srvctl stop instance -d pdmcn -i pdmcn1

啟動實例1
srvctl start instance  -d pdmcn -i pdmcn1 -o open

查看實例1的SGA信息
[oracle@pdmcn1 ~]$ sqlplus / as sysdba

SQL> show parameter sga;

NAME               TYPE  VALUE
------------------------------------ ----------- ------------------------------
lock_sga            boolean  FALSE
pre_page_sga        boolean  FALSE
sga_max_size        big integer 8G
sga_target          big integer 5G


SGA修改成功


檢查數據庫狀態
[oracle@pdmcn1 ~]$ srvctl status database -d pdmcn

Instance pdmcn1 is running on node pdmcn1
Instance pdmcn2 is running on node pdmcn2

ok 全部正常