【51CTO.com 獨(dú)家翻譯】Oracle中的游戲?非也,這里引用的游戲與奧林匹克競賽中的“運(yùn)動(dòng)”類似,競賽中的參加比賽的運(yùn)動(dòng)員對它們從事的事情是非常認(rèn)真的,他們非常熱愛他們的運(yùn)動(dòng)或競賽,作為一名Oracle DBA,你熱愛你的工作嗎?你的工作是否順利呢?對那些認(rèn)真的人而言,專業(yè)可能是一個(gè)更好的選擇,我們將要玩“游戲”或競賽,我們能從它們那里學(xué)到什么,本文為DBA提供實(shí)用、必要的技能。
丟失了一個(gè)或更多的專用文件
專用文件包括:控制文件、在線重做日志、歸檔重做日志和數(shù)據(jù)文件。我們假設(shè)你有多個(gè)控制文件,在初始化參數(shù)文件中標(biāo)識(shí)出來了(本文我將使用pfile以便于快速編輯),你已經(jīng)閱讀了很多次:如果你丟失了一個(gè)控制文件,恢復(fù)或修復(fù)一個(gè)好的控制文件拷貝到錯(cuò)誤文件的位置,或者從參數(shù)文件中移除涉及的文件,在一個(gè)控制文件丟失后(無論什么原因),對數(shù)據(jù)庫有什么影響呢?
1、操作仍然可以繼續(xù),有其他的控制文件“在線”意味著你可以承受一個(gè)或更多控制文件的丟失。
2、你(DBA)不得不關(guān)閉系統(tǒng),恢復(fù)文件(或從init.ora文件中移除)并重新啟動(dòng)。
3、Oracle關(guān)閉實(shí)例(如你不能控制,無論你想不想它都會(huì)發(fā)生)。
我問這個(gè)的原因是:控制文件之間以及在線重做日志多路復(fù)用之間有什么不同?例如:如果一個(gè)活動(dòng)組的成員丟失了數(shù)據(jù)庫(或?qū)嵗l(fā)生什么?Oracle繼續(xù)保持運(yùn)轉(zhuǎn)還是停止運(yùn)轉(zhuǎn)?在下面的實(shí)驗(yàn)中,我將control01.ctl文件放在閃存盤里,然后將閃存盤從USB端口拔出來模擬介質(zhì)失效。
當(dāng)前控制文件清單
*.control_files='D:\oracle\product\10.2.0/oradata/db10/\control01.ctl',
'D:\oracle\product\10.2.0/oradata/db10/\control02.ctl',
'D:\oracle\product\10.2.0/oradata/db10/\control03.ctl'
新的控制文件清單
*.control_files='D:\oracle\product\10.2.0/oradata/db10/\control01.ctl',
'D:\oracle\product\10.2.0/oradata/db10/\control02.ctl',
'F:\oracle\control03.ctl'
確認(rèn)新的控制文件:
SQL> startup
ORACLE instance started.
Total System Global Area 289406976 bytes
Fixed Size 1290184 bytes
Variable Size 104857656 bytes
Database Buffers 176160768 bytes
Redo Buffers 7098368 bytes
Database mounted.
Database opened.
SQL> col name for a52
SQL> select name from v$controlfile;
NAME
----------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\CONTROL01.CTL
D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\CONTROL02.CTL
F:\ORACLE\CONTROL03.CTL
現(xiàn)在已經(jīng)準(zhǔn)備好斷開閃存盤的連接,沒有直接的警告(用戶界面沒有任何提示信息,直到嘗試一個(gè)操作時(shí)),實(shí)例崩潰了。
SQL> select name from v$controlfile;
select name from v$controlfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
下面顯示了警告日志(這只是其中一部分):
Thu Mar 06 12:41:15 2008
Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_ckpt_2756.trc:
ORA-00206: error in writing (block 3, # blocks 1) of control file
ORA-00202: control file: 'F:\ORACLE\CONTROL03.CTL'
ORA-27072: File I/O error
OSD-04008: WriteFile() failure, unable to write to file
O/S-Error: (OS 1006) The volume for a file has been externally altered so that the opened file is no longer valid.
…some more messages…
Thu Mar 06 12:41:29 2008
Instance terminated by CKPT, pid = 2756
修復(fù)這個(gè)問題其實(shí)很簡單,但是你真的了解了當(dāng)一個(gè)控制文件丟失后發(fā)生了什么嗎?
修復(fù)問題,重新連接并啟動(dòng)
SQL> prompt Remove the reference to control03
SQL> startup
ORA-24324: service handle not initialized
ORA-01041: internal error. hostdef extension doesn't exist
SQL> conn sys/oracle as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 289406976 bytes
Fixed Size 1290184 bytes
Variable Size 104857656 bytes
Database Buffers 176160768 bytes
Redo Buffers 7098368 bytes
Database mounted.
Database opened.
SQL>
回到在線重做日志文件,丟失了一個(gè)成員,實(shí)例會(huì)象丟失控制文件那樣崩潰嗎?答案是:依情況而定。一個(gè)組可能有一個(gè)或多個(gè)成員,我們先看一看#members=1的情況,與前面的例子類似,我將在一個(gè)閃存盤上創(chuàng)建一個(gè)成員的組,并使這個(gè)組成為活動(dòng)組(意味著STATUS的值是ACTIVE, CURRENT, INACTIVE和UNUSED嗎?),一旦組是活動(dòng)的,我將拔出閃存盤,當(dāng)前的重做日志組是哪一個(gè)?從警告日志可以看到:
提取自警告日志
Thu Mar 06 13:22:11 2008
Thread 1 advanced to log sequence 211
Current log# 10 seq# 211 mem# 0: F:\ORACLE\REDO10.LOG
如丟失控制文件一樣,實(shí)例停止運(yùn)轉(zhuǎn)了。
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- ------------------------------------------------
7 ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\REDO07.LOG
8 ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\REDO08.LOG
10 ONLINE F:\ORACLE\REDO10.LOG
9 ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\REDO09.LOG
SQL> select * from v$logfile;
select * from v$logfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
在這個(gè)例子中,是LGWR導(dǎo)致了實(shí)例終止,注意在其他例子中是CKPT,在控制文件中記錄了什么呢?SCN,哪個(gè)進(jìn)程使用SCN給控制文件做的印記?checkpoint進(jìn)程。
如果想在家中嘗試,將數(shù)據(jù)庫運(yùn)行在非歸檔模式,并在當(dāng)前日志組中只使用一個(gè)成員,它能再次打開數(shù)據(jù)庫嗎?
那個(gè)組被多路復(fù)用,相同的文件從系統(tǒng)中拔出,會(huì)發(fā)生什么?生命還是要繼續(xù),在警告日志中記錄了一條關(guān)于丟失成員的消息,讓我們向組10添加第二個(gè)成員,將它放在一個(gè)不同的驅(qū)動(dòng)器中,然后再次拔出閃存盤(開始打開數(shù)據(jù)庫時(shí)應(yīng)該有一個(gè)提示信息)。
下面是警告日志中顯示的:
Thu Mar 06 14:51:45 2008
Thread 1 advanced to log sequence 216
Current log# 10 seq# 216 mem# 0: F:\ORACLE\REDO10.LOG
Current log# 10 seq# 216 mem# 1: D:\ORACLE\PRODUCT\10.2.0\ORADATA\
DB10\REDO11.LOG
Thu Mar 06 14:53:36 2008
Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_lgwr_2224.trc:
ORA-00345: redo log write error block 23 count 2
ORA-00312: online log 10 thread 1: 'F:\ORACLE\REDO10.LOG'
ORA-27072: File I/O error
OSD-04008: WriteFile() failure, unable to write to file
O/S-Error: (OS 1006) The volume for a file has been externally altered
so that the opened file is no longer valid.
Thu Mar 06 14:53:36 2008
Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_lgwr_2224.trc:
ORA-00343: too many errors, log member closed
ORA-00346: log member marked as STALE
ORA-00312: online log 10 thread 1: 'F:\ORACLE\REDO10.LOG'
這個(gè)消息缺少兩個(gè)單詞:實(shí)例終止(Instance terminated),在關(guān)閉和啟動(dòng)之后,警告日志將仍然提示文件丟失,丟失數(shù)據(jù)庫是可以被打開的。
Thu Mar 06 14:56:51 2008
ALTER DATABASE OPEN
Thu Mar 06 14:56:52 2008
Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_lgwr_2288.trc:
ORA-00313: open failed for members of log group 10 of thread 1
Thu Mar 06 14:56:52 2008
Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_lgwr_2288.trc:
ORA-00313: open failed for members of log group 10 of thread 1
Thu Mar 06 14:56:52 2008
Thread 1 opened at log sequence 216
Current log# 10 seq# 216 mem# 1: D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10
\REDO11.LOG
Successful open of redo thread 1
…some other messages…
Thu Mar 06 14:56:59 2008
Completed: ALTER DATABASE OPEN
丟失數(shù)據(jù)文件
迄今為止,從丟失控制文件或重做日志文件中恢復(fù)幾乎不會(huì)丟失數(shù)據(jù),單成員重做日志組例子可能發(fā)生數(shù)據(jù)丟失,提到數(shù)據(jù)文件,有兩種分類:一個(gè)對于你(你的數(shù)據(jù))很重要,一個(gè)對于Oracle(它的數(shù)據(jù))很重要,為了理解這個(gè)分類,有兩個(gè)問題:
1、如果你的表空間丟失了一個(gè)數(shù)據(jù)文件會(huì)發(fā)生什么?
2、如果SYSTEM表空間(作為Oracle所屬的表空間)丟失了一個(gè)數(shù)據(jù)文件將會(huì)發(fā)生什么?
如果你回答這些問題時(shí)不考慮歸檔,那么你會(huì)保持50%左右出錯(cuò)的機(jī)會(huì)。
如果在非歸檔模式下操作,丟失了一個(gè)數(shù)據(jù)文件 -- 任一數(shù)據(jù)文件 -- 那就完了,實(shí)例終止。如果在歸檔模式下操作,那回答上面的兩個(gè)問題的答案是不一樣的:數(shù)據(jù)文件丟失意味著實(shí)例仍然在工作,丟失一個(gè)Oracle專用的數(shù)據(jù)文件意味著實(shí)例終止了。在“備份和恢復(fù)高級(jí)用戶指南”中“數(shù)據(jù)文件丟失后的恢復(fù):情景”小節(jié)非常詳細(xì)地寫出了。
小結(jié)
幾乎所有關(guān)于丟失特定文件的備份和恢復(fù)情景都可以復(fù)制到一臺(tái)使用非常便宜的閃存盤的PC上,無論是在一臺(tái)有大量CPU和充足內(nèi)存的AIX 5300L上還是在你的能勉強(qiáng)運(yùn)行Oracle的個(gè)人桌面機(jī)/筆記本電腦上,原理實(shí)際上都是一樣的,自己嘗試一下吧!這些沒有壓力的最佳實(shí)踐訓(xùn)練對生產(chǎn)環(huán)境中的恢復(fù)非常有幫助,當(dāng)你的實(shí)例崩潰時(shí),時(shí)間就是金錢。
更多信息請查看IT技術(shù)專欄