天天看點

oracle rac 4031 報錯處理

oracle RAC中Oracle 4031報錯發生的原因是:大量的hard parse硬解析導緻了sag 的shared pool中的free list産生了大量的記憶體小碎片。當一個需要大記憶體的sql語句進行hard parse硬解析時,無法從free list中找到可用的記憶體,即使進行記憶體的釋放,也無法找到符合條件的記憶體塊,就會報ora-04031的報錯。

解決方法是:1.清空Sga中的shared pool:

alter system flush shared_pool;

2.sql共享,綁定環境變量。

Sql語句需要統一書寫風格,空格、大小寫、數值等不一樣,回車等,都會影響硬解析。

并且可以使用強制綁定環境變量的方法,提高解析效率。

3.擴大shared pool 的保留區。

配置設定記憶體時候,會先從普通共享池的free lists中尋找空間,free lists無可用空間時,就會尋找可釋放的記憶體空間,如果無法找到可釋放的記憶體空間,就會從保留池中配置設定記憶體。

select request_misses from v$shared_pool_reserved;

檢視保留區的請求空間失敗次數,隻要有一次,就會發生ora-04031的報錯。

可以檢視保留區的大小:

show parameter shared_pool_reserved_size;

修改保留區的大小:

alter system set shared_pool_reserved=xxxM scope=both;

4.增大shared pool的大小。

可以檢視sga中各個池子的情況:

select component,current_size from v$sga_dynamic_compoments;

select shared_pool_size_for_estimate,shared_pool_size_factor from v$shared_pool_advice;

當shared_pool_size_factor=1的時候,就是設定shared pool 大小的最佳值。

alter system set shared_pool_size = xxxM scope=both;

可以用這個語句去修改shared pool的大小。

5.把記憶體使用量非常大的對象keep在記憶體中。

查找可以keep的對象,執行dbms_shared_pool.keep('對象名');

查找對象名:

select owner,name,namespace,type,sharable_mem from v$db_object_cache where sharable_mem>10000 and (type='PACKAGE' or type='PACKAGE BODY' or type='FUNCTION' or type='PROCEDURE') and KEPT='NO';

這樣可以把記憶體占用大的對象keep在記憶體中。

當ORACLE中有大量的小free chunk時,找不到合适的free chunk時,會去Library cache中找到大的chunk,根據shared pool中的LRU 連結清單規則,把它的空間釋放,重新鍊到free list用來解析新的硬解析執行計劃,如果此時再來一個大的sql,無法找到合适的free chunk,也在library cache中找到可釋放的空間,也會報ora-04031的報錯。

oracle rac 4031 報錯處理
oracle rac 4031 報錯處理

白虎

oracle rac 4031 報錯處理

鼓勵的話語:言慢者貴,性柔者富,厚德者旺!