Oracle10g修改SGA_TARGET

Hoegh發表於2015-07-22
    在Oracle10g中,Oracle引入了sga_target初始化引數,進而實現了 ASMM(Automatic Shared Memory Management),即讓設定一個SGA的目標值以及SGA的最大值,資料庫來動態調整其中的各個元件,如Database buffer cache、Shared pool等等。從使用的角度來說ASMM的出現極大地簡化了Oracle記憶體初始化引數的設定,在ASMM的使用上高階DBA和初學者不會有太大的差別;然而,ASMM帶來便利的同時,更大程度上它是一個黑盒,黑盒裡面藏了很多秘密,這些秘密帶來比手動管理更多的不確定性。
    下面我們看一下如何修改sga_target初始化引數的大小。
   

1.測試環境

     我們在Oracle10g中進行測試,作業系統是Windows Server 2008 R2 Standard。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> select * from v$version;

  3. BANNER
  4. ----------------------------------------------------------------

  5. Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
  6. PL/SQL Release 10.2.0.4.0 - Production
  7. CORE 10.2.0.4.0 Production
  8. TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
  9. NLSRTL Version 10.2.0.4.0 - Production

2.官方文件定義

    接下來,我們看一下和ASMM相關的兩個初始化引數在官方文件中的說明。

SGA_MAX_SIZE

 

屬性

描述

引數型別

Big integer

語法

SGA_MAX_SIZE = integer [K | M | G]

預設值

資料庫啟動時SGA的初始化大小,取決於SGA中不同池的大小,例如緩衝區,共享池,大池,等等。

是否可修改

取值範圍

0~視作業系統而定

SGA_MAX_SIZE指定了例項生命週期內SGA的最大值。

64位平臺或者非32Windows平臺,當MEMORY_TARGETMEMORY_MAX_TARGET被設定時,SGA_MAX_SIZE會被設定為二者的較大值。這樣將會預留更多的地址空間用於擴大SGA

SGA_TARGET

 

屬性

描述

引數型別

Big integer

語法

SGA_TARGET = integer [K | M | G]

預設值

0(SGA自動調整功能在DEFERRED模式調整請求下被禁用,但是在IMMEDIATE模式調整請求下是允許的)

是否可修改

ALTER SYSTEM

取值範圍

64M~視作業系統而定

是否基本引數

SGA_TARGET制定了SGA各個元件的總大小。如果SGA_TARGET被指定,那麼下面所列出的記憶體池大小將被自動分配:

l  Buffer cache (DB_CACHE_SIZE)

l  Shared pool (SHARED_POOL_SIZE)

l  Large pool (LARGE_POOL_SIZE)

l  Java pool (JAVA_POOL_SIZE)

l  Streams pool (STREAMS_POOL_SIZE)

如果上述自動調整的記憶體池被設定為非零值,那麼這些值將被自動共享記憶體管理系統(ASMM, Automatic Shared Memory Management)視為最小值。如果一個應用元件正常執行要求一個最小數值的記憶體,那麼你就需要設定最小值。

下述記憶體池需要手工設定大小,不受自動共享記憶體管理系統(ASMM, Automatic Shared Memory Management)的影響:

l  Log buffer

l  Other buffer caches, such as KEEP, RECYCLE, and other block sizes

l  Fixed SGA and other internal allocations

當自動共享記憶體管理系統在計算自動調整記憶體池的具體大小時,會將上述記憶體池記憶體從總的可用SGA_TARGET中扣除。

在“預設值”欄位中,IMMEDIATE模式自動調整要求是必要的,這樣可以避免ORA-04031錯誤。DEFERREDIMMEDIATE模式的具體值,可以透過V$MEMORY_RESIZE_OPS檢視的OPER_MODE列來檢視。


 

3.檢視相關初始化引數值

     我們透過show parameter來檢視初始化引數值,相關的引數包括sga_max_size、sga_target、pga_aggregate_target等。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> show parameter sga

  3. NAME TYPE VALUE
  4. ------------------------------------ ----------- ------------------------------

  5. lock_sga boolean FALSE
  6. pre_page_sga boolean FALSE
  7. sga_max_size big integer 1232M
  8. sga_target big integer 1232M
  9. SQL>
  10. SQL> show parameter pga

  11. NAME TYPE VALUE
  12. ------------------------------------ ----------- ------------------------------

  13. pga_aggregate_target big integer 808M
  14. SQL>
    我們看到,sga_max_size和sga_target兩個引數的值都是1232M。


 

4.修改sga_target

    我們透過alter system語句來修改sga_target,需要注意的是,sga_target是個動態引數,而sga_max_size是個靜態引數。
    這樣一來,當修改值<=sga_max_size時,我們可以直接修改sga_target值;但是,當修改值>sga_max_size時,我們必須首先修改sga_max_size引數值,重啟資料庫使靜態引數生效後再去修改sga_target值,否則,資料庫會報錯。 
