使用append+nologging引起恢復故障實驗
Oracle的nologging屬性是非常容易被濫用的。在我們之前的文章中,探討過append+nologging對於Redo Log的影響。從文章的結論看:如果我們使用append配合nologging,的確是可以減少Redo Log的生成的。
但是,這樣做真的有好處嗎?
希望減少Redo Log生成的思路無非是:Redo Log生成量少了,這樣在LGWR寫入的量就少了,從而帶來的物理IO和日誌切換動作就少了。但是,隨著帶來的問題是:日誌少了真的沒有問題嗎?
Oracle Redo Log是資料庫的重要物件,原始提出Redo Log的目的在於“日誌在先,資料恢復”。從宏觀上看,Redo Log是保證資料庫事務一致性的手段。但更重要的是,Redo Log是資料庫內部一致性、資料庫完全恢復和高可用性元件(DG、OGG)的重要技術基礎。
Redo Log是描述資料塊變化的記錄資訊,其中包括邏輯變化和物理變化。本篇就透過實驗來確定Append+Nologging給備份還原帶來的問題。
1、環境準備和備份
我們選擇Oracle 11gR2進行測試。為了保證一致性,我們首先進行一次熱備份動作。
RMAN> backup database plus archivelog delete all input;
Starting backup at 10-DEC-13
current log archived
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=38 device type=DISK
(篇幅原因,有省略……)
Starting Control File and SPFILE Autobackup at 10-DEC-13
piece handle=/u01/flash_recovery_area/WILSON/autobackup/2013_12_10/o1_mf_s_833787521_9bdo43ol_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 10-DEC-13
此時,配合歸檔模式,我們是可以實現完全恢復的。
RMAN> list backup;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
130 Full 1.31G DISK 00:01:55 10-DEC-13
BP Key: 130 Status: AVAILABLE Compressed: NO Tag: TAG20131210T073642
Piece Name: /u01/flash_recovery_area/WILSON/backupset/2013_12_10/o1_mf_nnndf_TAG20131210T073642_9bdo0djj_.bkp
List of Datafiles in backup set 130
(篇幅原因,有省略……)
SPFILE Included: Modification time: 10-DEC-13
SPFILE db_unique_name: WILSON
Control File Included: Ckp SCN: 5260073 Ckp time: 10-DEC-13
2、一次append+nologging動作
我們建立一張資料表T,將其nologging屬性設定為Y。
SQL> create table t as select * from dba_objects where 1=0;
Table created
SQL> alter table t nologging;
Table altered
使用insert append插入資料。
SQL> insert /*+append*/ into t select * from dba_objects;
72768 rows inserted
SQL> commit;
Commit complete
3、啟動恢復過程
如果此時發生系統故障,資料丟失,需要進行資料恢復動作。試圖使用RMAN來進行完全恢復。
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 849530880 bytes
Fixed Size 1339824 bytes
Variable Size 511708752 bytes
Database Buffers 331350016 bytes
Redo Buffers 5132288 bytes
Database mounted.
啟用RMAN恢復過程。
--Restore過程
RMAN> restore database;
Starting restore at 10-DEC-13
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=18 device type=DISK
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to
(篇幅原因,有省略……)
channel ORA_DISK_1: piece handle=/u01/flash_recovery_area/WILSON/backupset/2013_12_10/o1_mf_nnndf_TAG20131210T073642_9bdo0djj_.bkp tag=TAG20131210T073642
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:07:05
Finished restore at 10-DEC-13
--Recover應用Redo Log
RMAN> recover database;
Starting recover at 10-DEC-13
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:12
Finished recover at 10-DEC-13
RMAN>
恢復過程沒有明顯的錯誤標誌,恢復似乎是成功了。之後開啟資料庫。
RMAN> alter database open;
database opened
4、壞塊出現
回到sqlplus環境,檢查資料表。
SQL> conn scott/tiger@wilson;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
SQL> select count(*) from t;
select count(*) from t
ORA-01578: ORACLE 資料塊損壞 (檔案號 4, 塊號 3611)
ORA-01110: 資料檔案 4: '/u01/oradata/WILSON/datafile/o1_mf_users_805nxydh_.dbf'
ORA-26040: 資料塊是使用 NOLOGGING 選項載入的
報錯壞塊!
這個過程也是可以理解的。Redo Log是描述資料變化全過程的過程化資料。完全恢復是建立在重演Redo Log過程,以達到最終資料一致的目的。Nologging透過額外的手段減少了redo log的生成,必然有一部分重要的變化資料是缺失的。那麼,nologging部分還原出來之後,就難以保證資料一致性。
至此,我們可以看出nologging的問題,就是影響資料的恢復過程連續性。讓我們設想一種場景:如果在生產環境中使用nologging append方法之後,沒有發現後續的問題,也沒有進行全備份動作。一旦發生故障,需要進行資料恢復時就遇到麻煩。不僅僅是該資料表可能有問題,其他資料表引用的該資料表關係也會受到影響。
更進一步,如果我們配置了Data Guard、OGG這種嚴重依賴Redo Log Apply的技術元件,我們更可能會導致源資料庫正確、但是備份端出現壞塊。
5、處理方法
Nologging是一個綜合性的過程。在Oracle資料庫中,資料庫層面、表空間和資料表三個層次均有nologging配置屬性。三者之前的配置關係和作用是相互的。
下面我們透過資料庫層面的nologging,開啟強制日誌(force logging)功能,一定程度上可以避免由於nologging帶來的資料恢復問題。注意:由於條件的限制,筆者使用了另外的資料庫,但是不影響結果。
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 110
Next log sequence to archive 112
Current log sequence 112
SQL> alter database open;
Database altered.
SQL> alter database force logging;
Database altered.
SQL> select log_mode, force_logging from v$database;
LOG_MODE FORCE_LOGGING
------------ -------------
ARCHIVELOG YES
備份資料過程省略,建立一個全新的全備份。之後建立資料表。
SQL> create table t nologging as select * from dba_objects where 1=0;
Table created
SQL> alter table t move tablespace users;
Table altered
SQL> select logging from dba_tables where owner='SYS' and table_name='T';
LOGGING
-------
NO
SQL> insert /*+append*/ into t select * from dba_objects;
75607 rows inserted
SQL> commit;
Commit complete
SQL> select count(*) from t;
COUNT(*)
----------
75607
啟動還原過程,從全備份開始,前推Redo Log進行完全恢復。
--start到mount狀態省略
RMAN> restore database;
Starting restore at 11-DEC-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oradata/ORA11G/datafile/o1_mf_system_92t6zl2m_.dbf
channel ORA_DISK_1: restoring datafile 00002 to /u01/app/oradata/ORA11G/datafile/o1_mf_sysaux_92t6zl5k_.dbf
channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oradata/ORA11G/datafile/o1_mf_undotbs1_92t6zl6d_.dbf
channel ORA_DISK_1: restoring datafile 00004 to /u01/app/oradata/ORA11G/datafile/o1_mf_users_92t6zl83_.dbf
channel ORA_DISK_1: restoring datafile 00005 to /u01/app/oradata/ORA11G/datafile/o1_mf_example_92t74b1f_.dbf
channel ORA_DISK_1: restoring datafile 00006 to /u01/app/oradata/ORA11G/datafile/o1_mf_trcatbl_96mlzz0j_.dbf
channel ORA_DISK_1: restoring datafile 00007 to /u01/app/oradata/ORA11G/datafile/o1_mf_test1_971dp6kb_.dbf
channel ORA_DISK_1: restoring datafile 00008 to /u01/app/oradata/ORA11G/datafile/o1_mf_test2_971dqkh0_.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/fast_recovery_area/ORA11G/backupset/2013_12_11/o1_mf_nnndf_TAG20131211T091503_9bhh4qdp_.bkp
channel ORA_DISK_1: piece handle=/u01/app/fast_recovery_area/ORA11G/backupset/2013_12_11/o1_mf_nnndf_TAG20131211T091503_9bhh4qdp_.bkp tag=TAG20131211T091503
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:01:15
Finished restore at 11-DEC-13
RMAN> recover database;
Starting recover at 11-DEC-13
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:05
Finished recover at 11-DEC-13
RMAN> alter database open;
database opened
啟動資料庫之後,檢查資料表狀態。
SQL> select count(*) from t;
COUNT(*)
----------
75607
SQL> select logging from dba_tables where owner='SYS' and table_name='T';
LOGGING
-------
NO
從實驗結果可知,利用force logging,可以一定程度上避免由於資料表nologging引起的壞塊問題。
6、結論與反思
在這個案例中,我們看到了日常工作中常用nologging的潛在問題。在實際工作中,特別是大資料、資料倉儲系統應用,很多運維人員甚至開發人員都喜歡使用nologging來處理資料。這樣的現象是由於對Oracle Redo Log重要性沒有明確認識。一旦進行恢復,就容易大禍臨頭。
筆者認為:nologging的使用是有條件和場合的。如果我們是在準備資料階段,關閉歸檔、使用nologging都是允許的手段。一旦上線,切記要主要避免使用這樣的操作方式。也許在效能上有一些優勢,但是帶來的風險不是我們可以承擔的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-1063011/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle實驗記錄 (恢復-完全恢復)Oracle
- oracle實驗記錄 (恢復-rman恢復)Oracle
- oracle實驗記錄 (恢復-使用resetlogs open前備份恢復)Oracle
- Oracle恢復實驗(一)Oracle
- Oracle恢復實驗(二)Oracle
- Oracle恢復實驗(三)Oracle
- Oracle恢復實驗(四)Oracle
- postgreSQL 恢復至故障點 精準恢復SQL
- oracle實驗記錄 (恢復-不完全恢復)Oracle
- 3.6遷移故障恢復
- ORACLE 常見故障恢復Oracle
- 【Oracle 恢復表空間】 實驗Oracle
- oracle實驗記錄 (恢復-redo)Oracle
- SQLServer異常故障恢復(二)SQLServer
- Ceph monitor故障恢復探討
- Oracle 不同故障的恢復方案Oracle
- MySQL資料庫故障恢復MySql資料庫
- 用Windows XP故障恢復控制檯恢復系統(轉)Windows
- 表空間TSPITR恢復-實驗
- oracle media recovery介質恢復實驗-Oracle
- oracle實驗記錄(恢復-checkpoint cnt)Oracle
- oracle實驗記錄 (可恢復session)OracleSession
- oracle實驗記錄 (恢復-rman基於控制檔案的恢復)Oracle
- Oracle資料庫故障恢復資料庫系統故障恢復效能優化指南大全Oracle資料庫優化
- 【北亞資料恢復】硬碟壞道故障如何恢復資料?資料恢復硬碟
- DM7使用DMRAMN對多次故障恢復後使用不同資料庫的歸檔進行恢復資料庫
- oracle實驗記錄 (恢復-恢復未備份的資料檔案)Oracle
- 【11g 庫異地恢復】實驗
- 【12c 庫異機恢復】實驗
- oracle實驗記錄 (恢復-rman catalog)Oracle
- 聯機日誌損壞恢復實驗
- oracle 資料庫全庫恢復實驗Oracle資料庫
- Oracle常規恢復的實驗測試Oracle
- oracle實驗記錄 (恢復-rman保留策略)Oracle
- 解析ESX SERVER故障資料恢復方法Server資料恢復
- redis cluster 叢集故障恢復操作思路Redis
- 「分散式技術專題」故障恢復分散式
- MongoDB副本集故障恢復機制概述MongoDB