--************************************安全
-- db_block_checking 與 db_block_checksumoop
--************************************post
db_block_checking與db_block_checksum兩個參數都是對block進行檢查,然而二者很容易混淆。事實上,兩個參數中前者是對塊作邏性能
輯性檢查,後者則是作物理性檢查。二者各司其職,並不矛盾。下面分別給出具體描述。測試
1.db_block_checking
db_block_checking 是當block發生任何變化的時候進行邏輯上的完整性和正確性檢查。該參數可以避免內存中數據塊的損壞。塊spa
的檢查將對系統會有1%到10%的性能影響。取決於對db_block_checking參數的設置。頻繁的DML將使得塊檢查帶來更多的開銷。在系統rest
負荷容許的情形下建議設置爲full。該參數對SYSTEM表空間始終是處於「打開」狀態,而無論該參數是否設置爲OFF。下面是該參數的日誌
設置參考。FALSE和TRUE是爲了老版本的兼容。
Property Description
--------------- ------------
Parameter type String
Syntax DB_BLOCK_CHECKING = { FALSE| OFF| LOW | MEDIUM | TRUE| FULL} -->OFF(=FALSE),FULL(=TRUE)
Defaultvalue FALSE
Modifiable ALTER SYSTEM
Basic No
2.db_block_checksum
db_block_checksum 用於DBWn和direct loader數據塊寫入到磁盤時,基於塊內的全部字節計算得出一個校驗值並將其寫入塊頭。
在該參數設置爲typical和full時,當讀入時候從新計算校驗和寫出時候的校驗對比,若是不一樣則認爲是塊損壞。若是設置爲FULL模式
,則基於update/delete應用程序語句級別的改變發生後,校驗值會被從新計算並寫入。同時對於日誌塊,在寫入以前,一樣會生產校
驗值並寫入到塊頭。該參數主要是防止IO硬件和IO子系統的錯誤。若是設置爲OFF則只對系統表空間有效。下面是該參數的設置參考。
FALSE和TRUE是爲了老版本的兼容。
Property Description
--------------- ------------
Parameter type String
Syntax DB_BLOCK_CHECKSUM = { OFF| FALSE| TYPICAL | TRUE| FULL} -->OFF(=FALSE),FULL(=TRUE)
Defaultvalue TYPICAL
Modifiable ALTER SESSION,ALTER SYSTEM
Basic No
3.存在的問題
若是db_block_checking = off,非系統表空間中數據在邏輯上可能已經損壞,可是 db_block_checksum 倒是沒法檢查出來的(負責物
理層面的校驗),原樣寫到磁盤原樣讀到內存,由於它只校驗塊在寫出後和讀入之間是否發生變化而不檢查寫出前是否存在邏輯上的正確。
有些狀況下,好比索引塊損壞,形成經過索引沒法得到數據,可是讀索引塊的時候並無出1578錯誤,有多是這個緣由。
SQL>ho oerr ora 1578
01578,00000,"ORACLE data block corrupted (file # %s, block # %s)"
// *Cause: Thedatablockindicated was corrupted, mostly due tosoftware
// errors.
// *Action: Try torestorethesegmentcontaining theblockindicated. This
// may involve dropping thesegmentandrecreating it. Ifthere
// isa tracefile,report theerrorsinit toyour ORACLE
// representative
4.db_block_checking和db_block_checksum這兩個參數對性能的影響
下面的例子中作一個測試來查看該參數對性能的影響。實際上,環境的不一樣將使得測試結果會大相庭徑。
a. 建立測試對象
- SQL>select * from v$version where rownum<2;
- BANNER
- ----------------------------------------------------------------------
- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0- Production
- SQL>show parameter db_block_che
- NAME TYPE VALUE
- ----------------------------------------------- ------------------------------
- db_block_checking string FALSE
- db_block_checksum string TYPICAL
- SQL>show user;
- USER is "SCOTT"
- SQL>create table test (col int) tablespace users nologging; -->因爲空間壓力在此不記錄日誌
- Table created.
b. 修改兩個參數爲FALSE
- SQL>alter system set db_block_checksum=FALSE;
- System altered.
- SQL>set timing on;
c. 對測試表test中三次分別插入100,000行數據
從上面的結果能夠看出插入100百萬條記錄所需的最長時間爲56.87秒,最短的時間爲59.13,平均時間爲58.5233。
- SQL> begin -->第一次插入數據
- 2 fori in1..1000000
- 3 loop
- 4 insert into test values(i);
- 5 end loop;
- 6 end;
- 7 /
- PL/SQL procedure successfully completed.
- Elapsed: 00:00:59.57
- SQL>commit;
- SQL>alter system check point;
- SQL>@insert_test.sql -->第二次插入數據
- PL/SQL procedure successfully completed.
- Elapsed: 00:00:59.13
- SQL>commit;
- SQL>alter system check point;
- SQL>@insert_test.sql -->第三次插入數據
- PL/SQL procedure successfully completed.
- Elapsed: 00:00:56.87
- SQL>commit;
- SQL>alter system check point;
d. 修改兩個參數爲TRUE
- SQL>alter system set db_block_checksum=TRUE;
- SQL>alter system set db_block_checking=TRUE;
- SQL>show parameter db_block_ch
- NAME TYPE VALUE
- ----------------------------------------------- ------------------------------
- db_block_checking string TRUE
- db_block_checksum string TRUE
e. 再次測試表test中三次分別插入100,000行數據
從上面的結果能夠看出插入100百萬條記錄所需的最長時間爲03:01.66秒,最短的時間爲02:49.15,平均時間爲02:57秒左右。
- SQL>@insert_test.sql -->第一次插入數據
- PL/SQL procedure successfully completed.
- Elapsed: 00:02:58.01
- SQL>commit;
- SQL>alter system check point;
- SQL>@insert_test.sql -->第二次插入數據
- PL/SQL procedure successfully completed.
- Elapsed: 00:03:01.66
- SQL>commit;
- SQL>alter system checkpoint; -->第三次插入數據
- SQL>@insert_test.sql
- PL/SQL procedure successfully completed.
- Elapsed: 00:02:49.15
- SQL>commit;
- SQL>alter system checkpoint;
5.總結
a. 對結果進行對比,能夠看出當將兩個block參數設置爲true時,其速度比爲false時慢了近30%,不過此對比根據實際環境應有所不一樣。
b. 對於性能上的差別而言,當設置兩個block參數設置爲true時,將須要更多的CPU資源來生成校驗值以及進行內存塊的驗證。同時,
該操做容易引發redo copy latch的持有時間增長和引發這個latch的競爭。
c. 無論db_block_checking和db_block_checksum這兩個參數的值爲什麼值,SYSTEM表空間都會進行作checking和checksum,能夠經過隱含
參數_db_always_check_system_ts設置爲FALSE,但爲了SYSTEM表空間數據安全,不建議將這個隱含參數值設置爲FALSE。
d. checksum 經過校驗結構夠保證寫入到數據文件與從數據文件讀取的塊先後二者是一致的。一般對於偵測因爲IO操做(磁盤損壞,硬
件損壞)引起的壞塊。但它並不偵測在內存中已經出錯的數據塊。無論錯誤與否,DBWn後會將其寫入到數據文件。
e. checking 則正好彌補了checksum的不足,它對數據塊在內存提供一致性驗證,確保每個數據塊的完整性。