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