LOB列型別的LOGGING和NOLOGGING儲存選擇

magic007發表於2008-01-31

眾所周知,如果一個庫沒有設定為force logging,而這個庫在歸檔模式下,對錶的插入操作如果採用APPEND模式,並且表設定為nologging則不會為插入的資料產生日誌。那麼對LOB列的儲存也設定為NOLOGGING,會產生什麼樣的結果?

測試環境:Oracle 9.2.0.1 for Win,非歸檔模式

create table test1.t1(id int not null, out_row clob)
lob(out_row) store as (disable storage in row nocache nologging);

關閉資料庫,備份資料檔案users01.dbf

啟動資料庫,將表中插入資料:

insert into test1.t1 select rownum,rpad('x',5000,'x') from dba_objects where rownum<=100;

select * from test1.t1;

能夠正常返回100行資料。

關閉資料庫,用備份的檔案還原檔案users01.dbf,啟動資料庫時報錯:

資料庫裝載完畢。
ORA-01113: ?? 5 ??????
ORA-01110: ???? 5: 'D:\ORACLE\ORADATA\XJ\USERS01.DBF'


SQL> recover datafile 5;
完成介質恢復。

SQL> alter session set nls_language=american;

Session altered.
SQL> alter database open;

Database altered.

SQL> select count(*) from test1.t1;

  COUNT(*)
----------
       100

SQL> select * from test1.t1;
ERROR:
ORA-01578: ORACLE data block corrupted (file # 5, block # 61)
ORA-26040: Data block was loaded using the NOLOGGING option
ORA-01110: data file 5: 'D:\ORACLE\ORADATA\XJ\USERS01.DBF'

由此可以看出,在此前的插入操作中,沒有對LOB資料產生日誌。

我們將test1.t1刪除,再重新建立,只是將LOB設定為LOGGING。

SQL> drop table test1.t1;

表已丟棄。

SQL> create table test1.t1 (id number not  null,out_row clob)
  2  lob (out_row) store as (disable storage in row nocache logging);

重複上步實驗過程,發現LOGGING模式下的LOB能夠正常恢復。

將資料庫設定為歸檔模式,重複以上測試過程,發現NOLOGGING模式下的LOB仍然不能恢復。

將資料庫設定為FORCE LOGGING模式,重複以上測試過程,發現NOLOGGING模式下的LOB能夠正常恢復。

經過進一步測試,對LOB欄位進行UPDATE也會產生上述實驗結果。

在這個測試中使用了一個比較“笨”的辦法。觀察LOB列是否產生日誌,可以觀察redo size和分析日誌檔案進行。在此不在細述。

經過測試,發現IN ROW的LOB列與表中的其他列資料是一致的LOGGING行為。

注意:LOB列如果設定為CACHE,則只能是LOGGING模式。

由此引出一個問題,由於對LOB列設定為NOLOGGING,雖然能夠提高資料插入速度,為資料恢復設定了一道難關。需要此種情況下的備份恢復策略,或者將LOB列設定為LOGGING模式。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69924/viewspace-166597/,如需轉載,請註明出處,否則將追究法律責任。

相關文章