對歸檔模式下CLEAR 未歸檔日誌後恢復資料庫的一點看法

space6212發表於2019-07-20

在資料上看到過如果不是當前聯機日誌出問題,且如果日誌未歸檔,可以用clear unarchived 命令清空歸檔日誌,達到開啟資料庫的目的。
然而,很少資料提到clear後應該做一些什麼後續工作來保證資料的安全。


根據恢復的理論,要想完全恢復資料庫,從備份某一個檔案後的日誌不能出現斷點,否則將恢復不成功。下面用試驗來證明clear不做備份的嚴重後果:

試驗步驟:
(1)關閉資料庫,備份某資料檔案,把自動歸檔關閉
(2)往資料庫中insert一批資料,檢視當前日誌,記錄下來,並切換日誌,此時可使insert資料時對於的日誌是未歸檔
(3)關閉資料庫,破壞步驟2中未被歸檔的日誌
(4)startup mount、clear unarchived logfile
(5)開啟資料庫後重新往資料庫中插入一批記錄,並切換幾次日誌,最後將所有日誌手工歸檔
(6)關閉資料庫,還原檔案
(7)recover檔案


SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。

-----備份資料檔案-----


SQL> startup
ORACLE 例程已經啟動。

Total System Global Area 135339388 bytes
Fixed Size 454012 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> archive log list
資料庫日誌模式 存檔模式
自動存檔 禁用
存檔終點 D:oracleoradataarc
最早的概要日誌序列 11
下一個存檔日誌序列 11
當前日誌序列 11
SQL> conn suk/suk
已連線。
SQL> create table a as select * from dba_users;

表已建立。

SQL> select * from a;
行將被截掉


USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE EXP
------------------------------ ---------- ------------------------------ -------------------------------- ---------- ---
SYS 0 DAD94A5D1B6405DC OPEN
SYSTEM 5 3EC1CAE40BBBC728 OPEN
DBSNMP 19 E066D214D5421CCC OPEN
SUK 61 DD5C4BF6D7A511DE OPEN

SQL> conn / as sysdba
已連線。
SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
4 1 11 10485760 1 NO CURRENT 1391287 12-12月-05
5 1 0 10485760 1 YES UNUSED 1391143 12-12月-05
6 1 0 10485760 1 YES UNUSED 1391024 12-12月-05

SQL> alter system switch logfile;

系統已更改。

SQL> archive log list
資料庫日誌模式 存檔模式
自動存檔 禁用
存檔終點 D:oracleoradataarc
最早的概要日誌序列 11
下一個存檔日誌序列 11
當前日誌序列 12
SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
4 1 11 10485760 1 NO ACTIVE 1391287 12-12月-05
5 1 12 10485760 1 NO CURRENT 1408674 12-12月-05
6 1 0 10485760 1 YES UNUSED 1391024 12-12月-05

SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。

------------刪除redo04----------------

SQL> startup
ORACLE 例程已經啟動。

Total System Global Area 135339388 bytes
Fixed Size 454012 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 4 (執行緒 1) 的成員
ORA-00312: 聯機日誌 4 執行緒 1: 'D:ORACLEORADATAORACLE9IREDO04.ORA'


SQL> alter database clear unarchived logfile group 4;

資料庫已更改。

SQL> alter database open;

資料庫已更改。

SQL> conn suk/suk
已連線。

SQL> create table b as select * from user_users;

表已建立。

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
4 1 0 10485760 1 YES UNUSED 1391287 12-12月-05
5 1 12 10485760 1 NO CURRENT 1408674 12-12月-05
6 1 0 10485760 1 YES UNUSED 1391024 12-12月-05

SQL> alter system switch logfile;

系統已更改。


SQL> alter system switch logfile;

系統已更改。

SQL> alter system switch logfile;

系統已更改。

SQL> conn / as sysdba
已連線。
SQL> archive log all;
已存檔一個日誌。
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。

----------將最初備份的檔案複製回來------------------

SQL> startup
ORACLE 例程已經啟動。

Total System Global Area 135339388 bytes
Fixed Size 454012 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
ORA-01113: 檔案 11 需要介質恢復
ORA-01110: 資料檔案 11: 'D:ORACLEORADATAORACLE9ISUK_UNIF01.DBF'


SQL> recover datafile 11;
ORA-00279: 更改 1407900 (在 12/12/2005 15:24:08 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:ORACLEORADATAARCARC00011.001
ORA-00280: 更改 1407900 對於執行緒 1 是按序列 # 11 進行的


指定日誌: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 無法開啟存檔日誌 'D:ORACLEORADATAARCARC00011.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。


ORA-00308: 無法開啟存檔日誌 'D:ORACLEORADATAARCARC00011.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。


從過程可以看出,資料檔案恢復失敗。也就是說,如果對日誌執行clear操作,則clear前的備份是沒有意義的(只能做不完全恢復到clear前的狀態)
因此,我們做完clear操作後,應立刻對資料庫做一次全備。

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

相關文章