ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 还是Oracle的数据库破坏试验,RMAN针对不同文件的丢失进行恢复

还是Oracle的数据库破坏试验,RMAN针对不同文件的丢失进行恢复

原创 Linux操作系统 作者:louloueva 时间:2009-01-17 21:25:33 0 删除 编辑

昨天费了好大劲,接触了一下数据库的全备份和数据库完全丢失后恢复
数据库完全丢失的恢复,对于个人来说可能上来就接触是稍微困难了些
所以其中有些步骤只是按照文档执行过去,并不是特别清楚其作用
对于备份恢复还需要慢慢深入、具体地去练习
今天就来分别对各种数据库文件的损坏进行针对性的恢复

昨天最后练习了全数据库的数据文件丢失的恢复
来细化一下吧,某个具体的数据文件丢失后的恢复
把example,user,ts_test这几个删掉
startup,但到了mount,转换到open时,报错
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/home/oracle/oracle/oradata/test/users01.dbf'
需要user01.dbf,user表空间的数据文件
进行数据文件的单独还原
RMAN> restore datafile 4;
还原后进行恢复
RMAN> recover datafile 4;
后面又陆续提示另外两个表空间丢失,依照上面方法进行还原并恢复
都恢复后,用alter database open命令打开数据库,一切正常
在此处并未用resetlogs参数,因为恢复过程属于完全恢复
recover所用的redo log或归档日志都没有丢失
数据可以恢复到数据库最新的SCN状态下
另外,因为全数据库备份后并未有任何改动
而redo log也都存在,并足矣进行recover操作
所以,即便删除现有归档日志也能进行完全恢复
是否需要归档日志,完全、不完全的选择
这些会因为归档、备份的日期,redo log的有效性等因素有所差别

下面是针对某个表空间进行还原恢复,比如users表空间
RMAN>restore tablespace users;
RMAN>recover tablespace users;
但要注意,如果还原恢复一个open状态下的表空间
要先将表空间offline后才能还原,不然报错
ORA-19573: cannot obtain exclusive enqueue for datafile 4
offline表空间的SQL是ALTER TABLESPACE users OFFLINE [IMMEDIATE]
RMAN>SQL 'ALTER TABLESPACE users OFFLINE IMMEDIATE';
进行还原恢复后,要记得用ALTER TABLESPACE users ONLINE将表空间联机
RMAN>SQL 'ALTER TABLESPACE users ONLINE';

对于redo log,RMAN在线备份策略中并不会保存redo log
所以,当redo log丢失后,无法进行完全恢复
进行不完全恢复时,Oracle会自动建立redo log
具体来实践一下步骤,先删除test库的所有redo log
此时数据库只能到mount为止,无法open
这种情况可以直接在SqlPlus执行recover database until cancel
SQL>recover database until cancel;
然后执行
SQL>alter database open resetlogs;
这样就可以了
不过,不同场合会有不同的恢复步骤,上面说的这个是最复杂的
是丢失全部redo log(主要是current redo log当前的)的恢复方式
如果丢失的不是current的,可以通过clear丢失的redo log进行重建
比如,我的test库current日志为group1的,我把组2的删除(redo02.log)
然后执行(此时数据库为mount)
SQL>ALTER DATABASE CLEAR LOGFILE
  2 '/home/oracle/oracle/oradata/test/redo02.log';
这里要提一点,如果目标日志是未归档的,需要在clear后加上unarchived
clear目标日志后,就可以open了(不用resetlogs)
以前总结redo log的时候,谈过如何往一个日志组添加成员
利用这个功能再来实践一下,添加成员命令如下
SQL> ALTER DATABASE ADD LOGFILE MEMBER
  2  '/home/oracle/oracle/oradata/test/redo02b.log' TO GROUP 2;
将各组都添加一个新成员,此时组2是current,删除其中一个组员
switch几次,让新加入的成员全部生效(可通过v$logfile查看)
通过v$log查看current日志是组2,删除其中一个成员
关闭再打开数据库,可以open
但查看alert日志,可以看到有错误信息
Errors in file /home/oracle/oracle/admin/test/bdump/test_lgwr_14179.trc:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/home/oracle/oracle/oradata/test/redo02.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Sat Jan 17 16:27:47 2009
Errors in file /home/oracle/oracle/admin/test/bdump/test_lgwr_14179.trc:
ORA-00321: log 2 of thread 1, cannot update log file header
ORA-00312: online log 2 thread 1: '/home/oracle/oracle/oradata/test/redo02.log'
Sat Jan 17 16:27:47 2009
Errors in file /home/oracle/oracle/admin/test/bdump/test_lgwr_14179.trc:
ORA-00313: open failed for members of log group 2 of thread 1
Thread 1 opened at log sequence 6
  Current log# 2 seq# 6 mem# 1: /home/oracle/oracle/oradata/test/redo02b.log
Successful open of redo thread 1
看到最后Oracle用组中的另一个成员来打开数据库
然后,我们可以通过先drop再add的方式恢复丢失日志
SQL>alter database drop logfile member
  2 '/home/oracle/oracle/oradata/test/redo02.log';
SQL>alter database add logfile member
  2 '/home/oracle/oracle/oradata/test/redo02.log' to group 2;

最后再说个命令参数
以resetlogs方式open数据库后,在重新备份数据库时
可加delete all input,如下
backup database plus archivelog delete all input;
作用是删除备份过的归档日志,以节省硬盘空间
以后恢复前要先还原这些备份过的归档日志
控制、参数文件昨天已经提及过了,今天就不再细说

每次弄恢复就要花费不少时间……
一来是自己有些地方不太熟悉
二来查询英文文档也颇费时间
还有恢复命令不像其它命令执行那么快
每次都要等一等,我的test库很小,有时一次命令还要运行好几分钟呢
这要是实际生产项目的大数据库……
唉~恢复果然是个费劲的事情

经过最近一段时间的学习和实践
对Oracle的一些基本备份恢复方法有了不少认识
本来今天想试试用RMAN的catalog,放到明天吧
今天的学习结束~看动画去~^_^~

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/556359/viewspace-541329/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-01-02

  • 博文量
    134
  • 访问量
    117154