在启动数据库的时候,open阶段总是可能出现各种各样的问题,比如让人胆战心惊的错误。ORA-01113: file 1 needs media recovery
自己留意了一下,其实还是有蛮多的场景会出现这个问题,有些细节可能没有注意到就会出现这个问题,
比如我们重建控制文件的时候。
?在重建控制文件之前做了shutdown abort的操作。
Total System Global Area? 314572800 bytes
?Fixed Size? ? ? ? ? ? ? ? ? 1261564 bytes
?Variable Size? ? ? ? ? ? 163577860 bytes
?Database Buffers? ? ? ? ? 142606336 bytes
?Redo Buffers? ? ? ? ? ? ? ? 7127040 bytes
?SQL> CREATE CONTROLFILE REUSE DATABASE "TEST10G" NORESETLOGS? NOARCHIVELOG
? .....
? 26? ? '/u02/oracle/oradata/data02.dbf'
? 27? CHARACTER SET US7ASCII
? 28? ;
Control file created.
尝试启动数据库的时候就会抛出这个错误。
SQL> alter database open;
?alter database open
?*
?ERROR at line 1:
ORA-01113: file 1 needs media recovery
?ORA-01110: data file 1: '/u02/oracle/oradata/TEST10G/disk5/system01.dbf'
其实这个时候简单分析一下就会明白,上次是shutdown abort的方式,则对应的检查点信息无法写入数据文件,在open阶段smon会做这个校验。
?开始在后台做数据的前滚,然后应用redo日志的数据,对某些操作做相应的回滚。
?从下面的地方可以看出 last_change#没有任何值,表明上次断电重启后检查点信息没有写入。
SQL> select file#,checkpoint_change#,last_change# from v$datafile;
? ? FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
?---------- ------------------ ------------
? ? ? ? ? 1? ? ? ? ? ? 858940
? ? ? ? ? 2? ? ? ? ? ? 858940
? ? ? ? ? 3? ? ? ? ? ? 858940
? ? ? ? ? 4? ? ? ? ? ? 858940
? ? ? ? ? 5? ? ? ? ? ? 858940
SQL> select file#,checkpoint_change# from v$datafile_header;
? ? FILE# CHECKPOINT_CHANGE#
?---------- ------------------
? ? ? ? ? 1? ? ? ? ? ? 858940
? ? ? ? ? 2? ? ? ? ? ? 858940
? ? ? ? ? 3? ? ? ? ? ? 858940
? ? ? ? ? 4? ? ? ? ? ? 858940
? ? ? ? ? 5? ? ? ? ? ? 858940
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
?------------------
? ? ? ? ? ? 858939
这个时候尝试恢复数据库,再次观察,则相应的检查点信息就做了校正。
SQL> recover database;
?Media recovery complete.
?SQL>? select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
?------------------
? ? ? ? ? ? 858939
?SQL>? select file#,checkpoint_change#,last_change# from v$datafile;
? ? FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
?---------- ------------------ ------------
? ? ? ? ? 1? ? ? ? ? ? 859017? ? ? 859017
? ? ? ? ? 2? ? ? ? ? ? 859017? ? ? 859017
? ? ? ? ? 3? ? ? ? ? ? 859017? ? ? 859017
? ? ? ? ? 4? ? ? ? ? ? 859017? ? ? 859017
? ? ? ? ? 5? ? ? ? ? ? 859017? ? ? 859017
SQL> alter database open;
Database altered.
数据库启动之后,last_change#的值又回归零。等待稍后的检查点写入。
SQL>? select file#,checkpoint_change#,last_change# from v$datafile;
? ? FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
?---------- ------------------ ------------
? ? ? ? ? 1? ? ? ? ? ? 879019
? ? ? ? ? 2? ? ? ? ? ? 879019
? ? ? ? ? 3? ? ? ? ? ? 879019
? ? ? ? ? 4? ? ? ? ? ? 879019
? ? ? ? ? 5? ? ? ? ? ? 879019
SQL>? select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
?------------------
? ? ? ? ? ? 879019
其实这个过程中,恢复的基准就是检查点,也就是SCN.
当然在有些操作依赖于归档模式,介质恢复还是依赖于一些归档文件的。
?像在非归档模式尝试下面的操作就不可行。
SQL> alter tablespace data offline immediate;
?alter tablespace data offline immediate
?*
?ERROR at line 1:
?ORA-01145: offline immediate disallowed unless media recovery enabled
?SQL> alter tablespace data begin backup;
?alter tablespace data begin backup
?*
?ERROR at line 1:
?ORA-01123: cannot start online backup; media recovery not enabled
?这个时候还是启用归档。
SQL> shut immediate
?Database closed.
?Database dismounted.
?ORACLE instance shut down.
?SQL> startup mount
?ORACLE instance started.
Total System Global Area? 314572800 bytes
?Fixed Size? ? ? ? ? ? ? ? ? 1261564 bytes
?Variable Size? ? ? ? ? ? 163577860 bytes
?Database Buffers? ? ? ? ? 142606336 bytes
?Redo Buffers? ? ? ? ? ? ? ? 7127040 bytes
?Database mounted.
?SQL> alter database archivelog ;
Database altered.
SQL> alter database open;
Database altered.
如果在归档模式中,使用热备份,需要声明begin backup,为了能够