重建控制檔案時,與資料檔案相關的Checkpoint資訊來自何處

jss001發表於2009-02-08

背景:

關閉資料庫,啟動資料庫到Mount狀態,查詢此時資料檔案頭,控制檔案中記錄的各資料檔案的Checkpoint;

再次關閉資料庫,備份所有資料檔案;

然後開啟資料庫,執行各種操作,如:強制執行檢查點;

再次關閉資料庫,用備份的資料檔案恢復現在的資料檔案,重建控制檔案(重建控制檔案分為兩種情況

1. Noresetlogs ——> 檢視此時的資料檔案頭,控制檔案記錄的各資料檔案的Checkpoint)

2. Resetlogs ——> 檢視此時的資料檔案頭,控制檔案記錄的各資料檔案的Checkpoint)

與之前的Checkpoint比較。

問題:

1. Noresetlogs 重建控制檔案,此時控制檔案中記錄的Checkpoint資訊由何處得來?

2. Resetlogs 重建控制檔案,此時控制檔案中記錄的Checkpoint資訊由何處得來?

實驗步驟:

Resetlogs的情況:

SQL> shutdown immediate

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> startup mount

ORACLE 例程已經啟動。

Total System Global Area 101784276 bytes

Fixed Size 453332 bytes

Variable Size 75497472 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

資料庫裝載完畢。

SQL> select checkpoint_change#

2 from v$datafile;

CHECKPOINT_CHANGE#

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

306219

306219

306219

306219

SQL> select checkpoint_change#

2 from v$datafile_header;

CHECKPOINT_CHANGE#

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

306219

306219

306219

306219

SQL> shutdown immediate

ORA-01109: 資料庫未開啟

已經解除安裝資料庫。

ORACLE 例程已經關閉。

——備份所有資料檔案

SQL> startup

ORACLE 例程已經啟動。

Total System Global Area 101784276 bytes

Fixed Size 453332 bytes

Variable Size 75497472 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

資料庫裝載完畢。

資料庫已經開啟。

SQL> alter system checkpoint;

系統已更改。

SQL> alter system checkpoint;

系統已更改。

SQL> alter system checkpoint;

系統已更改。

SQL> alter system checkpoint;

系統已更改。

SQL> shutdown immediate

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

——用備份的資料檔案代替當前的資料檔案。

SQL> startup nomount

ORACLE 例程已經啟動。

Total System Global Area 101784276 bytes

Fixed Size 453332 bytes

Variable Size 75497472 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

——重建控制檔案Resetlogs情況:

SQL> @d:ora90adminiceudumpcontrol.sql

控制檔案已建立

SQL> select checkpoint_change#

2 from v$datafile;

CHECKPOINT_CHANGE#

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

306219

306219

306219

306219

SQL> select checkpoint_change#

2 from v$datafile_header;

CHECKPOINT_CHANGE#

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

306219

306219

306219

306219

SQL> alter database open;

alter database open

*

ERROR 位於第 1 行:

ORA-01589: ??????????? RESETLOGS ? NORESETLOGS ??

SQL> alter database open resetlogs;

資料庫已更改。

——由於此時控制檔案中記錄的各資料檔案的Checkpoint和各資料檔案頭記錄的Checkpoint一致,

——且各資料檔案的Checkpoint和其Stop Checkpoint一致,故可以直接開啟資料庫,不用Recover。

——只不過Open的時候要Resetlogs而已。

SQL> alter system checkpoint;

系統已更改。

SQL> alter system checkpoint;

系統已更改。

SQL> alter system checkpoint;

系統已更改。

Noresetlogs的情況:

SQL> shutdown immediate

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> startup mount

ORACLE 例程已經啟動。

Total System Global Area 101784276 bytes

Fixed Size 453332 bytes

Variable Size 75497472 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

資料庫裝載完畢。

SQL> select checkpoint_change#

2 from v$datafile;

CHECKPOINT_CHANGE#

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

306340

306340

306340

306340

SQL> select checkpoint_change#

2 from v$datafile_header;

CHECKPOINT_CHANGE#

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

306340

306340

306340

306340

SQL> alter database backup controlfile to trace;

——備份控制檔案

資料庫已更改。

SQL> shutdown immediate

ORA-01109: 資料庫未開啟

已經解除安裝資料庫。

ORACLE 例程已經關閉。

——備份所有的資料檔案

SQL> startup

ORACLE 例程已經啟動。

Total System Global Area 101784276 bytes

Fixed Size 453332 bytes

Variable Size 75497472 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

資料庫裝載完畢。

資料庫已經開啟。

SQL> alter system checkpoint;

系統已更改。

SQL> alter system checkpoint;

系統已更改。

SQL> alter system checkpoint;

系統已更改。

SQL> shutdown immediate

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

——用備份的資料檔案恢復當前的所有資料檔案

SQL> startup nomount

ORACLE 例程已經啟動。

Total System Global Area 101784276 bytes

Fixed Size 453332 bytes

Variable Size 75497472 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

SQL> @d:ora90adminiceudumpcontrol.sql

——重建控制檔案,用Noresetlogs

控制檔案已建立

SQL> select checkpoint_change#

2 from v$datafile;

CHECKPOINT_CHANGE#

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

306454

306454

306454

306454

——當前控制檔案中記錄的各資料檔案的Checkpoint。

SQL> select checkpoint_change#

2 from v$datafile_header;

CHECKPOINT_CHANGE#

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

306340

306340

306340

306340

——當前各資料檔案頭記錄的各自的Checkpoint,與備份時的Checkpoint相等.

——但是與當前控制檔案記錄的Checkpoint不等。

SQL> alter session set nls_language=american;

Session altered.

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01113: file 1 needs media recovery

ORA-01110: data file 1: 'D:ORA90ORADATAICESYSTEM01.DBF'

——控制檔案記錄的各資料檔案的Checkpoint與各資料檔案頭記錄的Checkpoint不等,故要恢復。

SQL> recove datafile 1;

SP2-0734: unknown command beginning "recove dat..." - rest of line ignored.

SQL> recover datafile 1;

Media recovery complete.

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01113: file 2 needs media recovery

ORA-01110: data file 2: 'D:ORA90ORADATAICEUNDOTBS01.DBF'

SQL> recover database;

Media recovery complete.

SQL> alter database open;

Database altered.

結論:

1. Noresetlogs重建控制檔案時,控制檔案中的各資料檔案的Checkpoint來自Online logs中的Current log頭。(可以用Alter session set events ‘immediate trace name redohdr level 3’;來驗證)

2. Resetlogs重建控制檔案時,控制檔案中的各資料檔案的Checkpoint來自各資料檔案頭。

其實這也比較好理解,不Resetlogs的話,當前Online log中肯定是含有最新的Checkpoint,一旦Resetlogs,說明當前Online log 不可用,也就只好從各資料檔案頭來讀取相應的Checkpoint了。

[@more@]

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

相關文章