《datafile間的 scn 不一致,且已重建control file》

摘要:《datafile間的 scn 不一致,且已重建control file》

2009/6/28

今天單純想試試如何從已備份的archive log中 recover database,

所以才有上一篇從已備份的檔案 restore archive log。

但是在操作過程,不慎將中間的某一個archive log刪除,備份檔案也沒有這個archive log。

按照之前不完全恢復的步驟,運用 alter database backup controlfile to trace 所產生的control file,

重新建立後 recover database until cancel using backup controlfile;

alter database open resetlogs;

從這開始發現了與之前練習時不一樣的情形;

先前在練習時 data file之間的scn都是一致的,也就是說只要重建control file,

再recover、open resetlogs,就會參考data file header的scn將database open;

這次因為無法open 所以也不知道v$data_file_header的scn是多少;

但是透過v$datafile的scn中,得知其中一個data file的scn不一致,所以recover時,

會持續出現需要recover的檔案。

到此為止,只求資料庫能開啟即可,以下就是將資料庫開啟的過程,請參考。

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

首先使用隱藏參數 _allow_resetlogs_corruption=true。

照字面上的意思,指的應該是強制resetlogs的意思。

參考 google 的一些文章,使用這參數有可能會有許多ORA-600的錯誤,這次練習沒有遇到,下次有機會研究看看。


SQL> alter system set "_ALLOW_RESETLOGS_CORRUPTION"=TRUE scope=spfile;
已更改系統.
SQL> shutdown immediate
ORA-01109: 尚未開啟此一資料庫

資料庫已卸載.
已關閉 ORACLE 執行處理.
SQL> startup nomount
已啟動 ORACLE 執行處理.
Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> show parameter _allow
NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
_allow_resetlogs_corruption          boolean
TRUE
SQL> recover database until cancel using backup controlfile;
ORA-01507: ???????

SQL> alter session set nls_language=american;
Session altered.
SQL> recover database until cancel using backup controlfile;
ORA-01507: database not mounted

