Oracle数据库在线重做日志被删除的几种恢复方法

Oracle数据库的在线重做日志中包含了数据库中所有数据的操作记录,我们可以利用重做日志做很多的操作,例如日志挖掘。

有时候,因为种种原因,我们的在线日志被人误删除或者意外损坏掉,我们应该如何进行恢复呢,其实很简单,看下面内容:

我们通过删除在线日志模拟日志被误删除的情况:

[[email protected] orcl]$ rm redo*
[[email protected] orcl]$ ls -l redo*
ls: 无法访问redo*: 没有那个文件或目录
[[email protected] orcl]$ sqlplus / as sysdba
SQL> startup mount
ORACLE 例程已经启动。
。。。
数据库装载完毕。

因为我们只是缺失在线重做日志,所以数据库是可以启动到mount状态的,mount状态的数据库只会打开控制文件,并不会去校验每个数据文件的状态,校验动作会在open阶段进行。

SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结尾
进程 ID: 4607
会话 ID: 125 序列号: 5

打开数据库的话,会报错,并且数据库会强行关闭

下面我们使用resetlogs的方法尝试打开数据库:

SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。

resetlogs打开数据库必须在数据库不完全恢复之后才可以用,而且在不完全恢复后必须使用 RESETLOGS 或 NORESETLOGS 选项

除了这种方法以外,我们还可以通过清除logfile的方法进行打开数据库,如下:

首先将数据库启动到mount状态

查询v$log视图:

SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE  MEMBERS ARC STATUS       FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ -------------------
 1    1       1  134217728   5121 NO  CURRENT      984719 2015-09-16 16:04:30   2.8147E+14
 3    1       0  134217728   5121 YES UNUSED   0          0
 2    1       0  134217728   5121 YES UNUSED   0          0

如果ARCHIVED栏位是YES的话,我们可以通过

alter database clear logfile 命令进行清除,如果是No的话,我们可以通过
alter database clear unarchived logfile 进行强行清除
SQL> alter database clear logfile group 2;
数据库已更改。
SQL> alter database clear logfile group 3;
数据库已更改。
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
第 1 行出现错误:
ORA-01624: 日志 1 是紧急恢复实例 orcl (线程 1) 所必需的
ORA-00312: 联机日志 1 线程 1: ‘/app/oradata/orcl/redo01.log‘

但是由于group 1是当前的在线日志,再加上之前我是使用的 shutdown abort进行关闭的数据库

数据文件状态不一致,需要使用当前日志进行实例恢复,所以无法通过清除日志命令进行清除

如果数据库文件状态一致,做到这里我们就可以通过 alter database open命令打开数据库了,但是如果碰到这样的不一致的情况,还需要通过 resetlogs打开数据库,如下:

SQL> recover database until cancel;
ORA-00279: 更改 984722 (在 09/16/2015 16:04:43 生成) 对于线程 1 是必需的
ORA-00289: 建议: /app/archivelog/orcl_1_1_890582670.dbf
ORA-00280: 更改 984722 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00308: cannot open archived log ‘/app/archivelog/orcl_1_1_890582670.dbf‘
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-00308: cannot open archived log ‘/app/archivelog/orcl_1_1_890582670.dbf‘
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: ‘/app/oradata/orcl/system01.dbf‘
SQL> recover database until cancel  
ORA-00279: 更改 984722 (在 09/16/2015 16:04:43 生成) 对于线程 1 是必需的
ORA-00289: 建议: /app/archivelog/orcl_1_1_890582670.dbf
ORA-00280: 更改 984722 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: ‘/app/oradata/orcl/system01.dbf‘
ORA-01112: 未启动介质恢复
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: ‘/app/oradata/orcl/system01.dbf‘

但是我们发现,不完全恢复是失败的,这个时候通过 resetlogs打开数据库也是不可能的,那么我们只能通过应用隐含参数,通过隐含参数使状态不一致的数据库打开,如下:

SQL> create pfile=‘/home/oracle/p2.ora‘ from spfile;
在pfile里面增加*._allow_resetlogs_corruption=TRUE
echo "*._allow_resetlogs_corruption=TRUE">>p2.ora
然后通过我们新建的pfile打开数据库到mount状态:
SQL> startup mount pfile=‘/home/oracle/p2.ora‘
ORACLE 例程已经启动。
Total System Global Area  334036992 bytes
Fixed Size    2253024 bytes
Variable Size  171970336 bytes
Database Buffers  155189248 bytes
Redo Buffers    4624384 bytes
数据库装载完毕。
然后通过 resetlogs的方法打开数据库
SQL> alter database open resetlogs;
数据库已更改。

因为我们是用我们临时生成的pfile进行启动的,所以还要完成最后一步,重启数据库即可

好了,数据库打开了,但是因为我们的数据库从异常情况下恢复过来,可能是会有问题的,所以建议做好备份,以防数据丢失。

时间: 2024-10-13 21:33:12

Oracle数据库在线重做日志被删除的几种恢复方法的相关文章

Overview of the Online Redo Log --- 在线重做日志概述