注意:
    修改sga_target值時,不能將引數值設定過小,否則會報錯ORA-00827

4.1修改值<=SGA_MAX_SIZE

    首先,嘗試將sga_target引數值修改為800M,修改成功;
    然後,嘗試將sga_target引數值修改為500M,資料庫報錯ORA-00827,提示“無法將 sga_target 壓縮到指定值”;

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> alter system set sga_target=800M;

  3. 系統已更改。

  4. SQL>
  5. SQL> alter system set sga_target=500M;
  6. alter system set sga_target=500M
  7. *
  8. 第 1 行出現錯誤:
  9. ORA-02097: 無法修改引數, 因為指定的值無效
  10. ORA-00827: 無法將 sga_target 壓縮到指定值


  11. SQL>
    修改完成後,我們可以檢視一下引數值,確認引數是否修改成功。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> show parameter sga

  3. NAME TYPE VALUE
  4. ------------------------------------ ----------- ------------------------------

  5. lock_sga boolean FALSE
  6. pre_page_sga boolean FALSE
  7. sga_max_size big integer 1232M
  8. sga_target big integer 800M
  9. SQL>



4.2修改值>SGA_MAX_SIZE

    首先,嘗試將sga_target引數值修改為2G,資料庫報錯ORA-00823,提示“指定的 sga_target 的值大於 sga_max_size”; 

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> alter system set sga_target=2G;
  3. alter system set sga_target=2G
  4. *
  5. 第 1 行出現錯誤:
  6. ORA-02097: 無法修改引數, 因為指定的值無效
  7. ORA-00823: 指定的 sga_target 的值大於 sga_max_size


  8. SQL>

    從官方文件對兩個初始化引數的解釋得知,sga_target的最大值是sga_max_size。
    因此,我們需要首先修改sga_max_size的值,由於sga_max_size是靜態引數,因此需要重啟資料庫,待靜態引數修改生效後,這時才能將ga_target設定為目標值。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> alter system set sga_max_size=2G scope=spfile;

  3. 系統已更改。
  4. SQL>
    但是在重啟過程中報錯,提示“ORA-28547: 連線伺服器失敗, 可能是 Oracle Net 管理錯誤”。報錯過程如下:

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> shu immediate
  3. 資料庫已經關閉。
  4. 已經解除安裝資料庫。
  5. ORACLE 例程已經關閉。
  6. SQL>
  7. SQL>
  8. SQL> startup
  9. ORA-28547: 連線伺服器失敗, 可能是 Oracle Net 管理錯誤
  10. SQL>
  11. SQL> conn /@hoegh as sysdba
  12. ERROR:
  13. ORA-01041: 內部錯誤, hostdef 副檔名不存在


  14. SQL> conn sys/oracle@hoegh as sysdba
  15. ERROR:
  16. ORA-28547: 連線伺服器失敗, 可能是 Oracle Net 管理錯誤


  17. SQL>
    經過分析可能和Windows下的服務有關,Windows平臺下,oracle 中組成例項的後臺程式是由 oracle 服務派生出來的執行緒實現的,所以工作管理員看不見 DBWn 之類的後臺程式。shutdown 停掉例項過程,是關閉後臺程式(這裡對應執行緒)和釋放 SGA 記憶體。因為關閉的是執行緒,所以在工作管理員中看不出變化。停掉 oracle 服務,才能停掉 oracle 程式。於是,我手動關閉並重啟了Oracle服務,再次連線sys使用者,順利登陸。

點選(此處)摺疊或開啟

  1. SQL> conn /@hoegh as sysdba
  2. 已連線。
  3. SQL>
  4. SQL>
  5. SQL> show parameter sga

  6. NAME TYPE VALUE
  7. ------------------------------------ ----------- ------------------------------

  8. lock_sga boolean FALSE
  9. pre_page_sga boolean FALSE
  10. sga_max_size big integer 2G
  11. sga_target big integer 800M
  12. SQL>
    我們看到,sga_max_size引數已經成功修改為2G,此時我們就可以修改sga_target的值了。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> alter system set sga_target=2G;

  3. 系統已更改。

  4. SQL>
  5. SQL>
  6. SQL> show parameter sga

  7. NAME TYPE VALUE
  8. ------------------------------------ ----------- ------------------------------

  9. lock_sga boolean FALSE
  10. pre_page_sga boolean FALSE
  11. sga_max_size big integer 2G
  12. sga_target big integer 2G
  13. SQL>


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30162081/viewspace-1744573/,如需轉載,請註明出處,否則將追究法律責任。

相關文章