关闭

重建控制文件时,与数据文件相关的Checkpoint信息来自何处

1015人阅读 评论(0) 收藏 举报

背景:

关闭数据库,启动数据库到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了。

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:395371次
    • 积分:5041
    • 等级:
    • 排名:第5537名
    • 原创:81篇
    • 转载:108篇
    • 译文:0篇
    • 评论:104条
    最新评论