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

背景:

关闭数据库,启动数据库到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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值