基于用户管理的备份与恢复—恢复重做日志

日志组的某个日志成员损坏
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)

SQL> set linesize 110 SQL> column member for a70 SQL> select group#,status from v$log; GROUP# STATUS ---------- ---------------- 1 INACTIVE 2 CURRENT 3 INACTIVE SQL> select group#,status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- ---------------------------------------------------------------------- 1 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01.log 3 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo03.log 2 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo02.log 1 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01_add.log 2 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo02_add.log 3 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo03_add.log 6 rows selected. --使用rm删除日志组1的所有成员(redo01.log,redo01_add.log) SQL> rm ... --切换日志组为current状态 SQL> alter system switch logfile; System altered. SQL> select group#,status from v$log; GROUP# STATUS ---------- ---------------- 1 CURRENT 2 ACTIVE 3 INACTIVE SQL> select group#,status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- ---------------------------------------------------------------------- 1 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01.log 3 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo03.log 2 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo02.log 1 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01_add.log 2 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo02_add.log 3 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo03_add.log 6 rows selected. --继续切换日志组,归档日志组1 SQL> alter system switch logfile; System altered. SQL> select group#,status from v$log; GROUP# STATUS ---------- ---------------- 1 ACTIVE 2 ACTIVE 3 CURRENT SQL> select group#,status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- ---------------------------------------------------------------------- 1 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01.log 3 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo03.log 2 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo02.log 1 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01_add.log 2 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo02_add.log 3 /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo03_add.log 6 rows selected. --查看告警日志文件出现以下信息,意思是找不到重做日志文件,无法对其进行归档,后台进程lgwr处于等待状态 Wed Aug 3 21:02:30 2011 Thread 1 advanced to log sequence 35 Current log# 3 seq# 35 mem# 0: /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo03.log Current log# 3 seq# 35 mem# 1: /oracle/10g/oracle/product/10.2.0/oradata/oralife/redo03_add.log Wed Aug 3 21:02:30 2011 Errors in file /oracle/10g/oracle/product/10.2.0/db_1/admin/oralife/bdump/oralife_arc1_3514.trc: 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_add.log' ORA-27037: unable to obtain file status Linux Error: 2: No such file or directory Additional information: 3 ORA-00312: online log 1 thread 1: '/oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01.log' ORA-27037: unable to obtain file status Linux Error: 2: No such file or directory Additional information: 3 Wed Aug 3 21:02:30 2011 ARC1: Failed to archive thread 1 sequence 34 (0) ARCH: Archival stopped, error occurred. Will continue retrying Wed Aug 3 21:02:30 2011 ORACLE Instance oralife - Archival Error Wed Aug 3 21:02:30 2011 ORA-16038: log 1 sequence# 34 cannot be archived 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' Wed Aug 3 21:02:30 2011 Errors in file /oracle/10g/oracle/product/10.2.0/db_1/admin/oralife/bdump/oralife_arc1_3514.trc: --清除该日志组以使后台进程lgwr继续工作 SQL> alter database clear unarchived logfile group 1; --以上命令会重建日志组1的所有成员,此时后台进程可以继续工作。 --因为日志组内容没有被归档,导致过去的数据文件备份不能使用,应该备份数据库。 --查看告警日志文件出现: Wed Aug 3 22:04:44 2011 WARNING! CLEARING REDO LOG WHICH HAS NOT BEEN ARCHIVED. BACKUPS TAKEN BEFORE 08/03/2011 22:02:45 (CHANGE 874003) CANNOT BE USED FOR RECOVERY. --继续切换日志组,日志组1进入不了current状态,原因是日志组1无法归档,这里所有的操作都是在open状态下。 日志信息: Wed Aug 3 22:24:55 2011 Errors in file /oracle/10g/oracle/product/10.2.0/db_1/admin/oralife/bdump/oralife_arc1_4803.trc: ORA-00314: log 1 of thread 1, expected sequence# 56 doesn't match 0 ORA-00312: online log 1 thread 1: '/oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01_add.log' ORA-00314: log 1 of thread 1, expected sequence# 56 doesn't match 0 ORA-00312: online log 1 thread 1: '/oracle/10g/oracle/product/10.2.0/oradata/oralife/redo01.log' Wed Aug 3 22:24:55 2011 ARC1: Failed to archive thread 1 sequence 56 (0) --无奈shutdown数据库,然后startup 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-00314: log 1 of thread 1, expected sequence# doesn't match 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> alter database clear unarchived logfile group 1; Database altered. SQL> alter database open; Database altered. --此时可以任意切换日志组 SQL> alter system switch logfile;注意:alter database clear unarchived logfile group n之后要备份数据库。

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隐藏参数进行恢复(不推荐)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值