免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1519 | 回复: 0
打印 上一主题 下一主题

[系统管理] Oracle数据库联机日志文件丢失处理方法(1) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-16 11:41 |只看该作者 |倒序浏览

Oracle备份恢复中,redo的恢复相对来说还是比较简单的,只要保证每组的成员不止一个,出现问题的几率就相当小,即使出了问题我们也可按照不同的方法将他们恢复,所以如果碰到日志文件损坏,完全不必紧张!按照下面的方法来做,基本上都能搞定!

试验一:用命令清空日志组方法
1、  查看原来表中数据
SQL> conn test/test
Connected.
SQL> select * from test;
       TEL
----------
         1
         2
         3
2、插入新数据
SQL> insert into test values(4);
1 row created.
SQL> commit;
Commit complete.
SQL>
3、  正常关闭数据库
4、  利用os command删除所有redo文件
5、  启动数据库
SQL> startup
ORACLE instance started.
Total System Global Area  353862792 bytes
Fixed Size                   730248 bytes
Variable Size             285212672 bytes
Database Buffers           67108864 bytes
Redo Buffers                 811008 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'
6、  查看当前日志状态
SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
         1          1          2  104857600          1 YES INACTIVE
       487837 01-9月 -05
         2          1          4  104857600          1 NO  CURRENT
       487955 01-9月 -05
         3          1          3  104857600          1 YES INACTIVE
       487839 01-9月 -05
看来redo01.log不是当前日志,对于这类非当前日志可以直接clear,系统会重新自动生成一个redo文件
7、SQL> alter database clear logfile group 1;
Database altered.
7、  继续启动db
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log'
8、  看来redo也得恢复,但是redo02是当前redo,直接clear是不行的
SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
ERROR at line 1:
ORA-00350: log 2 of thread 1 needs to be archived
ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log'
9、  按照oracle的某些做法也是不行的
SQL> alter database clear unarchived logfile group 2 unrecoverable datafile;
alter database clear unarchived logfile group 2 unrecoverable datafile
*
ERROR at line 1:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log'
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
10、              尝试从其他冷被分cp过来一个,再作clear,还是不行
SQL> host cp /T3/ORACLE/oradata2/ORA9/redo02.log /T3/ORACLE/oradata/ORA9/
SQL> alter database clear unarchived logfile group 2 unrecoverable datafile;
alter database clear unarchived logfile group 2 unrecoverable datafile
*
ERROR at line 1:
ORA-00322: log 2 of thread 1 is not current copy
ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log'
SQL>
11、              但是对于非当前日志就都可以,下面看看redo03
SQL>  alter database clear logfile group 3;
Database altered.
结论:
如果数据库是正常shutdown,非当前日志都可以直接clear来重新生成,而且不丢失数据,因为正常关闭db,数据已经写入dbf文件了。唯独当前日志不可以,当前日志必须用其他方法恢复,不管是不是正常关闭,
方法二:用cancel模式恢复数据库
前面的出错提示,步骤都一样,唯独恢复的方法不一样
SQL> startup
ORACLE instance started.
Total System Global Area  353862792 bytes
Fixed Size                   730248 bytes
Variable Size             285212672 bytes
Database Buffers           67108864 bytes
Redo Buffers                 811008 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'
看看丢失了哪些redo
SQL> host ls /T3/ORACLE/oradarta/ORA9/redo*
/T3/ORACLE/oradarta/ORA9/redo*: No such file or directory
看来redo都丢了
直接recover
SQL> recover database until cancel;
Media recovery complete.
这个时候redo还没有生成
SQL> host ls /T3/ORACLE/oradata/ORA9/redo*
/T3/ORACLE/oradata/ORA9/redo*: No such file or directory
启动数据库
SQL> alter database open ;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL>  alter database open resetlogs;
Database altered.
(注意,这里必须用resetlogs,否则会错误的
SQL> alter database open noresetlogs;
alter database open noresetlogs
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'
SQL>
Resetlogs其实就是根据控制文件让系统自动重新生成redo,如果noresetlog的话,就不会重新生成redo,缺少了文件,db自然无法启动)
SQL>  host ls /T3/ORACLE/oradata/ORA9/redo*
/T3/ORACLE/oradata/ORA9/redo01.log  /T3/ORACLE/oradata/ORA9/redo02.log  /T3/ORACLE/oradata/ORA9/redo03.log
SQL>
检验
SQL> select * from test.test;
       TEL
----------
         1
         2
         3
         4
SQL>
数据一点儿都没有丢失
结论:
如果数据库是正常关闭的,用recover database until cancel可以轻松恢复或者说重新建立所有的redo,不再区分是否是当前日志,而且由于正常关闭,不会丢失任何数据,唯一可能丢失的情况就是如果日志还没有归档
这种恢复方法 由于要resetlogs,所以在恢复完成后,日志清零,以前的备份不再起作用,所以建议立即备份
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /T3/ORACLE/arch
Oldest online log sequence     0
Next log sequence to archive   1
Current log sequence           1
SQL>

实验三:通过重新生成控制文件来恢复redo
前面的都一样,只是处理方法不一样
SQL> startup
ORACLE instance started.
Total System Global Area  353862792 bytes
Fixed Size                   730248 bytes
Variable Size             285212672 bytes
Database Buffers           67108864 bytes
Redo Buffers                 811008 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'
SQL> alter database backup controlfile to trace;
Database altered.
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL>
2、  修改一下刚才生成的那个文件
CREATE CONTROLFILE REUSE DATABASE "ORA9"  RESETLOGS ARCHIVELOG
--  SET STANDBY TO MAXIMIZE PERFORMANCE
    MAXLOGFILES 50
    MAXLOGMEMBERS 5
    MAXDATAFILES 100
    MAXINSTANCES 1
    MAXLOGHISTORY 226
LOGFILE
  GROUP 1 '/T3/ORACLE/oradata/ORA9/redo01.log'  SIZE 100M,
  GROUP 2 '/T3/ORACLE/oradata/ORA9/redo02.log'  SIZE 100M,
  GROUP 3 '/T3/ORACLE/oradata/ORA9/redo03.log'  SIZE 100M
-- STANDBY LOGFILE
DATAFILE
  '/T3/ORACLE/oradata/ORA9/system01.dbf',
  '/T3/ORACLE/oradata/ORA9/undotbs01.dbf',
  '/T3/ORACLE/oradata/ORA9/cwmlite01.dbf',
  '/T3/ORACLE/oradata/ORA9/drsys01.dbf',
  '/T3/ORACLE/oradata/ORA9/example01.dbf',
  '/T3/ORACLE/oradata/ORA9/indx01.dbf',
  '/T3/ORACLE/oradata/ORA9/odm01.dbf',
  '/T3/ORACLE/oradata/ORA9/tools01.dbf',
  '/T3/ORACLE/oradata/ORA9/users01.dbf',
  '/T3/ORACLE/oradata/ORA9/xdb01.dbf',
  '/T3/ORACLE/oradata/ORA9/test01.dbf'
CHARACTER SET ZHS16GBK
;
另存为一个脚本,运行他
SQL> @clone.sql
Control file created.
SQL> alter database open resetlogs;
Database altered.
SQL>
搞定……………
结论:这种方法的关键是重新创建控制文件,后面的步骤和前面的道理一样的
前面的三种方法都是假设db是正常关闭的,数据已经写入数据库文件中,所以不会由数据存在redo种,所以clear的话也不会有数据丢失




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6798/showart_465414.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP