Nologging對恢復的影響(二)

space6212發表於2019-03-13
Nologging在提高效能的同時,會給恢復帶來一定的影響。下面透過兩個案例來說明它是怎麼影響恢復的。

第二個案例要驗證在先備份資料檔案,再發生nologging操作的情況下,是否可以完全恢復資料。
[@more@]1. 建表

CREATE TABLE SUK.PLOGGING
( A NUMBER,
B NUMBER
)
PARTITION BY LIST (A)
(PARTITION P1 VALUES (1) TABLESPACE SUK ,
PARTITION P2 VALUES (2) TABLESPACE SUK ) ;

CREATE TABLE SUK.PNOLOGGING
( C NUMBER,
D NUMBER
)
PARTITION BY LIST (C)
(PARTITION P1 VALUES (1) TABLESPACE SUK ,
PARTITION P2 VALUES (2) TABLESPACE SUK ) ;

2. 用普通的方式寫入資料
SQL> insert into plogging select mod(rownum,2)+1,mod(rownum,2)+1 from dba_objects;

10500 rows inserted

SQL> insert into pnologging select mod(rownum,2)+1,mod(rownum,2)+1 from dba_objects;

10500 rows inserted

SQL> commit;

Commit complete


3. 此時備份表所在的表空間


RMAN> backup tablespace suk;

啟動 backup 於 21-11月-10
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00007 name=E:ORACLEPRODUCT10.2.0ORADATASUK.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 21-11月-10
通道 ORA_DISK_1: 已完成段 1 於 21-11月-10
段控制程式碼=E:ORACLEPRODUCT10.2.0DB_1DATABASEDLTJFGA_1_1 標記=TAG20101121T2224
10 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:07
完成 backup 於 21-11月-10

4. 繼續往表寫資料,其他一個用nologging方式寫

SQL> insert into plogging select 1,1 from dba_tables;

963 rows inserted

SQL> insert /*+ append */ into pnologging select 1,1 from dba_tables;

963 rows inserted

SQL> commit;

Commit complete

5. 再次用普通方式往表寫資料
SQL> insert into plogging select mod(rownum,2)+1,mod(rownum,2)+1 from dba_objects;

10500 rows inserted

SQL> insert into pnologging select mod(rownum,2)+1,mod(rownum,2)+1 from dba_objects;

10500 rows inserted

SQL> commit;

Commit complete

SQL> delete from test where rownum<=99;

99 rows deleted

SQL> commit;

Commit complete

SQL> select count(1) from test;

COUNT(1)
----------
8901

SQL> select count(1) from plogging;

COUNT(1)
----------
21963

SQL> select count(1) from pnologging;

COUNT(1)
----------
21963

6. 此時模擬資料庫還原恢復

RMAN> restore tablespace suk;

啟動 restore 於 21-11月-10
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=156 devtype=DISK

通道 ORA_DISK_1: 正在開始恢復資料檔案備份集
通道 ORA_DISK_1: 正在指定從備份集恢復的資料檔案
正將資料檔案00007恢復到E:ORACLEPRODUCT10.2.0ORADATASUK.DBF
通道 ORA_DISK_1: 正在讀取備份段 E:ORACLEPRODUCT10.2.0DB_1DATABASEDLTJFGA_
1_1
通道 ORA_DISK_1: 已恢復備份段 1
段控制程式碼 = E:ORACLEPRODUCT10.2.0DB_1DATABASEDLTJFGA_1_1 標記 = TAG20101121T
222410
通道 ORA_DISK_1: 恢復完成, 用時: 00:00:08
完成 restore 於 21-11月-10

RMAN> recover tablespace suk;

啟動 recover 於 21-11月-10
使用通道 ORA_DISK_1

正在開始介質的恢復
介質恢復完成, 用時: 00:00:02

完成 recover 於 21-11月-10

RMAN> alter database open;


7. 驗證資料

SQL> select count(1) from test;

COUNT(1)
----------
8901

SQL> select count(1) from plogging;

COUNT(1)
----------
21963

SQL> select count(1) from pnologging;

select count(1) from pnologging

ORA-01578: ORACLE 資料塊損壞 (檔案號 7, 塊號 3186)
ORA-01110: 資料檔案 7: 'E:ORACLEPRODUCT10.2.0ORADATASUK.DBF'
ORA-26040: 資料塊是使用 NOLOGGING 選項載入的


SQL> select count(1) from pnologging partition(p1);

select count(1) from pnologging partition(p1)

ORA-01578: ORACLE 資料塊損壞 (檔案號 7, 塊號 3186)
ORA-01110: 資料檔案 7: 'E:ORACLEPRODUCT10.2.0ORADATASUK.DBF'
ORA-26040: 資料塊是使用 NOLOGGING 選項載入的

SQL> select count(1) from pnologging partition(p2);

COUNT(1)
----------
10500


可以,沒有發生過nologging操作的表都可以完全恢復,發生過nologging的表的資料不能完全恢復。

結論:

如果備份後再發生nologging操作,則

1. 產生nologging操作的表不能被完全恢復。
2. nologging操作只會影響與之發生聯絡的表,不會影響其他表。
3. 如果表是非分割槽表,則會影響全表。如果nologging影響的表是分割槽表,nologging操作只會影響受該操作影響的資料對應的分割槽,而不影響其他分割槽。
例如T有兩個分割槽P1和P2,在備份後對T發生了nologging操作,但隻影響了P1的資料,則恢復時,可以正常訪問P2的資料,而訪問P1時會報錯。
4. 即使nologging操作後的操作都是logging方式,也不能恢復後面的資料 。
5. nologging雖然可以提高效能,但是可能會造成資料無法恢復,因此使用這一特性時要非常謹慎。一般在如下情況下才建議使用:
1) 臨時表
2) 中間表
3) 資料可輕易重新生成的表
4) 建立索引

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

相關文章