Oracle 數據庫10g:自動共享內存管理
2024-08-29 13:35:03
供稿:網友
 
             
               
                                                                                                  是不是很難準確地分配
配到最需要的地方去成為可
                                                                                                            不同的池所需的內存數?自動共
能。
                享內存治理特性使得自動將內存分
                                                          無論您是一個剛入門的
的錯誤: 
                DBA 還是一個經驗豐富的 DBA
                ,您肯定至少看到過一次類似以下
                                                          ORA-04031:unable to 
                allocate 2216 bytes of share
                d memory ("shared pool"...               ...
                                                          或者這種錯誤:                                                                                                                                           ORA-04031:unable to allocate                 XXX
                X bytes of shared memory               
                                                          ("large pool","unknown                 object","
                session heap","frame")               
                                                          或者可能這種錯誤:                                                                                                                                       ORA-04031:unable to 
                allocate bytes of shared mem
                ory ("shared             pool",
                                                          "unknown object","joxlod:init                 h"
                ,               "JOX:ioc_allocate_pal")
                                                          第一種錯誤的原因很明
原因可能不是池本身的大小
的一個主題;但目前讓我們
池的空間不足。                   
                顯:分配給共享池的內存不足以
,而是未使用綁定變量導致的過
把重點放在手頭的問題上。)其
                滿足用戶請求。(在某些情況下,
多分析造成的碎片,這是我很喜歡
它的錯誤分別來自大型池和 java 
                                           
                                                          您需要解決這些錯誤情
問題是如何在 Oracle                 例程
                況,而不作任何與應用程序相關
所需的所有池之間劃分可用的內
                的修改。那么有哪些方案可選呢?
存。               
                                                          餡餅怎么分? 
                                                          正如您所了解的,一個
沖高速緩存、共享池、Java
占據了固定的內存數;它們
                Oracle 例程的系統全局區域                   (
池、大型池和重做日志緩沖)
的大小由 DBA 在初始化參數文
                SGA)                   包含幾個內存區域(包括緩
。這些池在操作系統的內存空間中
件中指定。             
                                                          這四個池(數據庫塊緩沖高速緩存、
的空間。(與其它區域相比,重做日志緩
)作為                   DBA,您必須確保它們各自的內存
                共享池、Java 池和大型池)幾乎占據了 SGA                   中所有
沖沒有占據多少空間,對我們這里的討論無關緊要。
分配是充足的。             
                                                          假定您決定了這些池的值分別是 2GB
數據庫例程規定池的大小。                   
                、1GB、1GB 和                 1GB。您將設置以下初始化參數來為
                                                          db_cache_size =                   2g                                                                                                    shared_pool_size =                   1g                                                                                              large_pool_size =                   1g                                                                                                java_pool_size =                   1g                                        
                                                          現在,仔細看一下這些參數。坦白講,這些值是否準確?                                             
                                                                                   我相信您一定會有疑慮
賴于數據庫內部的處理,而
                。在實際中,沒有人能夠為這些
處理的特性隨時在變化。 
                池指定確切的內存數 —             它們太依
                                                          下面是一個示例場景。
速緩存分配的專用內存比為
用戶放開了一些非常大的全
線修改內存分配的功能,但
些內存:                   
                假定您有一個典型的、大部分屬
純 OLTP                   數據庫(現在已經很少
表掃描,以創建當天的結束報表
由于提供的總物理內存有限,您
                于 OLTP                   的數據庫,并且為緩沖高
見了)分配的要少。有一天,您的
。Oracle9i                   數據庫為您提供了在
決定從大型池和 Java 池中取出一
                                                          alter system set db_cache_size                 =
                3g             scope=memory;
                                                          alter system set lar
                ge_pool_size = 512m scope=me
                mory;
                                                          alter system set jav
                a_pool_size = 512m scope=mem
                ory;
                                                          這個解決方案能夠很好地工作一段時
開始了,大型池將立即出現內存不足。同
池,以拯救這種局面。                   
                間,但是接著夜間的 RMAN                   作業