ORA-4031錯誤深入解析

想要徹底理解4031錯誤發生的原因就要了解SQL語句的執行過程以及Oracle共享內存的結構


客戶端輸入sql語句,sql語句通過網絡到達數據庫實例,server process接受sql語句。Server process接受到SQL語句后將sql語句解析成執行計劃,然后才能執行。

需要說明的是在將SQL語句解析成執行計劃的過程中會消耗計算機大量CPU資源因此就會產生一個問題,例如:

A用戶執行一個SQL語句解析換成執行,B用戶也有可能執行同樣的SQL。如何才能高效利用CPU資源,不去做重復的解析工作呢?

因此就誕生了shared pool,shared pool就是SGA中用來緩存SQL語句以及對應解析出的執行計劃的一片內存區域。


Oracle實例管理

這里結合Oracle實例管理的這張圖對上面一幅客戶端與Oracle之間會話通信的過程進行簡單的解釋說明:

首先客戶端會在同Oracle實例間建立的連接池當中的眾多連接中選擇一條空閑的連接傳輸SQL語句(server

process是服務器進程,可以連接到Oracle實例,在用戶建立會話時啟動)。

Server Process首先會先去shared pool中查找是否已經有了該條SQL語句對應的已緩存的執行計劃,如果有直接執行(該種SQL解析也叫作軟解析)。如果沒有則會自己生成執行計劃并緩存執行(該種解析也叫作硬解析)。

其中shared pool是SGA(共享全局區)中的一部分內存資源,由所有服務器進程和后臺進程共享。

Buffer Cache也是SGA中的一塊區域,用來緩存Data

files中取出的數據,如果沒有buffer cache的話那么每次訪問數據的時候都需要消耗I/O。

所以當執行一個SQL語句對應的執行計劃要訪問數據,server process會先進入buffer cache找是否有所需要的數據,如果有就直接取出返回沒有才會去Data files去取并將其先放入buffer

cache中,并在其中對數據進行修改。之后再通過物理I/O寫回到Oracle的數據文件中去。

在對數據進行修改的同時會向SGA中另一塊內存區域叫作Redolog Buffer中寫入相關的日志信息。之后再寫回到Oracle的日志文件中區。

將返回的數據或信息通過連接返回給客戶端。

上述過程中可以看出共享池是SGA中一塊核心的內容,經典的Oracle4031錯誤也與這一塊內存區域有密切的關系。


Free Cache:

顧名思義就是shared pool中的一塊空閑的內存區域。

Library Cache(庫緩存):

主要緩存的是SQL語句,以及SQL句解析出來的執行計劃。

Raw Cache(字典緩存):

Oracle數據庫的自身信息都存儲在數據字典中(比如說:數據庫中有多少表,有多少用戶,表中有多少列每個表多大等等)

Shared Pool主要的三塊空間中一般Free Cache和Library Cache較容易有問題。我們可以整體上設置Shared Pool的大小但不能控制當中的Library Cache和Raw Cache的大小。

需要理解的是,Free Cache并不是一個大塊連續的內存空間而是一個個內存塊通過chain鏈將其鏈接如下圖所示


圖中橙色的圓代表一個個內存塊在Oracle中稱之為chunk,而這些chunk會根據大小的不容被歸類掛載一條條chain上,從下往上越來越大。

在這里舉個例子:

如果有一條SQL語句解析出來大小為10K,那么就在第8K-12K的內存鏈上找比如找到一個11K的塊那么就將其中的10K丟到Library Cache中,而剩下的1K再掛到相應的空間鏈里面去。這就是Free空間的內存組織情況。

這里需要特別提醒強調的是——什么時候需要在Free空間你面找chunk?答案是在執行硬解析的時候。

由此可見當有大量硬解析的時候,除了要去Free空間中找chunk還會產生大量的小碎片,于是就有可能產生這種情況,及有大量足夠的Free空間但是被分割成很多小的碎片,沒有適合可用的內存塊。這種情況便會產生Oracle經典的4031報錯。

總結一下Oracle產生4031錯誤的背景條件:

大量的硬解析產生了很多小碎片

產生了大量的小碎片后突然來了一條大的SQL語句需要解析。

本文原創首發于Cobub官網博客,作者:鐘澤

如有轉載請注明作者和出處!

推薦一款開源 私有化部署的移動應用數據統計分析 系統Cobub Razor

開源社區技術交流QQ群:194022996

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容