今天做了点删除redo log的测试,查阅资料和实际动手整理了一下的一些东西。
A非当前联机日志被删除损坏
正常关闭数据库
shutdown immediate
我们在os上删除logfile redo01.log,此redo log属于group 1
startup mount;
startup;
select * from v$log
v$log视图中有column status和archived log,其中status有current当前日志组,inactive非活动日志组,active活动日志组,unused未使用日志组,archived表示是否已经归档。当然如果是当前日志组,oracle是不会对其归档的。
如果此时我们删除的是非当前日志redo01.log,redo01.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.log和redo01_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之前的备份信息都好像不能使用了,有网友说到10G后resetlogs启动数据库后rman之前的备份集依然能使用,但是俺试了几次暂时没有取得成功,所有不管怎样resetlogs启动数据库后最应该做的就是来一个rman全库备份,热备份就是利用的备份集和redo log和archive log来恢复数据库。
前些天又好好看了点eygle的循序渐进书的后面的后记,eygle又一次强调了勤奋,想想以前的俺还是很是勤奋的,现在毕业了漫漫地忘记了这个习惯!加油!
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1054058/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25362835/viewspace-1054058/