在资料上看到过如果不是当前联机日志出问题,且如果日志未归档,可以用clear unarchived 命令清空归档日志,达到打开数据库的目的。
然而,很少资料提到clear后应该做一些什么后续工作来保证数据的安全。
根据恢复的理论,要想完全恢复数据库,从备份某一个文件后的日志不能出现断点,否则将恢复不成功。下面用试验来证明clear不做备份的严重后果:
试验步骤:
(1)关闭数据库,备份某数据文件,把自动归档关闭
(2)往数据库中insert一批数据,查看当前日志,记录下来,并切换日志,此时可使insert数据时对于的日志是未归档
(3)关闭数据库,破坏步骤2中未被归档的日志
(4)startup mount、clear unarchived logfile
(5)打开数据库后重新往数据库中插入一批记录,并切换几次日志,最后将所有日志手工归档
(6)关闭数据库,还原文件
(7)recover文件
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
-----备份数据文件-----
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 135339388 bytes
Fixed Size 454012 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式 存档模式
自动存档 禁用
存档终点 D:oracleoradataarc
最早的概要日志序列 11
下一个存档日志序列 11
当前日志序列 11
SQL> conn suk/suk
已连接。
SQL> create table a as select * from dba_users;
表已创建。
SQL> select * from a;
行将被截掉
USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE EXP
------------------------------ ---------- ------------------------------ -------------------------------- ---------- ---
SYS 0 DAD94A5D1B6405DC OPEN
SYSTEM 5 3EC1CAE40BBBC728 OPEN
DBSNMP 19 E066D214D5421CCC OPEN
SUK 61 DD5C4BF6D7A511DE OPEN
SQL> conn / as sysdba
已连接。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
4 1 11 10485760 1 NO CURRENT 1391287 12-12月-05
5 1 0 10485760 1 YES UNUSED 1391143 12-12月-05
6 1 0 10485760 1 YES UNUSED 1391024 12-12月-05
SQL> alter system switch logfile;
系统已更改。
SQL> archive log list
数据库日志模式 存档模式
自动存档 禁用
存档终点 D:oracleoradataarc
最早的概要日志序列 11
下一个存档日志序列 11
当前日志序列 12
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
4 1 11 10485760 1 NO ACTIVE 1391287 12-12月-05
5 1 12 10485760 1 NO CURRENT 1408674 12-12月-05
6 1 0 10485760 1 YES UNUSED 1391024 12-12月-05
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
------------删除redo04----------------
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 135339388 bytes
Fixed Size 454012 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 4 (线程 1) 的成员
ORA-00312: 联机日志 4 线程 1: 'D:ORACLEORADATAORACLE9IREDO04.ORA'
SQL> alter database clear unarchived logfile group 4;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> conn suk/suk
已连接。
SQL> create table b as select * from user_users;
表已创建。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
4 1 0 10485760 1 YES UNUSED 1391287 12-12月-05
5 1 12 10485760 1 NO CURRENT 1408674 12-12月-05
6 1 0 10485760 1 YES UNUSED 1391024 12-12月-05
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> conn / as sysdba
已连接。
SQL> archive log all;
已存档一个日志。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
----------将最初备份的文件拷贝回来------------------
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 135339388 bytes
Fixed Size 454012 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01113: 文件 11 需要介质恢复
ORA-01110: 数据文件 11: 'D:ORACLEORADATAORACLE9ISUK_UNIF01.DBF'
SQL> recover datafile 11;
ORA-00279: 更改 1407900 (在 12/12/2005 15:24:08 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLEORADATAARCARC00011.001
ORA-00280: 更改 1407900 对于线程 1 是按序列 # 11 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开存档日志 'D:ORACLEORADATAARCARC00011.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-00308: 无法打开存档日志 'D:ORACLEORADATAARCARC00011.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
从过程可以看出,数据文件恢复失败。也就是说,如果对日志执行clear操作,则clear前的备份是没有意义的(只能做不完全恢复到clear前的状态)
因此,我们做完clear操作后,应立刻对数据库做一次全备。