8.手工備份恢復(fù)--備用數(shù)據(jù)庫(kù)(練習(xí)10、11)
在講備用數(shù)據(jù)庫(kù)之前,先說(shuō)明兩個(gè)術(shù)語(yǔ):
- 主數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)源就是主數(shù)據(jù)庫(kù),也可稱之為源、產(chǎn)品或者主動(dòng)數(shù)據(jù)庫(kù)。在本節(jié)中PRACTICE數(shù)據(jù)庫(kù)實(shí)例為主數(shù)據(jù)庫(kù);
- 備用數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)副本是備用數(shù)據(jù)庫(kù),也可以成為目標(biāo)數(shù)據(jù)庫(kù)或者恢復(fù)數(shù)據(jù)庫(kù)。該數(shù)據(jù)庫(kù)通常與數(shù)據(jù)庫(kù)擁有相同的名稱和實(shí)例名稱,但如果備用數(shù)據(jù)庫(kù)和主數(shù)據(jù)庫(kù)保存在同一服務(wù)器,實(shí)例名稱將不同,如本節(jié)中STANDBY;
實(shí)現(xiàn)備用數(shù)據(jù)庫(kù)需要注意如下細(xì)節(jié):
- 真實(shí)環(huán)境中,主數(shù)據(jù)庫(kù)和備用數(shù)據(jù)庫(kù)必須保存在在不同物理位置的服務(wù)器上;
- 存放主數(shù)據(jù)庫(kù)和備用數(shù)據(jù)庫(kù)的服務(wù)器必須擁有相同的機(jī)器結(jié)構(gòu)和操作系統(tǒng);
- 在兩個(gè)數(shù)據(jù)庫(kù)上的Oracle數(shù)據(jù)庫(kù)版本必須相同;
- 備用主機(jī)只做備用服務(wù)器,不能兼顧他用;
- 對(duì)歸檔重做日志文件的加載取決于NET8,完全依賴于網(wǎng)絡(luò),如果網(wǎng)絡(luò)出現(xiàn)問(wèn)題,主數(shù)據(jù)庫(kù)和備用數(shù)據(jù)庫(kù)之間將存在更大的時(shí)間延遲;
- 客戶機(jī)和中間層服務(wù)應(yīng)當(dāng)做好準(zhǔn)備,一旦出現(xiàn)故障,能夠適應(yīng)主數(shù)據(jù)庫(kù)向另一臺(tái)服務(wù)器上的轉(zhuǎn)移;
- 數(shù)據(jù)庫(kù)結(jié)構(gòu)和對(duì)象操作上許多變化不會(huì)被傳播給備用數(shù)據(jù)庫(kù);
- 主數(shù)據(jù)庫(kù)必須運(yùn)行在歸檔模式,并且爸爸歸檔日志文件用于恢復(fù)備用數(shù)據(jù)庫(kù);
- 一定要驗(yàn)證備用數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程,一旦出現(xiàn)故障,備用數(shù)據(jù)庫(kù)將成為主數(shù)據(jù)庫(kù),備份存儲(chǔ)過(guò)程將保護(hù)新的主數(shù)據(jù)庫(kù)庫(kù)。
練習(xí)10:初始化并恢復(fù)備用數(shù)據(jù)庫(kù)
本練習(xí)首先按照PRACTICE創(chuàng)建STANDBY數(shù)據(jù)庫(kù)目錄、參數(shù)文件、口令文件、Window服務(wù),然后把PRACTICE數(shù)據(jù)庫(kù)的數(shù)據(jù)文件備份到STANDBY目錄下并修改備用參數(shù)文件,再通過(guò)手工傳遞并應(yīng)用歸檔日志文件,最后啟動(dòng)并確認(rèn)管理恢復(fù)。
步驟一:準(zhǔn)備備用庫(kù)環(huán)境
利用練習(xí)9步驟一目錄腳本,修改ORACLE_SID為STANDBY,創(chuàng)建備用數(shù)據(jù)庫(kù)存放相關(guān)文件目錄,并參見(jiàn)該步驟創(chuàng)建一個(gè)口令文件和Window服務(wù)。
首先,創(chuàng)建備用數(shù)據(jù)庫(kù)所需的路徑:
2 set ORACLE_BASE=D:\oracle
3 set ORACLE_HOME=D:\oracle\product\10.1.0
4 set ORACLE_DATA=D:\oracle\%ORACLE_SID%
5 set ORACLE_ADMIN=%ORACLE_HOME%\admin\%ORACLE_SID%
6 md %ORACLE_ADMIN%
7 md %ORACLE_ADMIN%\pfile
8 md %ORACLE_ADMIN%\bdump
9 md %ORACLE_ADMIN%\cdump
10 md %ORACLE_ADMIN%\udump
11 md %ORACLE_ADMIN%\create
12 md %ORACLE_DATA%\
13 md %ORACLE_DATA%\ARCHIVE
然后,創(chuàng)建一個(gè)口令文件,這樣就可以在SQL*Plus中以SYSDBA角色SYS連接數(shù)據(jù)庫(kù)。
再次,為CLNE創(chuàng)建一個(gè)名為OracleSerciveCLNE的數(shù)據(jù)庫(kù)服務(wù),使用CLNE口令:
最后,配置TNS服務(wù):打開(kāi)D:\oracle\product\10.1.0\Db_1\NETWORK\ADMIN\ tnsnames.ora添加目標(biāo)數(shù)據(jù)庫(kù)服務(wù);
配置Lisenter服務(wù):打開(kāi)D:\oracle\product\10.1.0\Db_1\NETWORK\ADMIN\ listener.ora,添加目標(biāo)數(shù)據(jù)庫(kù)服務(wù)
步驟二:制作打開(kāi)數(shù)據(jù)庫(kù)的備份
可以采用冷備份或熱備份的數(shù)據(jù)庫(kù)文件來(lái)創(chuàng)建備用數(shù)據(jù)庫(kù),可利用練習(xí)五步驟一腳本,改變數(shù)據(jù)文件備份的目的路徑,使之指向STANDBY數(shù)據(jù)庫(kù)目錄:
Define dir=’ D:\oracle\STANDBY’
再把生成控制文件的路徑指向STANDBY所在路徑,該命令必須使用專門(mén)控制命令,不能由主數(shù)據(jù)庫(kù)控制文件的一個(gè)普通備份來(lái)創(chuàng)建:
prompt alter database create standby controlfile sa '&dir\standby.ctl' REUSE;;
運(yùn)行該腳本,將創(chuàng)建主數(shù)據(jù)庫(kù)的一個(gè)備用副本。
步驟三:配置備用參數(shù)文件
數(shù)據(jù)庫(kù)啟動(dòng)時(shí)需要加載參數(shù)據(jù)文件,可以復(fù)制CLNE數(shù)據(jù)庫(kù)的配置文件,具體路徑為D:\oracle\product\10.1.0\Db_1\database\initCLNE.ora,重新命名initSTANDBY.ora。備用數(shù)據(jù)庫(kù)參數(shù)文件應(yīng)對(duì)參數(shù)作如下設(shè)置,需要注意的是在Oracle10g參數(shù)文件中,存在不同的配置組,不同配置組對(duì)不同配置進(jìn)行設(shè)置:
2 instance_name=STANDBY
3 service_names=STANDBY
4 control_files=("D:\oracle\STANDBY\STANDBY.CTL")
5 log_archive_dest='D:\oracle\STANDBY\ARCHIVE'
6 standby_archive_dest='D:\oracle\STANDBY\ARCHIVE'
7 background_dump_dest=d:\oracle\product\10.1.0\admin\STANDBY\bdump
8 user_dump_dest=d:\oracle\product\10.1.0\admin\STANDBY\udump
9 db_file_name_convert='D:\oracle\PRACTICE','D:\oracle\STANDBY'
10 log_file_name_convert='D:\oracle\PRACTICE','D:\oracle\STANDBY'
11 lock_name_space=STANDBY
- 第1行db_name 備用數(shù)據(jù)必須擁有與主數(shù)據(jù)庫(kù)絕對(duì)相同的名稱;
- 第2行instance_name 內(nèi)存結(jié)構(gòu)以及后臺(tái)進(jìn)程鏈接的名稱,實(shí)例名稱不需要與數(shù)據(jù)庫(kù)名稱相同;
- 第3行service_names 連接一個(gè)或多個(gè)數(shù)據(jù)庫(kù)的某個(gè)實(shí)例由服務(wù)名稱參數(shù)確定,服務(wù)名稱STANDBY用于歸檔日志在PRACTICE和STANDBY數(shù)據(jù)庫(kù)之間傳遞;
- 第4行control_files 控制文件由control_files參數(shù)定義值打開(kāi),STANDBY數(shù)據(jù)庫(kù)和PRACTICE數(shù)據(jù)庫(kù)上的不同;
- 第5行l(wèi)og_archive_dest在手工恢復(fù)期間,這里路徑用于應(yīng)用歸檔日志;
- 第6行standby_archive_dest 應(yīng)用從主數(shù)據(jù)庫(kù)PRACTICE自動(dòng)傳遞/加載的歸檔日志;
- 第7行backup_dump_dest 用于后臺(tái)進(jìn)程的alert.log和調(diào)試跟蹤文件的路徑;
- 第8行user_dump_dest 用于用戶進(jìn)程跟蹤文件的路徑;
- 第9行db_file_name_convert 由于控制文件是來(lái)自PRACTICE數(shù)據(jù)庫(kù)的一個(gè)特別的副本,在控制文件中數(shù)據(jù)文件的指向是D:\oracle\PRACTICE目錄下,該參數(shù)通知實(shí)例在D:\oracle\STANDBY目錄下尋找那些數(shù)據(jù)文件。如果主數(shù)據(jù)庫(kù)和備用數(shù)據(jù)庫(kù)使用不同的主機(jī),建議所有的數(shù)據(jù)文件放置在相同的目錄結(jié)構(gòu)下,那么無(wú)需定義該參數(shù);
- 第10行l(wèi)og_file_name_conver 和db_file_name_convert類似,該參數(shù)通知數(shù)據(jù)庫(kù)實(shí)例在D:\oracle\STANDBY\ARCHIVE目錄下創(chuàng)建聯(lián)機(jī)日志文件;
- 第11行l(wèi)ock_name_space 必須使用該參數(shù),以確保兩個(gè)名稱一樣的數(shù)據(jù)庫(kù)能夠保存在同一個(gè)機(jī)器上。
步驟四:加載備用數(shù)據(jù)庫(kù)
通過(guò)如下腳本啟動(dòng)實(shí)例并加載備用控制文件
2 WIN>sqlplus /nolog
3 SQL>conn sys/standby@standby as sysdba;
4 SQL>startup nomount;
5 SQL>ALTER DATABASE MOUNT STANDBY DATABASE;
如為STANDBY數(shù)據(jù)庫(kù)正確配置初始化文件,啟動(dòng)命令將成功執(zhí)行;否則將出錯(cuò),此時(shí)查詢v$datafile表,看數(shù)據(jù)文件的路徑是否已經(jīng)正確轉(zhuǎn)換。
步驟五:傳送歸檔日志文件
有兩種方法可以實(shí)現(xiàn)主數(shù)據(jù)庫(kù)到備用數(shù)據(jù)庫(kù)恢復(fù)和應(yīng)用歸檔日志,分別為:
- 手工恢復(fù),由DBA建立一個(gè)腳本或手工輸入命令,將文件從主數(shù)據(jù)庫(kù)傳遞到備用路徑,然后在備用數(shù)據(jù)庫(kù)上使用恢復(fù)命令,這是Oracle8i版本之前使用的唯一方法;
- 管理恢復(fù),Oracle利用NET8監(jiān)控歸檔日志文件從主數(shù)據(jù)庫(kù)向備用數(shù)據(jù)庫(kù)位置的傳輸,并且這些日志文件在備用數(shù)據(jù)庫(kù)上的應(yīng)用也受管理。管理恢復(fù)是通過(guò)init.ora參數(shù)設(shè)置和恢復(fù)命令來(lái)設(shè)置的,備用數(shù)據(jù)庫(kù)產(chǎn)生名為遠(yuǎn)程文件服務(wù)器(RFS)的后臺(tái)進(jìn)程,從NET8傳輸中創(chuàng)建歸檔文件,并保存在standby_arch_dest文件夾下。
在本步驟我們把PRACTICE自STANDBY創(chuàng)建以來(lái)所進(jìn)行歸檔文件復(fù)制到STANDBY數(shù)據(jù)庫(kù)的歸檔目錄。
步驟六:應(yīng)用歸檔日志文件
將STANDBY數(shù)據(jù)設(shè)置為備用數(shù)據(jù)庫(kù)后,利用RECOVER命令在STANDBY數(shù)據(jù)庫(kù)上應(yīng)用所需要的歸檔文件:
設(shè)置完畢,將提示歸檔文件,結(jié)構(gòu)推薦文件名稱,直到應(yīng)用所有的歸檔文件,這個(gè)恢復(fù)就像在不完全恢復(fù)的基于取消恢復(fù)那樣:
按下ENTER鍵,應(yīng)用推薦的日志,知道產(chǎn)生如下的消息:
步驟七:?jiǎn)?dòng)管理恢復(fù)
首先通過(guò)配置NET8啟動(dòng)管理恢復(fù),這樣主服務(wù)器的歸檔進(jìn)程就可以和備份服務(wù)器上的RFS進(jìn)行通信,然后還必須通知主歸檔進(jìn)程將歸檔日志文件寫(xiě)到一個(gè)NET8服務(wù)中,最后把備用數(shù)據(jù)庫(kù)配置為管理模式恢復(fù)。此時(shí)歸檔文件從PRACTICE數(shù)據(jù)庫(kù)發(fā)出并自動(dòng)應(yīng)用于STANDBY數(shù)據(jù)庫(kù),直到取消恢復(fù)。
通過(guò)如下建立NET8服務(wù):
- 在STANDBY數(shù)據(jù)庫(kù)的listerner.ora創(chuàng)建一個(gè)名為STANDBY的新數(shù)據(jù)庫(kù)服務(wù);
- 在STANDBY數(shù)據(jù)庫(kù)的tnsnames.ora建立一個(gè)名為STANDBY的服務(wù),允許PRACTICE數(shù)據(jù)庫(kù)通過(guò)監(jiān)聽(tīng)者和STANDBY實(shí)例連接,通過(guò)該設(shè)置每當(dāng)一個(gè)歸檔日志文件從主數(shù)據(jù)庫(kù)發(fā)送給備用數(shù)據(jù)庫(kù)時(shí),該鏈接被創(chuàng)建和使用。
以DBA身份連接數(shù)據(jù)庫(kù),開(kāi)始管理恢復(fù)(建議使用命令行設(shè)置管理恢復(fù),使用SQL*Plus會(huì)出現(xiàn)無(wú)法響應(yīng)的情況):
當(dāng)提交該命令后,屏幕處于阻塞狀態(tài),得不到任何反饋信息,這是正常的,STANDBY數(shù)據(jù)庫(kù)已經(jīng)啟動(dòng)RFS后臺(tái)進(jìn)行接收任何從PRACTICE數(shù)據(jù)庫(kù)傳來(lái)的歸檔日志。當(dāng)一個(gè)PRACTICE數(shù)據(jù)庫(kù)的歸檔日志生成時(shí),通過(guò)NET8把該文件復(fù)制到D:\oracle\STANDBY\ARCHIVE的歸檔日志下并應(yīng)用到STANDBY數(shù)據(jù)庫(kù)。
該命令需要在另一個(gè)SQL*Plus會(huì)話中提交,用于取消管理恢復(fù)
步驟八:確認(rèn)恢復(fù)管理
通過(guò)如下三種方式確認(rèn)管理恢復(fù)是否正確運(yùn)行:
- Archive file 在STANDBY數(shù)據(jù)庫(kù)的歸檔目的路徑中查找從主數(shù)據(jù)庫(kù)傳輸來(lái)的歸檔日志;
- Standby alert log 在STANDBY的alert.log中查看歸檔日志應(yīng)用記錄,可以通過(guò)主數(shù)據(jù)庫(kù)日志的切換,等待幾分鐘,看是否有新的歸檔日志被傳輸和應(yīng)用;
- Log history 同時(shí)查詢主數(shù)據(jù)庫(kù)和備用數(shù)據(jù)庫(kù)上的v$log_history,看是否返回相同的值,注意備用數(shù)據(jù)庫(kù)的響應(yīng)會(huì)延遲幾秒:
練習(xí)11:打開(kāi)、激活備用數(shù)據(jù)庫(kù)
可以以只讀模式打開(kāi)備用數(shù)據(jù)庫(kù)檢查備用數(shù)據(jù)庫(kù)是否正確工作,此時(shí)不能修改數(shù)據(jù)并且不能應(yīng)用從主數(shù)據(jù)庫(kù)傳輸過(guò)來(lái)的歸檔日志文件。備用數(shù)據(jù)庫(kù)一旦被激活,將不能回復(fù),而需要對(duì)打開(kāi)的備用數(shù)據(jù)庫(kù)進(jìn)行備份。
步驟一:產(chǎn)生數(shù)據(jù)庫(kù)活動(dòng)
在PRACTICE數(shù)據(jù)庫(kù)在TINA.DATE_LOG表插入一筆15年后日期數(shù)據(jù),通過(guò)該數(shù)據(jù)驗(yàn)證歸檔日志文件是否正確傳遞,插入的命令如下:
2 SQL> COMMIT;
3 SQL> ALTER SYSTEM SWITCH LOGFILE;
在PRACTICE數(shù)據(jù)庫(kù)切換日志文件創(chuàng)建一個(gè)歸檔日志文件,將在STANDBY數(shù)據(jù)庫(kù)上應(yīng)用。
步驟二:以制度模式打開(kāi)備用數(shù)據(jù)庫(kù)
設(shè)置STANDBY數(shù)據(jù)庫(kù)為管理恢復(fù)模式,直到應(yīng)用最新的歸檔日志,這些歸檔日志中包含步驟一插入的新行,取消STANDBY數(shù)據(jù)庫(kù)的恢復(fù):
以只讀方式打開(kāi)STANDBY數(shù)據(jù)庫(kù),查看TINA.DATE_LOG是否存在步驟一插入的數(shù)據(jù)。
可以看到在備用數(shù)據(jù)庫(kù)已經(jīng)存在一筆15年日期的數(shù)據(jù)
步驟三:將備用數(shù)據(jù)庫(kù)返回到恢復(fù)模式
STANDBY數(shù)據(jù)庫(kù)從只讀打開(kāi)模式返回到恢復(fù)模式,首先必須要管理數(shù)據(jù)庫(kù):
2 SQL>STARTUP NOMOUNT;
3 SQL>ALTER DATABASE MOUNT STANDBY DATABASE;
4 SQL>RECOVER MANAGED STANDBY DATABASE;
步驟四:激活備用數(shù)據(jù)庫(kù)
激活備用數(shù)據(jù)庫(kù)時(shí)需重新設(shè)置聯(lián)機(jī)重做日志(該過(guò)程類似于RESETLOGS選項(xiàng)打開(kāi)數(shù)據(jù)庫(kù)),同時(shí)來(lái)自數(shù)據(jù)庫(kù)的日志文件不再應(yīng)用于備用數(shù)據(jù)庫(kù)。在激活備用數(shù)據(jù)庫(kù)之前需停止備用數(shù)據(jù)庫(kù)的恢復(fù)進(jìn)程:
然后激活備用數(shù)據(jù)庫(kù):
2 SQL>SHUTDOWN;
3 SQL>STARTUP;
此時(shí)在D:\oracle\STANDBY\ARCHIVE創(chuàng)建STANDBY數(shù)據(jù)庫(kù)聯(lián)機(jī)重做日志文件,控制文件成為主控制文件。強(qiáng)烈建議再激活數(shù)據(jù)庫(kù)立即進(jìn)行:
- 備份新的主數(shù)據(jù)庫(kù);
- 創(chuàng)建一個(gè)新的備用數(shù)據(jù)庫(kù)。

浙公網(wǎng)安備 33010602011771號(hào)