对于 oracle 恢复来说最重要的数据结构莫过于online redo log(在线重做日志), 在线重做日志包含至少两个预先分配好的,用来存储数据库变化的文件.在线重做日志记录着数据文件中的变化. Online Redo Log有什么作用 Oracle 数据库通过在线重做日志文件来确保数据不丢失.特别是当实例失败后, oracle数据库可以通过在线重做日志文件恢复已经提交但尚未写到数据文件中的数据. Oracle 数据库把每个事务先同步写到 redo log buffer,然后再写到在线重做

Oracle数据库中调用Java类开发存储过程、函数的方法

Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL,除此之外,还可以用时下最流行的编程语言Java来做开发.随着对oracle的了解越来越多,越来越禁不住oracle的诱惑,oracle技术真的是一门很有趣的学问.之前,我在博客中总结了挺多有关SQL.PL/SQL的,但是对于oracle数据库中Java类的调用却没有总结,也是因为之前不太会,这会儿总

oracle 误删除表的几种恢复方法

在删除数据的时候不小心,把delete语句执行错了,把别的表给delete,而且还执行了commit!那么如何进行恢复呢,下面介绍几种恢复方法.第一种: 1.打开Flash存储的权限ALTER TABLE tableName ENABLE row movement ;2.把表还原到指定时间点flashback table tableName to timestamp to_timestamp(''2018-03-16 10:40:00'',''yyyy-mm-dd hh24:mi:ss'');后

Oracle Logminer 分析重做日志RedoLog和归档日志ArchiveLog

在实际开发过程中,有时我们很有可能需要某个表的操作痕迹,或通过记录的SQL语句进行有目的性的数据恢复(此时POINT-IN-TIME恢复已经满足不了更细的粒度).或仅仅是查看: 据说Oracle8i之后,就提供了Logminer日志分析工具,虽然没有GUI图形化的界面,但也阻挡不了使用他的决心. Oracle11g下使用的情况: (1).数据库开启归档模式 在安装Logminer之前,我们先讲数据库设置为归档模式: 注意:如果开启日志分析功能,仅仅是分析系统默认的Redo01.log.Redo0

Oracle 11g 管理重做日志文件

重做日志也称联机重做日志.引入重做日志的目的是数据恢复.在数据库运行过程中,用户更改的数据会暂时存放在数据库的高速缓冲区中.为了提高写数据的速度,并不是一旦有数据变化,就把变化的数据写到数据文件中.频繁的读写磁盘文件会使数据库系统效率降低,所以要等到数据库高速缓冲区中的数据达到一定的量或者满足一定的条件时,DBWR进程才会将变化了的数据写到数据文件中.这种情况下如果在DBWR把变化了的更改写到数据文件之前发生了宕机,那么数据高速缓冲区中的数据就会全部丢失.如果在数据库重新启动后无法恢复这部分用户

oracle数据库的建表,删除字段,添加字段,修改字段,修改字段......

1. 使用oracle创建一张表: SQL> create table loginuser( 2 id number(10,2), 3 username varchar(20), 4 password varchar(20), 5 email varchar(30), 6 descriable varchar2(200), 7 regdate date); 创建表的语法: CREATE TABLE table_name( columns_name datatype,...... ); 显示创建表

【沫沫金原创】Bat批处理完成Oracle数据库7天备份自动删除

导读 数据库的备份是古老而不可忽视的话题,完成备份,随着时间的推移,将会占用大量的空间,这是个问题?解决有两个选项,1.增加存储空间 2.保留最近备份.本篇重点介绍方案2 方案2 编写bat脚本,支持删除指定目录下7天前的文件,核心是"forfiles" forfiles /p "D:\YtForever\YTPQM\DB\backup" /s /m *.* /d -7 /c "cmd /c del @path" 替换路径,存为.bat即可. 自

oracle数据库添加,查询,删除检查约束

CHECk约束是检查约束,能够规定每一个列能够输入的值,以保证数据的正确性 比如通过限制数据类型,检查约束,输入格式,默认值,非空约束等 例如:学生姓名大于0,学生编号不能为空,如果不满足要求,则判断输入无效 (1)添加约束: [1]创建表时添加CHECK约束,在创建表的后面 语法: CONSTRAINT   约束名称   CHECK(条件) 示例: -创建顾客信息表的同时为表添加检查约束 CREATE TABLE CUSTOMINFO( CUSTOMID VARCHAR2(10), NAME

oracle数据库添加,查询,删除唯一约束

UNIQUE约束称之为唯一约束,可以设置在表中输入的字段值都是唯一的,跟主键很相似,不同的是唯一约束可以有多个,主键只能有一个对于不是主键但要保证唯一性的字段来说,可以建议唯一约束 (1)添加唯一约束 [1]创建表的同时添加唯一约束 创建表时添加UNIQUE约束,在创建表的后面 语法: CONSTRAINT   约束名称   UNIQUE(字段名) 示例: CREATE TABLE ORDERINFO (              ORDERID VARCHAR2(10),