看教程的时候在数据库开启的时候手动删除数据库所有的重做日志,按照书上的方法 alter system switch logfile; 强制日志切换,归档当前的重做日志(前提是数据库开启了自动归档,如果没有开启自动归档,执行这条语句就不会 归档当前重做日志) shutdown immediate 关闭数据库 startup 走到这一步的时候发现无法开启数据库,但是报的错误与书上的并不一样,书上的是找不到某个文件,而我的报错是 SQL> startup ORACLE instance started. Total System Global Area 417546240 bytes Fixed Size 2213936 bytes Variable Size 327157712 bytes Database Buffers 79691776 bytes Redo Buffers 8482816 bytes Database mounted. ORA-03113: end-of-file on communication channel Process ID: 12588 Session ID: 125 Serial number: 5 没有管,继续依照书上操作 recover database until cancel; 利用归档日志进行恢复 报错: SQL> recover database until cancel; ERROR: ORA-03114: not connected to ORACLE 提示没有连接到数据库,于是准备在去关闭数据库 SQL> shutdown abort; ORA-24324: service handle not initialized ORA-01041: internal error. hostdef extension doesn't exist 百度了一下,说法很多 例如重启服务,关闭所有的sqlplus窗口重新开一个等等 重启服务 service oracle restart 照这个网上另外一个教程 SQL> startup mount; ORACLE instance started. Total System Global Area 417546240 bytes Fixed Size 2213936 bytes Variable Size 327157712 bytes Database Buffers 79691776 bytes Redo Buffers 8482816 bytes Database mounted. 启动到mount状态 SQL> select member from v$logfile; MEMBER -------------------------------------------------------------------------------- /oracle/app/oradata/ORCL/redo03.log /oracle/app/oradata/ORCL/redo02.log /oracle/app/oradata/ORCL/redo01.log SQL> alter database clear unarchived logfile group 1; alter database clear unarchived logfile group 1 * ERROR at line 1: ORA-00313: open failed for members of log group 2 of thread 1 ORA-00312: online log 2 thread 1: '/oracle/app/oradata/ORCL/redo02.log' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3 alter database clear unarchived logfile group 1; 重组日志,但失败了,后来想应该直接删除重做日志的 SQL> alter database clear logfile group 1; alter database clear logfile group 1 * ERROR at line 1: ORA-00350: log 1 of instance ORCL (thread 1) needs to be archived ORA-00312: online log 1 thread 1: '/oracle/app/oradata/ORCL/redo01.log' 提示的是redo01.log并没有被归档,所以还是用前一条语句吧 根据ORA-00313: open failed for members of log group 2 of thread 1 于是执行语句 SQL> alter database clear unarchived logfile group 2; Database altered. 执行成功,原来是顺序的原因(百度了并没有找到相关的解释), SQL> alter database clear unarchived logfile group 1; Database altered. SQL> alter database clear unarchived logfile group 3; Database altered. SQL> alter database open; Database altered. SQL> select status from v$instance; STATUS ------------------------------------ OPEN SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 3 Next log sequence to archive 9 Current log sequence 9 发现数据库的日志并不是从1开始的,说明这个只是根据还原了之前的重做日志 ****************************这部分是后加的,百度上有人建议这样做保证数据库完整的检查与分析,但是感觉自己并不明白其中的道理********************************************** 把数据库down掉 SQL>shutdown immediate 在init.ora中加入如下参数 _allow_resetlogs_corruption=TRUE 重新启动数据库,利用until cancel恢复 SQL>recover database until cancel; Cancel 如果出错,不再理会,发出 SQL>alter database open resetlogs; 数据库被打开后,马上执行一个full export shutdown数据库,去掉_all_resetlogs_corrupt参数 重建库 import并完成恢复 建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE; **************************************************************************** 之后百度了很多内容 如果数据库启用了自动归档,数据正常运行,重做文件损坏的话, 如果不是当前活动的重做日志,直接用 clear就可以还原 alter database clear logfile group N; 如果是当前活动的重做日志,但是在被删除前已经被自动归档了则也同样可以使用alter database clear logfile group N;来重组日志 如果是当前活动的重做日志,虽然没有被自动归档,但是由于数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,使用alter database clear unarchived logfile group N;来进行重组日志 以上几种情况其实还原之后是可以保证数据库的一致性的 如果当前重做日志中有活动的事务,数据库需要媒体恢复,日志组需要用来同步: 有两种办法 一是通过alter database clear unarchived logfile group N;强制进行日志重组的方法,但是这样会造成数据库的不一致,但是不会丢失正在较多的数据(主要是未写入数据文件的已提交或未提交数据。)。这个方法实在数据库没有备份的情况下的方法 二是我的书中的方法,如果提前有过备份的话,通过不完全的恢复,来保持数据库的一致性 继续之前的操作 在知道重做日志被删之后,需要alter system switch logfile; 来归档当前的重做日志 然后关闭数据库 SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 417546240 bytes Fixed Size 2213936 bytes Variable Size 327157712 bytes Database Buffers 79691776 bytes Redo Buffers 8482816 bytes Database mounted. 拷贝有效的数据库的全备份,并不完全恢复数据库 可以采用until cnacel恢复 recover database until cancel 先选择auto,尽量恢复可以利用的归档日志,然后重新 recover database until cancel 这次输入cancel,完成不完全恢复,也就是说恢复两次。 SQL> recover database until cancel; Media recovery complete. 利用alter database open resetlogs打开数据库 SQL> alter database open resetlogs; Database altered. 这样就会重新生成3个重做日志文件, SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 1 Next log sequence to archive 1 Current log sequence 1 可以看到,数据库的 日志序号是从1开始的,证明重新生成了重做日志 这种恢复方法可以保证数据库的一致性,即数据库不会产生断点,但是会丢失处理中的事务。
oracle重做日志 恢复数据,oracle数据库在删掉全部重做日志后如何进行恢复
最新推荐文章于 2024-02-07 11:16:48 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)