意外删除redo的恢复

今天做了点删除redo log的测试,查阅资料和实际动手整理了一下的一些东西。

A非当前联机日志被删除损坏

正常关闭数据库

shutdown immediate

我们在os上删除logfile redo01.log,redo log属于group 1

startup mount

startup

select * from v$log

v$log视图中有column statusarchived log,其中statuscurrent当前日志组,inactive非活动日志组,active活动日志组,unused未使用日志组,archived表示是否已经归档。当然如果是当前日志组,oracle是不会对其归档的。

如果此时我们删除的是非当前日志redo01.logredo01.log已经归档了,此时启动数据库到open状态时oracle会提示缺少redo01.log,只需要重新一个redo01.log即可open数据库。

Alter database clear logfile group 1或者

Alter database clear unarchived logfile group 1

如果此时是redo01.log是当前日志组了,我们就无法clear重建了,因为此redo log还没有归档,所以无法重建。

B丢失当前日志组。

利用recover database然后resetlogs

Startup mount

删除当前日志文件

recover database until cancel

恢复数据库到cancel

Alter database open resetlogs

由于丢失了当前日志,需要以resetlogs打开数据库。

然后数据库可以正常启动了。

或者利用重建控制文件来完成数据库的启动

Startup nomount

删除当前日志文件

Alter database backup controlfile to trace

create controlfile的脚本存储用户跟踪日志中

内容如下:

CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 'D:ORACLEPRODUCT10.2.0ORADATATESTREDO01.LOG' SIZE 50M,

GROUP 2 'D:ORACLEPRODUCT10.2.0ORADATATESTREDO02.LOG' SIZE 50M,

GROUP 3 'D:ORACLEPRODUCT10.2.0ORADATATESTREDO03.LOG' SIZE 50M,

GROUP 4 'D:ORACLEPRODUCT10.2.0ORADATATESTREDO04.LOG' SIZE 50M,

GROUP 5 'D:ORACLEPRODUCT10.2.0ORADATATESTREDO05.LOG' SIZE 50M,

GROUP 6 (

'D:ORACLEPRODUCT10.2.0ORADATATESTREDO06.LOG',

'D:ORACLEPRODUCT10.2.0ORADATAREDO06_01.LOG'

) SIZE 10M,

GROUP 7 'D:ORACLEPRODUCT10.2.0ORADATATESTTESTONLINELOGO1_MF_7_74W2F7K1_.LOG' SIZE 100M

-- STANDBY LOGFILE

DATAFILE

'D:ORACLEPRODUCT10.2.0ORADATATESTSYSTEM01.DBF',

'D:ORACLEPRODUCT10.2.0ORADATATESTUNDOTBS01.DBF',

'D:ORACLEPRODUCT10.2.0ORADATATESTSYSAUX01.DBF',

'D:ORACLEPRODUCT10.2.0ORADATATESTUSERS01.DBF',

'D:ORACLEPRODUCT10.2.0ORADATATESTYCUP_01.ORA',

'D:ORACLEPRODUCT10.2.0ORADATATESTBJ01.DBF',

'D:ORACLEPRODUCT10.2.0ORADATATESTTESTDATAFILEO1_MF_WEN_74NP5DD4_.DBF',

。。。。。。

执行上述脚本,由于用resetlogs重建数据库需要resetlogs打开数据库

Alter database open resetlogs

上述两种方法中都可以在关闭数据库前做个测试

关闭数据库前

Create table test_user_objects as select * from user_objects where 1<>1

Insert into test_user_objects select * from user_objects

Commit;

Select count* from test_user_objects

310 rows

关闭数据库意外删除redo log

Select count* from test_user_objects

310 rows

如果当前日志组有成员redo01_a.logredo01_b.log,即使其中一个成员删除了也不会影响数据库的正常的运行,因为两个都是同镜像的文件。

不过在Select * from v$logfile中,status状态显示invaild

此时我们只需要

alter system swith logfile

alter database drop logfile member ‘’;

alter databse add logfile member ‘’ to group 1

就可以完成日志成员的删除和重建了,因为当前日志组成员是不允许删除的,所以要做个swith

资料上提到可以利用oracle的隐含参数_allow_resetlogs_currpotion

不过个人尝试了一下,后果很严重,直接让我的测试数据库hang了,隐含参数最好不要用,不然oracle也不会隐藏.

对上面的一些操作有点需要理解的:

但是当时根据eygle的记载;

Resetlogs打开数据库:

1 执行不完全恢复来打开数据库

2 使用了备份的控制文件启动数据库

3 使用带有resetlogs启动数据库

是否应该这么理解,不完全恢复并不是用户的数据不变,而是应该只要丢失了当前的redo log,因为当前的redo log并没有备份,里面有记载的oracle数据的操作信息。

由于是在正常关闭数据库,sga中的buffer_cache已经全部写入到磁盘中去了,所以当前的普通user的数据信息是没有丢失的了,但是由于打开数据库后,日志又开始记录了,但是此时并没有open状态,普通user无法操作数据库,但是丢失了当前的redo log,数据库也失去了日志的重组性。也就是不完全恢复数据库了。

Resetlogs启动数据库代表了数据库的一个新的记录开始,日志会重建排序生成,其中rman之前的备份信息都好像不能使用了,有网友说到10Gresetlogs启动数据库后rman之前的备份集依然能使用,但是俺试了几次暂时没有取得成功,所有不管怎样resetlogs启动数据库后最应该做的就是来一个rman全库备份,热备份就是利用的备份集和redo logarchive log来恢复数据库。

前些天又好好看了点eygle的循序渐进书的后面的后记,eygle又一次强调了勤奋,想想以前的俺还是很是勤奋的,现在毕业了漫漫地忘记了这个习惯!加油!

[@more@]

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

转载于:http://blog.itpub.net/25362835/viewspace-1054058/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值