LOB列型別的LOGGING和NOLOGGING儲存選擇
眾所周知,如果一個庫沒有設定為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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Lob型別儲存淺析Oracle型別
- 【MySQL】時間型別儲存格式選擇MySql型別
- Oracle logging 和nologging 的區別Oracle
- 如何正確選擇ARM核心板、ARM工控板的儲存型別?型別
- LOB型別型別
- LOB儲存筆記筆記
- 如何選擇mysql的儲存引擎MySql儲存引擎
- Oracle 儲存型別Oracle型別
- 服務端指南 資料儲存篇 | MySQL(01) 資料型別的使用與選擇服務端MySql資料型別
- [轉]LOB儲存筆記筆記
- 小議lob欄位結構和儲存
- 建立NFS型別的儲存NFS型別
- Golang的值型別和引用型別的範圍、儲存區域、區別Golang型別
- 字元型別的字元儲存與位元組儲存字元型別
- NOLOGGING和FORCE LOGGING的理解
- C#引用型別和值型別在堆、棧中的儲存C#型別
- MySQL 資料型別分類和選擇MySQL 資料型別
- 關於MYSQL中FLOAT和DOUBLE型別的儲存MySql型別
- Oracle LOB儲存知識(zt)Oracle
- 移動LOB型別的索引型別索引
- 如何選擇合適的MySQL儲存引擎MySql儲存引擎
- 如何選擇RabbitMQ的訊息儲存方式?MQ
- 儲存選型與規劃
- LONG型別遷移到LOB型別(三)型別
- LONG型別遷移到LOB型別(二)型別
- LONG型別遷移到LOB型別(一)型別
- 作用域、連結屬性和儲存型別型別
- mysql 貨幣型別 選擇MySql型別
- Mybatis讀取和儲存json型別的資料MyBatisJSON型別
- 如何選擇移動儲存裝置
- 選擇合適的資料型別資料型別
- 為lob型別分配extents型別
- 物件儲存的優勢有哪些?為什麼要選擇物件儲存?物件
- JavaScript中的資料型別-儲存差別JavaScript資料型別
- js選擇物件和jq選擇物件的區別JS物件
- java呼叫oracle儲存過程的自定義型別(可變陣列)JavaOracle儲存過程型別陣列
- varchar or blob:欄位型別的儲存和溢位條件型別
- MYSQL 資料型別儲存-數值型MySQL 資料型別