SQL> select group#,status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- ---------------------------------------------------------------------- 3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG 2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG 1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG 1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD.LOG 2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02_ADD.LOG 3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03_ADD.LOG 已选择6行。 --使用360强力删除REDO01_ADD.LOG文件,以模拟日志成员损坏 --多次切换日志,以使刚删除的redo文件处于invalid状态 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 ...... SQL> select group#,status from v$log; GROUP# STATUS ---------- ---------------- 1 CURRENT 2 ACTIVE 3 ACTIVE SQL> select group#,status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- ---------------------------------------------------------------------- 3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG 2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG 1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG 1 INVALID F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD.LOG 2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02_ADD.LOG 3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03_ADD.LOG 已选择6行。 --如果为为当前日志组成员,则不能被删除,这时需要切换日志,才能够删除成员 SQL> alter database drop logfile member 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD.LOG'; alter database drop logfile member 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD.LOG' * 第 1 行出现错误: ORA-01609: 日志 1 是线程 1 的当前日志 - 无法删除成员 ORA-00312: 联机日志 1 线程 1: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG' ORA-00312: 联机日志 1 线程 1: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD.LOG' SQL> alter system switch logfile; 系统已更改。 SQL> select group#,status from v$log; GROUP# STATUS ---------- ---------------- 1 ACTIVE 2 CURRENT 3 ACTIVE SQL> alter database drop logfile member 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD.LOG'; 数据库已更改。 --添加日志组成员 SQL> alter database add logfile member 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD_NEW.LOG' to group 1; 数据库已更改。 SQL> select group#,status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- ---------------------------------------------------------------------- 3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG 2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG 1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG 1 INVALID F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD_NEW.LOG 2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02_ADD.LOG 3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03_ADD.LOG 已选择6行。
注意,新增加的日志组成员状态也为invalid。
inactive日志组的所有日志成员全部损坏
1)open状态下inactive日志组的所有日志成员全部损坏
2)关闭状态下inactive日志组的所有日志成员全部损坏
1)
2)
--在数据库关闭状态下使用rm删除日志组1的所有日志成员(redo01.log,redo01_add.log),来模拟日志组1的所有日志成员全部损坏。 --启动数据库。 SQL> startup ORACLE instance started. Total System Global Area 528482304 bytes Fixed Size 1220360 bytes Variable Size 159383800 bytes Database Buffers 360710144 bytes Redo Buffers 7168000 bytes Database mounted. ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: '/oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01.log' ORA-00312: online log 1 thread 1: '/oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01_add.log' SQL> select group#,status,archived from v$log; GROUP# STATUS ARC ---------- ---------------- --- 1 INACTIVE YES --inactive 3 INACTIVE YES 2 CURRENT NO --添加新日志组,将原来的日志组1删除。 SQL> alter database add logfile 2 ('/oracle/10g/oracle/product/10.2.0/oradata/oralife/redo04.log','/oracle/10g/oracle/product/10.2.0/oradata/oralife/redo04_add.log') 3 size 50M; Database altered. SQL> alter database drop logfile group 1; Database altered. SQL> alter database open; Database altered.current状态日志组的所有日志成员损坏
1)open状态下当前日志组成员全部出现介质失败,后台进程lgwr将事务写入该日志组时,oracle实例会终止。
2)关闭状态下当前日志组全部成员出现介质失败,oracle实例不能打开;因为数据库关闭后,数据文件与控制文件处于完全一致状态,只需使用recover database until cancel执行基于取消的不完全恢复,然后使用resetlogs打开数据库,这时oracle会自动重新建立日志组所有成员。使用resetlogs打开数据库后,应该备份数据文件与控制文件。
2)关闭状态
SQL> select group#,status from v$log;
GROUP# STATUS
---------- --------------------------------
1 INACTIVE
2 INACTIVE
3 CURRENT
SQL> select group#,status,member from v$logfile;
GROUP# STATUS MEMBER
---------- -------------- -------------------------------------------------------------------------------
3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG
1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01_ADD_NEW.LOG
2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02_ADD.LOG
3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03_ADD.LOG
已选择6行。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
--手动删除日志组3的所有日志成员(REDO03.LOG,REDO03_ADD.LOG),启动数据库。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 293604228 bytes
Database Buffers 310378496 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 3 (用于线程 1) 的成员
ORA-00312: 联机日志 3 线程 1: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG'
ORA-00312: 联机日志 3 线程 1: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03_ADD.LOG'
--基于取消的恢复。
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
--使用resetlogs打开数据库,应该备份数据库。
SQL> alter database open resetlogs;
数据库已更改。1)open状态
SQL> select group#,status,archived from v$log;
GROUP# STATUS ARC
---------- ---------------- ---
1 CURRENT NO
2 INACTIVE YES
3 INACTIVE YES
SQL> create table t (text varchar(1000));
表已创建。
SQL> insert into t values('ajax');
已创建 1 行。
SQL> commit;
提交完成。
--切换日志,使其归档。
SQL> alter system switch logfile;
系统已更改。
SQL> select group#,status,archived from v$log;
GROUP# STATUS ARC
---------- ---------------- ---
1 ACTIVE YES
2 CURRENT NO
3 INACTIVE YES
SQL> insert into t values('java');
已创建 1 行。
SQL> commit;
提交完成。
--切换日志,使其归档。
SQL> alter system switch logfile;
系统已更改。
SQL> select group#,status,archived from v$log;
GROUP# STATUS ARC
---------- ---------------- ---
1 ACTIVE YES
2 ACTIVE YES
3 CURRENT NO
--删除日志组3的所有日志成员。
SQL> insert into t values('spring');
insert into t values('spring')
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束
--重新连接例程,启动到mount状态。
SQL> conn / as sysdba
已连接到空闲例程。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 201329540 bytes
Database Buffers 402653184 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
--拷贝所有的数据文件备份到目标目录。
cp..
--基于取消的不完全恢复,先恢复归档日志,然后再cancel。
SQL> recover database until cancel
ORA-00279: 更改 %s (在 %s 生成) 对于线程 %s 是必需的
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 %s (在 %s 生成) 对于线程 %s 是必需的
ORA-00279: 更改 %s (在 %s 生成) 对于线程 %s 是必需的
ORA-00308: 无法打开归档日志 '%s'
SQL> recover database until cancel
ORA-00279: 更改 %s (在 %s 生成) 对于线程 %s 是必需的
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> desc t
ERROR:
ORA-04043: 对象 %s 不存在
SQL> select group#,status,archived from v$log;
GROUP# STATUS ARC
---------- ---------------- ---
1 ACTIVE YES
3 CURRENT NO
2 ACTIVE YES
--使用resetlogs打开数据库,备份数据库
SQL> alter database open resetlogs;
数据库已更改。
SQL> desc t;
名称 是否为空? 类型
----------------------------------------------------------- -------- ----------------
TEXT VARCHAR2(1000)
SQL> select * from t;
TEXT
--------------------------------------------------------------------------------------
ajax
java数据还在,归档日志已经恢复。
如果没有数据库的全备份,也可以使用_allow_resetlogs_corruption隐藏参数进行恢复(不推荐)。