nologging插入需再次備份一點分析

dotaddjj發表於2012-08-08

相信經常看見文章 blog上面提到用nologging方式插入資料後需要馬上進行備份,下面用兩個例子來對nologging方式插入後需要再次備份後才能進行完全恢復進行分析.

SQL> create table t_nolog01 as select * from dba_objects where 1<>1;

Table created

SQL> alter table t_nolog01 nologging;

Table altered

SQL> select table_name,logging from user_tables where table_name='T_NOLOG01';

TABLE_NAME LOGGING

------------------------------ -------

T_NOLOG01 NO

Rman>backup tablespace users;

users表空間進行了一個備份,注意這裡在nologging插入前備份的

SQL> insert /*+append*/ into t_nolog01 select * from dba_objects;

72141 rows inserted

SQL> commit;

Commit complete

此時正常關閉資料庫刪除users表空間,然後用users表空間的備份恢復開啟資料庫後

SQL> select count(*) from t_nolog01;

select count(*) from t_nolog01

ORA-01578: ORACLE 資料塊損壞 (檔案號 4, 塊號 171)

ORA-01110: 資料檔案 4: 'F:APPORADATAXIAOYUUSER01.DBF'

ORA-26040: 資料塊是使用 NOLOGGING 選項載入的

如果利用增量備份在nologging插入後再次備份,資料應該不會出現丟失,進行第二個測試:

SQL> create table t_test_nolog01 tablespace test as select * from dba_objects where 1<>1;

Table created

SQL> alter table t_test_nolog01 nologging;

Table altered

SQL> select table_name,logging,tablespace_name from user_tables where table_Name='T_TEST_NOLOG01';

TABLE_NAME LOGGING TABLESPACE_NAME

------------------------------ ------- ------------------------------

T_TEST_NOLOG01 NO TEST

RMAN> backup incremental level 0 database;

SQL> insert /*+append*/ into t_test_nolog01 select * from dba_Objects;

72143 rows inserted

SQL> commit;

Commit complete

RMAN> backup incremental level 1 database;

關閉資料庫後刪除test表空間的資料檔案,然後進行恢復。

RMAN> shutdown immediate;

資料庫已關閉

資料庫已卸裝

Oracle 例項已關閉

RMAN> startup mount;

RMAN> restore datafile 6;

通道 ORA_DISK_1: 將資料檔案 00006 還原到 F:APPORADATAXIAOYUTEST01.DBF

通道 ORA_DISK_1: 正在讀取備份片段 E:RECOVERY_AREAXIAOYUBACKUPSET2012_0

1_MF_NNND0_TAG20120808T225808_824ZN1Q0_.BKP

通道 ORA_DISK_1: 段控制程式碼 = E:RECOVERY_AREAXIAOYUBACKUPSET2012_08_08O1_

D0_TAG20120808T225808_824ZN1Q0_.BKP 標記 = TAG20120808T225808

通道 ORA_DISK_1: 已還原備份片段 1

通道 ORA_DISK_1: 還原完成, 用時: 00:00:15

完成 restore 08-8 -12

RMAN> recover datafile 6;

最後開啟資料庫檢視t_test_nolog01表的資料沒有丟失。

SQL> select count(*) from t_test_nolog01;

COUNT(*)

----------

72143

從上面的測試中,發現瞭如果使用了nologging方式插入資料,由於redo不記錄資料庫的改變到重做日誌記錄中,此時如果資料檔案意外丟失,而利用之前的備份集進行恢復時,這部分資料是無法還原的,也提醒我們生產庫中不要一味的講究效率,nologging方式插入需要用到特定的環境中,例如大批次插入資料非歸檔環境,資料可以輕易抽取生成、中間表等,nologging是可以為系統提高效率的。

不過第二個測試中我們發現了增量備份的好處,差異增量備份備份上級或同級以來發生變化的資料塊,正好可以把nologging那部分的資料塊備份起來用於正常恢復。我們需要非常清楚對資料庫的相應的操作,不然有時候一味的求取效率,往往失去了資料的穩定性和安全性。

[@more@]

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

相關文章