使用資料庫引數 PGA_AGGREGATE_LIMIT 限制程式大小 (文件 ID 1602891
適用於:
Oracle Database - Enterprise Edition - 版本 12.1.0.1 和更高版本本文件所含資訊適用於所有平臺
用途
本文介紹如何使用新引數 PGA_AGGREGATE_LIMIT 限制資料庫程式可以增長到的最大大小。
問題和答案
在自動化 PGA 記憶體管理模式下,Oracle 資料庫透過動態控制分配到工作區的 PGA 記憶體量來嘗試遵從 PGA_AGGREGATE_TARGET 值。但是,有時因為以下原因,PGA 記憶體使用量可能會超過 PGA_AGGREGATE_TARGET 設定:
-
PGA_AGGREGATE_TARGET 設定起到的是目標的作用,而非限制。
-
PGA_AGGREGATE_TARGET 僅控制可最佳化部分記憶體的分配。
使用大量 PGA 可能會導致高交換率。出現這種情況時,系統可能會無法響應,並且不穩定。這種時候需要考慮使用 PGA_AGGREGATE_LIMIT 初始化引數限制整體 PGA 使用量。
12c 引入了新的引數 PGA_AGGREGATE_LIMIT 以允許資料庫管理員限制 pga 記憶體使用總量。
使用 PGA_AGGREGATE_LIMIT初始化引數可以為 PGA 記憶體使用量指定硬性限制。如果超過了 PGA_AGGREGATE_LIMIT 值,則 Oracle 資料庫按照以下順序,中斷或者終止使用了最多不可最佳化 PGA 記憶體的會話或程式:
-
中止使用了最多不可最佳化 PGA 記憶體的會話呼叫。
-
如果 PGA 記憶體使用量仍超過 PGA_AGGREGATE_LIMIT,則終止使用了最多不可最佳化 PGA 記憶體的會話和程式。
使用最多不可最佳化記憶體會話的呼叫將被中止。並行查詢將被視為一個單元。如果 PGA 記憶體使用總量仍超過限制,則將終止使用最多不可最佳化記憶體的會話。
不會對除作業佇列程式之外的 SYS 程式和後臺程式執行這一部分中所述的任何操作。取而代之的操作是,如果它們使用了最多不可最佳化記憶體,則會定期將其 PGA 使用量的簡短摘要寫入到跟蹤檔案中。
顯式設定 PGA_AGGREGATE_LIMIT 與將其設定為預設值,在行為上沒有差別。
PGA_AGGREGATE_LIMIT 初始化引數動態設定為 PGA 記憶體的例項範圍硬性限制。由於該引數根據記憶體情況的變化做出響應,您無需顯式設定引數值。預設情況下,PGA_AGGREGATE_LIMIT 設定為以下值中的較大者:
- 2 GB
- 200% 的 PGA_AGGREGATE_TARGET
- (PROCESSES 初始化引數設定值)* 3 MB
該引數不會超過實體記憶體大小減去總 SGA 大小的 120%。
如果指定了值 0,則表示例項所使用的 PGA 記憶體總量沒有限制。
PGA_AGGREGATE_LIMIT 初始化引數可以動態設定;並不需要資料庫重新啟動。可以設定 PGA_AGGREGATE_LIMIT 的值,不論是否使用了自動記憶體管理。
後臺程式 CKPT 每三秒檢查一次記憶體用量是否超過了 PGA_AGGREGATE_LIMIT 初始化引數的值。如果達到或超過了限制,則此程式中斷使用最多不可最佳化 PGA 記憶體的會話呼叫。如果這些會話仍沒有釋放足夠記憶體,則終止它們。
請注意,由於 pga 值僅每三秒檢查一次,因此 pga 記憶體有可能超過 PGA_AGGREGATE_LIMIT。此外,如果在此期間該 pga 值減少到限制之下,則將不會捕獲在這三秒間隔內超過限制的情況。如果程式在三秒的間隔內快速分配然後釋放記憶體,則可能會出現這種情況。
如果達到了 PGA_AGGREGATE_LIMIT 值,則將報告如下錯誤。
示例:
此示例將展示使用 pl/sql 填充記憶體中陣列可以超過 pga_aggregate_limit 的值。
首先請檢視當前 pga_aggregate_target。由於 pl/sql 記憶體區不是 pga 目標控制的可最佳化區域,程式 pga 將超過此值。
-- 顯示自例項啟動以來分配的最大 pga 總量
select name, ROUND(value/1024/1024) as Mbytes from v$pgastat
where name in ('maximum PGA allocated','aggregate PGA target parameter','aggregate PGA auto target');
---------------------- ------------
aggregate PGA target p 208
arameter
aggregate PGA auto tar 138
get
maximum PGA allocated 119
請注意 pga_aggregate_limit 顯式設定為 512M。
where name in ('pga_aggregate_target','memory_target','memory_max_target','sga_max_size','sga_target','pga_aggregate_limit','processes')
order by name;
------ ------------------------------ ------------
0 memory_max_target 600
0 memory_target 600
0 pga_aggregate_limit 512
0 pga_aggregate_target 0
0 processes 0
0 sga_max_size 600
0 sga_target 0
執行這個過程的會話收到此錯誤:
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
針對 V$PROCESS 的查詢顯示程式在 ckpt程式捕獲到這種情況並中止其對記憶體的呼叫之前,在 3 秒時間內增長到 2.5G 大小。
------ -------- ------- ------- ------- -------- ------------ ------------ ------------ ----- ------------ ------------ ------------------------
4 5349 33 258 41 INACTIVE 3 2 2,536 SYSTEM oracle sqlplus@localhost.locald
omain (TNS V1-V3)
alert.log 顯示以下錯誤。
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
Incident details in: /u01/app/oracle/diag/rdbms/cdb1/cdb1/incident/incdir_79479/cdb1_ora_5349_i79479.trc
Dumping diagnostic data in directory=[cdmp_20130128072143], requested by (instance=1, osid=5349), summary=[incident=79479].
程式的跟蹤檔案顯示與導致此錯誤的程式相關的資訊。
透過顯示的服務名您可以知道是哪個容器發生了錯誤。
跟蹤檔案還提供了摘要 heap dump(堆轉儲)。在本例中,主堆具有 2159MB 的“koh-kghu call”。在該堆中,子堆包括 2154 MB 的“pl/sql vc2”。可以使用這些內容在 MOS 上搜尋有關這些分配的任何已知問題。諸如這樣一些與 pl/sql 相關的分配通常是 pl/sql 程式一次性將大量資料載入到記憶體中造成的。在這樣的情況下,應該變更程式,一次將有限數量的記錄載入到記憶體中。替代方法是允許這樣大的分配並增加 pga_aggregate_limit 的值
*** MODULE NAME:(SQL*Plus) 2013-01-28 07:44:27.902
*** ACTION NAME:() 2013-01-28 07:44:27.902
*** CONTAINER ID:(4) 2013-01-28 07:44:27.902
*** TRACE FILE RECREATED AFTER BEING REMOVED ***
Process may have gone over pga_aggregate_limit
Just allocated 65536 bytes
Dumping short stack in preparation for potential ORA-4036
----- Abridged Call Stack Trace -----
ksedsts()+313<-ksm_pga_limit_short_stack()+456<-ksm_check_over_limit()+540<-ksmapg()+351<-kghgex()+1426<-kghfnd()+745<-kghalo()+693<-kghgex()
+401<-kghalf()+403<-kghualloc()+794<-kohalmc()+295<-kohalc()+110<-plsm0vc_rsz()+197<-pevm_MOVC_i()+1021<-pfrinstr_MOVC()+52
<-pfrrun_no_tool()+60<-pfrrun()+809<-plsql_run()+617<-peicnt()+287<-kkxexe()+789
----- End of Abridged Call Stack Trace -----
=======================================
PRIVATE MEMORY SUMMARY FOR THIS PROCESS
---------------------------------------
******************************************************
PRIVATE HEAP SUMMARY DUMP
2161 MB total:
2161 MB commented, 261 KB permanent
481 KB free (256 KB in empty extents),
2159 MB, 1 heap: "koh-kghu call " 1 KB free held <=============指示在 pga 中使用記憶體的命名記憶體分配
------------------------------------------------------
Summary of subheaps at depth 1
2155 MB total:
2155 MB commented, 104 KB permanent
295 KB free (20 KB in empty extents),
2154 MB, 138274 chunks: "pl/sql vc2 " <--------------------指示 pga heap(堆)中包含的子堆記憶體分配
*** 2013-01-28 07:44:28.045
Incident 79480 created, dump file: /u01/app/oracle/diag/rdbms/cdb1/cdb1/incident/incdir_79480/cdb1_ora_5349_i79480.trc
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
*********START PLSQL RUNTIME DUMP************
***Got internal error Exception caught in pl/sql run-time while running PLSQL***
***Got ORA-4036 while running PLSQL***
PROCEDURE SYSTEM.FILL_MEMORY:
Dump continued from file: /u01/app/oracle/diag/rdbms/cdb1/cdb1/trace/cdb1_ora_5349.trc
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
========= Dump for incident 79480 (ORA 4036) ========
*** 2013-01-28 07:44:28.045
dbkedDefDump(): Starting incident default dumps (flags=0x2, level=3, mask=0x0)
----- Current SQL Statement for this session (sql_id=gqbtzt92rm1ck) -----
BEGIN fill_memory(2680000); END;
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
object line object
handle number name
0x77335850 7 procedure SYSTEM.FILL_MEMORY <-------程式的行號
0x77238760 1 anonymous block
----- Call Stack Trace -----
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31393455/viewspace-2129527/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【引數】DB_nK_CACHE_SIZE引數設定與資料庫預設塊大小之間的限制資料庫
- Android Intent 傳遞資料大小限制AndroidIntent
- phpmyadmin匯入資料庫大小限制修改PHP資料庫
- 資料檔案頭塊保留大小、ROWID、資料檔案最大大小等資料庫限制的說明資料庫
- oracle資料檔案大小限制Oracle
- 【EXPDP】使用EXPDP備份資料時預估大小——ESTIMATE引數
- 使用SQL來分析資料庫引數(二)SQL資料庫
- MySQL資料庫引數MySql資料庫
- DB2中的限制之六資料庫管理頁大小的限制 (轉)DB2資料庫
- 如何限制從資料庫中讀出圖片的大小資料庫
- POST表單資料大小的限制
- Oracle資料檔案大小的限制Oracle
- GBase 資料庫使用者的最大連線數限制資料庫
- 調整資料庫引數資料庫
- 限制oracle資料庫例項中的使用者(user)總數Oracle資料庫
- ORACLE中資料檔案大小及數量限制初探Oracle
- 顯示資料庫所有引數資料庫
- Oracle 資料庫引數調整Oracle資料庫
- oracle 資料檔案(Datafile ) 大小 限制 說明Oracle
- MySql連線資料庫常用引數及程式碼示例MySql資料庫
- 如何獲取 PostgreSQL 資料庫中的表大小、資料庫大小、索引大小、模式大小、表空間大小、列大小SQL資料庫索引模式
- 天翼雲RDS資料庫如何修改資料庫引數資料庫
- 資料庫使用者大小寫問題資料庫
- 資料庫易混淆引數名以及引數檔案啟動資料庫到nomount狀態資料庫
- DM7修改資料庫引數資料庫
- postgresql資料庫重要引數說明SQL資料庫
- Mysql 5.5 設定資料庫引數MySql資料庫
- MySQL 5.7資料庫引數優化MySql資料庫優化
- Nagios資料庫引數配置分析iOS資料庫
- android中使用jar庫的限制AndroidJAR
- 獲取資料庫表的資訊(大小,索引大小,建立時間,行數)資料庫索引
- Backup And Recovery User's Guide-使用閃回資料庫和還原點-閃回資料庫的限制GUIIDE資料庫
- 查詢資料庫大小資料庫
- 在可插拔資料庫上如何監控程式記憶體的使用 (文件 ID 1985042.1)資料庫記憶體
- 【限制】32G,作業系統限制?資料庫限制?作業系統資料庫
- 達夢資料庫引數調整方法資料庫
- oracle 資料庫兩種引數檔案Oracle資料庫
- RCU-資料庫初始化引數資料庫