SQL> alter database mount;
Database altered.
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 565211 generated at 06/28/2009 18:10:58 needed for thread 1
ORA-00289: suggestion : C:\ORACLE\ARCHIVEDLOG\ARC00004.001
ORA-00280: change 565211 for thread 1 is in sequence #4

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log 'C:\ORACLE\ARCHIVEDLOG\ARC00004.001'
ORA-27041: unable to open file
OSD-04002: 5L*k6}1R@I.W
O/S-Error: (OS 2) (t2N'd$#(l+|)w*:@I.W!C

ORA-00308: cannot open archived log 'C:\ORACLE\ARCHIVEDLOG\ARC00004.001'
ORA-27041: unable to open file
OSD-04002: 5L*k6}1R@I.W
O/S-Error: (OS 2) (t2N'd$#(l+|)w*:@I.W!C

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\ORACLEB\SYSTEM01.DBF'

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01092: ORACLE 執行處理已終止. 強制切斷連線

SQL> conn sys/change_on_install as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫已掛載.
ORA-01113: 需要對檔案 1 進行媒體恢復作業
ORA-01110: 資料檔 1: 'C:\ORACLE\ORADATA\ORACLEB\SYSTEM01.DBF'

SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
            565213
            565213
            565213
            565213
            565213
            565213
            565213
            565213
            565213
            565213
            565213
已選取 11 個資料列.
SQL> alter database open resetlogs;
alter database open resetlogs
*
 ERROR 在行 1:
ORA-01139: RESETLOGS 選項只有在不完整的資料庫復原作業之後才有效

SQL> @c:\resetctl.sql
CREATE CONTROLFILE REUSE DATABASE "ORACLEA" RESETLOGS  ARCHIVELOG
*
 ERROR 在行 1:
ORA-01503: CREATE CONTROLFILE 失敗
ORA-01100: 資料庫已被掛上

SQL> shutdown immediate
ORA-01109: 尚未開啟此一資料庫

資料庫已卸載.
已關閉 ORACLE 執行處理.
SQL> startup nomount
已啟動 ORACLE 執行處理.
Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> @c:\resetctl.sql
已建立控制檔.
SQL> alter database open resetlogs;
alter database open resetlogs
*
 ERROR 在行 1:
ORA-01092: ORACLE 執行處理已終止. 強制切斷連線

SQL> alter system set "_ALLOW_RESETLOGS_CORRUPTION"=false scope=spfile;
alter system set "_ALLOW_RESETLOGS_CORRUPTION"=false scope=spfile
*
 ERROR 在行 1:
ORA-03114: 未與 ORACLE 相連

SQL> conn sys/change_on_install as sysdbha
SP2-0306: 選項無效
用法: CONN[ECT] [logon] [AS {SYSDBA|SYSOPER}]
其中   ::= [/][@] | /
SQL> conn sys/change_on_install as sysdba
連線至閒置的執行處理.
SQL> startup
已啟動 ORACLE 執行處理.
Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫已掛載.
ORA-01113: 需要對檔案 1 進行媒體恢復作業
ORA-01110: 資料檔 1: 'C:\ORACLE\ORADATA\ORACLEB\SYSTEM01.DBF'

SQL> recover database until cancel using backup controlfile;
ORA-00279: 必須變更 565215 建立於 06/28/2009 19:16:05 上 (對於繫線 1 而言)
ORA-00289: 建議 : C:\ORACLE\ARCHIVEDLOG\ARC00001.001
ORA-00280: 變更 565215 (屬於繫線 1) 是在序列 #1

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

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

ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將有如下的錯誤
ORA-01194: 檔案 1 需要更完整的復原才能夠一致
ORA-01110: 資料檔 1: 'C:\ORACLE\ORADATA\ORACLEB\SYSTEM01.DBF'

SQL> alter database open resetlogs;
alter database open resetlogs
*
 ERROR 在行 1:
ORA-01092: ORACLE 執行處理已終止. 強制切斷連線

SQL> conn sys/change_on_install as sysdba
連線至閒置的執行處理.
SQL> startup force;
已啟動 ORACLE 執行處理.
Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫已掛載.
ORA-01113: 需要對檔案 1 進行媒體恢復作業
ORA-01110: 資料檔 1: 'C:\ORACLE\ORADATA\ORACLEB\SYSTEM01.DBF'

SQL> alter database open resetlogs;
alter database open resetlogs
*
 ERROR 在行 1:
ORA-01139: RESETLOGS 選項只有在不完整的資料庫復原作業之後才有效

SQL> !oerr ora 1152
SP2-0734: 未知的命令, 以 "!oerr ora ..." 為開始 - 忽略其他命令行.
SQL> oerr ora 1152
SP2-0734: 未知的命令, 以 "oerr ora 1..." 為開始 - 忽略其他命令行.
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
            565217
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
            565217
            565217
            565217
            565217
            565217
            565217
            565217
            565217
            565217
            565217
            565217
已選取 11 個資料列.
SQL> alter database open resetlogs;
alter database open resetlogs
*
 ERROR 在行 1:
ORA-01139: RESETLOGS 選項只有在不完整的資料庫復原作業之後才有效
SQL> alter database open;
alter database open
*
 ERROR 在行 1:
ORA-01113: 需要對檔案 1 進行媒體恢復作業
ORA-01110: 資料檔 1: 'C:\ORACLE\ORADATA\ORACLEB\SYSTEM01.DBF'

SQL> recover data file 1
ORA-00905: 遺漏關鍵字

SQL> recover datafile 1;
媒體恢復執行完成.
SQL> alter database open resetlogs;
alter database open resetlogs
*
 ERROR 在行 1:
ORA-01139: RESETLOGS 選項只有在不完整的資料庫復原作業之後才有效

SQL> alter database open;
alter database open
*
 ERROR 在行 1:
ORA-01113: 需要對檔案 2 進行媒體恢復作業
ORA-01110: 資料檔 2: 'C:\ORACLE\ORADATA\ORACLEB\UNDOTBS01.DBF'

SQL> recover database;
媒體恢復執行完成.
SQL> alter database open;
已更改資料庫.
SQL> select count(*) from ting.tingobjects;
select count(*) from ting.tingobjects
                          *
 ERROR 在行 1:
ORA-00376: 無法於此時讀取檔案 9
ORA-01110: 資料檔 9: 'C:\ORACLE\ORADATA\ORACLEB\USERS01.DBF'

SQL> alter tablespace users online;
已更改表格空間.

SQL> select count(*) from ting.tingobjects;
  COUNT(*)
----------
     29523
SQL>