oracle redo删除,意外删除redo的恢复
今天做了點刪除redo log的測試,查閱資料和實際動手整理了一下的一些東西。
A非當前聯機日志被刪除損壞
正常關閉數據庫
shutdown immediate
我們在os上刪除logfile redo01.log,此redo log屬于group 1
startup mount;
startup;
select * from v$log
v$log視圖中有columnstatus和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" RESETLOGSARCHIVELOG
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 logfilemember ‘’ 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@]
總結
以上是生活随笔為你收集整理的oracle redo删除,意外删除redo的恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的车是一汽丰田卡罗拉双擎,想问一下也买
- 下一篇: 帕拉梅拉机油盖怎么打开?