共計 7199 個字符,預計需要花費 18 分鐘才能閱讀完成。
本篇內容介紹了“oracle 11g 自動內存管理概述”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
一:Oracle 11g 自動內存管理概述
oracle11g 中的新的內存管理特性自動化內存管理 (automatic memory management)。在該新特性之下 SGA 與 PGA 將會根據需要自動的擴展與收縮。你只需要設置兩個內存管理相關的參數 memory_target 與 memory_max_target.
1)memory_target: 該參數設置整個 oracle 數據庫實例可以使用的內存量,oralce 數據庫實例在運行過程中會根據需求自動的調節 SGA 與 PGA 的大小。可以使用相應的 alter system 命令動態的修改 memory_target 的值。該參數是動態初始化參數。
2)memory_max_target: 該參數設置 oracle 實例可以使用的最大內存量。在調整 memory_target 的值時必須保持以下的約束關系 memory_target =memory_max_target. 該參數是靜態初始化參數, 修改需要重啟才能生效。
在創建數據庫的時候,你可以通過設置 memory_target,memory_max_target 初始化參數來開啟自動化內存管理特性。在數據庫創建以后也可以通過設置 memory_target,memory_max_target 初始化參數來開啟自動化內存管理,但是不會立即生效,需要重啟實例。
使用動態內存管理時,SGA_TARGET 和 PGA_AGGREGATE_TARGET 代表它們各自內存區域的最小設置,要讓 Oracle 完全控制內存管理,這兩個參數應該設置為 0。
關于設置 memory_target 的值的原則:如果服務器只有數據庫,可以分配全部內存的 2 /3 到 3/4 給 oracle 的 memory_target;
查看 memory_target 以及 SGA_TARGET 和 PGA_AGGREGATE_TARGET 的設置的值,需要注意設置的值不會變化的,如下:
SQL show parameter target
NAME TYPE VALUE
———————————— ———– ——————————
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 62848M
memory_target big integer 62848M
parallel_servers_target integer 512
pga_aggregate_target big integer 4G
sga_target big integer 8G
二:如何 Oracle 運行的某個時刻的各個內存的分配大小呢?
可以通過 create pfile from spfile, 查看:
[oracle@JoinSpider dbs]$ cat initora11g.ora
ora11g.__db_cache_size=2281701376
ora11g.__java_pool_size=939524096
ora11g.__large_pool_size=805306368
ora11g.__oracle_base= /files/oracle #ORACLE_BASE set from environment
ora11g.__pga_aggregate_target=57310969856 ## 這是當前實際的分配 pga 的值,
ora11g.__sga_target=5637144576 ## 這是當前實際的分配 sga 的值
ora11g.__shared_io_pool_size=0
ora11g.__shared_pool_size=3758096384
ora11g.__streams_pool_size=0
*.audit_file_dest= /files/oracle/admin/ora11g/adump
*.audit_trail= db
*.compatible= 11.2.0.4.0
*.control_files= /files/oracle/oradata/ora11g/control01.ctl , /files/oracle/fast_recovery_area/ora11g/control02.ctl
*.db_block_size=8192
*.db_domain=
*.db_name= ora11g
*.db_recovery_file_dest= /files/oracle/fast_recovery_area
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest= /files/oracle
*.dispatchers= (PROTOCOL=TCP) (SERVICE=ora11gXDB)
*.memory_max_target=65899345920
*.memory_target=65899345920
*.open_cursors=300
*.pga_aggregate_target=4294967296 ### 這是最小值
*.processes=1500
*.remote_login_passwordfile= EXCLUSIVE
*.sga_target=8589934592 ### 這是最小值
*.undo_retention=3600
*.undo_tablespace= UNDOTBS1
三:Oracle11g 內存管理如何開啟:
1:在數據庫創建期間設置自動內存管理:如果是手工建庫,那么你只需要設置好如下類似初始化參數即可:
memory_target = 1000m
memory_max_target = 1500m
如果是采用 DBCA 創建數據庫,如果是創建新庫并且是高級安裝,你能選擇自動內存管理選項。如果是選擇基本安裝,那么默認就是自動內存管理。
2:在數據庫創建后:你可以在數據庫創建后添加 memory_max_target 和 memory_target. 雖然 memory_target 是一個動態參數,但是當數據庫運行時,你不能交換到自動內存管理。必須重啟數據庫將參數應用到實例啟動過程才行。
四:Oracle11g 內存管理的相關參數設置的含義和原則:
MEMORY_TARGET 設置為非零值時:
1: 如果設置了 SGA_TARGET 和 PGA_AGGREGATE_TARGET,則會分別將它們當作 SGA 大小和 PGA 大小的最小 值。
2: 如果設置了 SGA_TARGET 但未設置 PGA_AGGREGATE_TARGET,則仍會自動優化這兩個參數。PGA_AGGREGATE_TARGET 將初始化為以下值:(MEMORY_TARGET -SGA_TARGET)。
3: 如果設置了 PGA_AGGREGATE_TARGET 但未設置 SGA_TARGET,則仍會自動優化這兩個參數。SGA_TARGET 將初始化為值 min(MEMORY_TARGET -PGA_AGGREGATE_TARGET, SGA_MAX_SIZE(如果用戶已設置)),系統將自動優化子組件。
4: 如果未設置任何參數,則無需最小值或默認值即可自動優化這兩個參數。有這樣一個策略:在初始化過程中,將 MEMORY_TARGET 的按固定比率分配給 SGA 和 PGA。具體如下:
sga_target =memory_target *60%
pga_aggregate_target=memory_target *40%
如果未設置 MEMORY_TARGET,或者將其顯式設置為 0(11g 中的默認值為 0)則取消了 memory_target 的作用,完全和 10g 在內存管理上一致。:
1. 如果設置了 SGA_TARGET,則系統僅自動優化 SGA 的子組件大小。PGA 的自動優化與 是否顯式設置 PGA 無關。但是,不會自動優化整個 SGA (SGA_TARGET) 和 PGA (PGA_AGGREGATE_TARGET),即 SGA 和 PGA 不會自動增長或收縮。
2. 如果既未設置 SGA_TARGET,又未設置 PGA_AGGREGATE_TARGET,則 SGA 中的各組件大小都要明確設定,不能自動調整各組件大小。PGA 不能自動增長和收縮。
3. 如果僅設置了 MEMORY_MAX_TARGET,則使用文本初始化文件進行手動設置時,MEMORY_TARGET 默認為 0。SGA 和 PGA 的自動優化行為默認情況下與 10g R2 中的相同。
4. 如果 SGA_MAX_SIZE 不是用戶設置的,則在用戶設置了 MEMORY_MAX_TARGET 的情況下,系統會在內部將其設置為 MEMORY_MAX_TARGET(與用戶是否設置 SGA_TARGET 無關)
五:若將一個非自動化內存管理的 11g 庫系統改成自動化內存管理,該如何確認 MEMORY_TARGET 的值?
1. 在一個系統上啟用自動內存管理其實很簡單,不需要事先做太多的事情,可以使用下面的計算公式來計算 MEMORY_TARGET: MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET, maximum PGA allocated
下面的查詢語句向你展示有關的信息,以及如何計算出需要的 memory_target 值:
1. 方法一:使用 sql 查出 SGA_TARGET、PGA_AGGREGATE_TARGET 以及 maximum PGA allocated 的值,之后根據公式 MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET, maximum PGA allocated 算出結果,,注意函數 GREATEST 是求兩個數值中的最大值:
SELECT name, value/1024/1024
FROM v$parameter
WHERE name IN (pga_aggregate_target , sga_target)
UNION
SELECT maximum PGA allocated AS name, TO_CHAR(value)/1024/1024 AS value
FROM v$pgastat
WHERE name = maximum PGA allocated
方法二:直接一個 sql 查出 memory_target 的值,單位為 mb;
SELECT (sga.value + GREATEST(pga.value, max_pga.value))/1024/1024 AS memory_target
FROM
(SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = sga_target ) sga,
(SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = pga_aggregate_target ) pga,
(SELECT value FROM v$pgastat WHERE name = maximum PGA allocated) max_pga;
我認為 MEMORY_TARGET 應該等于 實際的 sga 的值加上 PGA 最大分配的值,這是最真實的,但是一般就認為 MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET, maximum PGA allocated) 即可
如果想更真實的確定 MEMORY_TARGET 的大小,那就要確定實例的 sga_target 的實際使用的大小,當前設置值減去剩余值。然后再利用前邊的計算公式
SQL select (
(select sum(value) from v$sga) –
(select current_size from v$sga_dynamic_free_memory)
)/1024/1024/1024 sga_target
from dual;
2. 如果此時實例沒有設置 memory_target 或者說 memory_target=0,并且把 SGA_TARGET 設置為 0,即表示禁用 10g 的新特性——自動共享內存(sga) 分配,這樣我們需要對各個 sga 內存組件的值進行單獨設置, 那么這種情況下該怎么確定 memory_target 的值來開啟 Oracle11g 的自動內存管理呢?
SQL select value/1024/1024 as value from v$pgastat where name= maximum PGA allocated
VALUE
———-
45.7822266
可見 pga_aggregate_target=46M,確定 oracle 實例啟動以來 PGA 的最大容量,可以理解為最大的使用量。
SQL SELECT ((SELECT SUM(value) FROM V$SGA) –
(SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY) ) SGA_TARGET
FROM DUAL;
SGA_TARGET
———-
313626624
可見 SGA_target 的大小為 300M,
1)如果馬上就修改 memory_target=352M 會報
值的范圍不合法的提示,
SQL alter system set memory_target=352M;
alter system set memory_target=352M
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least
400M
因為要滿足 memory_target =pga_aggregate_target+sga_target.
但是 pga_aggregate_target 的值是 100M,而 SGA_target 的值為 300M。
352M 300M+100M 所有出錯了。
2)修改 PGA 或者 sga 的值為 0M 也會報錯的。因為還沒有設置 memory_target 的值,
SQL alter system set pga_aggregate_target=0;
alter system set pga_aggregate_target=0
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00093: pga_aggregate_target must be between 10M and 4096G-1
如果直接修改 pga_aggregate_target 的值會報上面的錯誤。因為我們還沒有設置 momory_target 的值,如果直接是設置 PGA 的大小為 0M 的話,那就等于不給 PGA 分配內存了,所有我們通過上面的一個查詢,確定自實例啟動以來分配給 PGA 的最大內存大小 46M,先把 PGA 的值調下來。使
memory_target =pga_aggregate_target+sga_target. 即 352M =50M+300M
SQL alter system set pga_aggregate_target=50M;
System altered.
SQL alter system set memory_target=352M;
System altered.
SQL alter system set pga_aggregate_target=0M;
System altered.
這是我們已經啟用 oracle 的內存自動化管理,并且設置 SGA_target 與 pga_aggregate_target 參數的值為 0。oracle 這時就不會為 SGA 與 PGA 分配最小內存大小了。oracle 會根據工作負載自動的調整 SGA 與 PGA 的大小。
六:Oracle 11g 設置內存相關參數原則:
1. 如果 Oracle11g 要開啟自動內存管理,需要設置 MEMORY_TARGET 的值,如果該服務器只跑 Oracle,那么可以按著下面的原則設置:
MEMORY_TARGET= 物理內存 x 80%
MEMORY_MAX_SIZE= 物理內存 x 80%
2. 如果不打算開啟自動內存管理,也就是 MEMORY_TARGET=0:
對于 OLTP 系統:
SGA_TARGET=(物理內存 x 80%) x 80%
SGA_MAX_SIZE=(物理內存 x 80%) x 80%
PGA_AGGREGATE_TARGET=(物理內存 x 80%) x 20%
對于 DSS 系統:
SGA_TARGET=(物理內存 x 80%) x 50%
SGA_MAX_SIZE=(物理內存 x 80%) x 50%
PGA_AGGREGATE_TARGET=(物理內存 x 80%) x 50%
“oracle 11g 自動內存管理概述”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!