通過(guò)查詢V$DATABASE的SWITCHOVER_STATUS值來(lái)確定主庫(kù)是否可以進(jìn)行switchover操作:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
只要SWITCHOVER_STATUS查詢結(jié)果是TO STANDBY或者SESSIONS ACTIVE,就表明主庫(kù)和邏輯備庫(kù)之間可以進(jìn)行switchover。否則,查看Data Guard配置是否正確,比如所有的LOG_ARCHIVE_DEST_n參數(shù)是否配置正確。
2.當(dāng)前主庫(kù)進(jìn)行切換的準(zhǔn)備工作
在當(dāng)前主庫(kù)切換為邏輯備庫(kù)角色之前,先執(zhí)行如下SQL:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY;
該語(yǔ)句表明當(dāng)前主庫(kù)將很快被切換為邏輯備庫(kù)角色,并且開(kāi)始接收新主庫(kù)傳來(lái)的redo數(shù)據(jù)。在主庫(kù)執(zhí)行這一步是為了接收被記錄在當(dāng)前邏輯備庫(kù)redo數(shù)據(jù)流中的數(shù)據(jù)字典,見(jiàn)步驟3。
如果該步驟成功執(zhí)行,那么V$DATABASE.SWITCHOVER_STATUS列的值為PREPARING SWITCHOVER。
3.目標(biāo)邏輯備庫(kù)切換準(zhǔn)備
通過(guò)如下的SQL創(chuàng)建目標(biāo)邏輯備庫(kù)的數(shù)據(jù)字典:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY;
該語(yǔ)句還同時(shí)啟動(dòng)了邏輯備庫(kù)的redo傳輸服務(wù),該數(shù)據(jù)庫(kù)將開(kāi)始將自身的redo數(shù)據(jù)發(fā)送到當(dāng)前的主庫(kù)以及Data Guard配置中的其他備庫(kù)。接收邏輯備庫(kù)redo數(shù)據(jù)的這些數(shù)據(jù)庫(kù)但并不應(yīng)用這些redo數(shù)據(jù)。
當(dāng)數(shù)據(jù)字典開(kāi)始寫(xiě)入redo數(shù)據(jù)流中,邏輯備庫(kù)的V$DATABASE.SWITCHOVER_STATUS值變?yōu)镻REPARING DICTIONARY,一旦操作成功執(zhí)行,SWITCHOVER_STATUS變?yōu)镻REPARING SWITCHOVER。
4.確認(rèn)當(dāng)前主庫(kù)已經(jīng)為未來(lái)的主庫(kù)redo數(shù)據(jù)流做好了準(zhǔn)備
在完成主庫(kù)到備庫(kù)角色的切換之前,通過(guò)查詢V$DATABASE的SWITCHOVER_STATUS值來(lái)確認(rèn)數(shù)據(jù)字典已經(jīng)被主庫(kù)接收,如果數(shù)據(jù)字典未被接收,那么切換操作將不能完成。因?yàn)楫?dāng)前主庫(kù)不能夠解析新主庫(kù)傳來(lái)的redo數(shù)據(jù)。
SWITCHOVER_STATUS的值表明了switchover的進(jìn)程,當(dāng)值為T(mén)O LOGICAL STANDBY時(shí),進(jìn)入步驟5.
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
備注:終止主庫(kù)switchover操作:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
終止邏輯備庫(kù)switchover操作:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
5.切換主庫(kù)到邏輯備庫(kù)角色
通過(guò)如下SQL切換主庫(kù)到邏輯備庫(kù)角色:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;
該語(yǔ)句將等待當(dāng)前所有主庫(kù)停止所有的事務(wù)以及防止任何新用戶啟動(dòng)新事務(wù),并且建立切換提交的時(shí)間點(diǎn)。
該語(yǔ)句還將防止用戶對(duì)邏輯備庫(kù)的數(shù)據(jù)做任何的修改操作,為了確保快速執(zhí)行完,執(zhí)行該switchover語(yǔ)句前確保主庫(kù)在沒(méi)有更新活動(dòng)的靜止?fàn)顟B(tài),比如,所有用戶暫時(shí)不要登錄主庫(kù)。可以通過(guò)V$TRANSACTION視圖查詢當(dāng)前正在進(jìn)行的事務(wù)中可能延遲執(zhí)行該SQL的詳細(xì)信息。
此時(shí),主庫(kù)已經(jīng)在往備庫(kù)角色過(guò)渡了,你不可以關(guān)閉或者重啟數(shù)據(jù)庫(kù)。
6.確保所有可用的redo數(shù)據(jù)都已經(jīng)被應(yīng)用到將轉(zhuǎn)為新主庫(kù)的目標(biāo)邏輯備庫(kù)中
當(dāng)完成主庫(kù)到邏輯備庫(kù)角色的切換,而且配置中的備庫(kù)已經(jīng)接收了切換通知,應(yīng)確認(rèn)切換通知已經(jīng)被目標(biāo)備庫(kù)處理,這個(gè)可以通過(guò)查詢目標(biāo)備庫(kù)V$DATABASE中的SWITCHOVER_STATUS來(lái)核實(shí),一旦所有可用的redo數(shù)據(jù)已經(jīng)應(yīng)用到了邏輯備庫(kù),SQL應(yīng)用會(huì)按照預(yù)期的角色轉(zhuǎn)換目標(biāo)而自動(dòng)關(guān)閉。
SWITCHOVER_STATUS值的更新顯示switchover的進(jìn)度,當(dāng)值為T(mén)O PRIMARY,則進(jìn)入第7步。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
7.切換邏輯備庫(kù)到主庫(kù)角色
執(zhí)行如下SQL,完成邏輯備庫(kù)到主庫(kù)角色的轉(zhuǎn)換:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
不需要對(duì)Data Guard配置中的邏輯備庫(kù)進(jìn)行關(guān)閉或者重啟的操作,因?yàn)榕渲弥械钠渌壿媯鋷?kù)將變成新主庫(kù)的備庫(kù),但是任何物理備庫(kù)還是原主庫(kù)的備庫(kù)。
8.新的邏輯備庫(kù)開(kāi)啟SQL應(yīng)用
新邏輯備庫(kù)上執(zhí)行SQL:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
本節(jié)介紹邏輯備庫(kù)的failover操作,邏輯備庫(kù)的failover必須對(duì)故障的主庫(kù)以及所有的邏輯備庫(kù)進(jìn)行正確的操作。另外如果主庫(kù)沒(méi)有開(kāi)啟閃回功能,那么就只能通過(guò)當(dāng)前主庫(kù)的備份來(lái)重建主庫(kù),或者通過(guò)主備庫(kù)切換解決該問(wèn)題。
根據(jù)數(shù)據(jù)庫(kù)配置的保護(hù)模式和重做傳輸服務(wù)的屬性,主庫(kù)可能會(huì)自主恢復(fù)所有或部分的修改操作。
1.將主庫(kù)未發(fā)送的重做日志發(fā)送到目標(biāo)備庫(kù)
如果主庫(kù)可以裝載(mounted),那么有可能可以將主庫(kù)未發(fā)送的重做日志發(fā)送到目標(biāo)備庫(kù)。如果該操作能成功執(zhí)行,那么零數(shù)據(jù)丟失的failover是可能的,即便主庫(kù)不是運(yùn)行在零數(shù)據(jù)丟失的保護(hù)模式下。
注意,該操作要確保目標(biāo)備庫(kù)的Redo Apply是開(kāi)啟的,并且主庫(kù)是mount狀態(tài)。
主庫(kù)執(zhí)行如下SQL:
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;
這里的target_db_name是指接收主庫(kù)傳來(lái)的重做日志的備庫(kù)的DB_UNIQUE_NAME,這個(gè)SQL將主庫(kù)未發(fā)送的重做日志刷到目標(biāo)備庫(kù),并且等待重做數(shù)據(jù)被應(yīng)用到備庫(kù)。
2.復(fù)制并注冊(cè)所有的歸檔重做日志到目標(biāo)邏輯備庫(kù),以使目標(biāo)邏輯備庫(kù)成為新的主庫(kù)。
根據(jù)配置的組件條件,你可以訪問(wèn)主庫(kù)的歸檔重做日志,那么:
確定邏輯備份數(shù)據(jù)庫(kù)是否有任何歸檔重做日志文件丟失;
從主數(shù)據(jù)庫(kù)復(fù)制丟失的日志文件到邏輯備份數(shù)據(jù)庫(kù);
注冊(cè)復(fù)制的日志文件。
邏輯備份數(shù)據(jù)庫(kù)注冊(cè)歸檔的重做日志文件:
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE - > '/disk1/oracle/dbs/log-%r_%s_%t.arc'; Database altered.
3.啟用LOG_ARCHIVE_DEST_STATE_n
如果之前沒(méi)有配置基于角色的歸檔傳輸路徑,配置新主庫(kù)對(duì)應(yīng)的遠(yuǎn)程邏輯備庫(kù)的初始化參數(shù)中的遠(yuǎn)程日志傳輸路徑,手動(dòng)啟用該參數(shù)。
比如啟用LOG_ARCHIVE_DEST_2:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;
為確保新主庫(kù)重啟后,此次做的更改仍然有效,可以將該參數(shù)寫(xiě)進(jìn)數(shù)據(jù)庫(kù)文本初始化參數(shù)文件,一般來(lái)說(shuō),當(dāng)數(shù)據(jù)庫(kù)是主庫(kù)角色時(shí),必須開(kāi)啟歸檔到遠(yuǎn)程目的地,如果是備庫(kù)角色,該參數(shù)就應(yīng)該disable。
4.激活新主庫(kù)
在目標(biāo)備庫(kù)上執(zhí)行SQL:
SQL> ALTER DATABASE ACTIVATE LOGICAL STANDBY DATABASE FINISH APPLY;
5.Failover后恢復(fù)其他備庫(kù)
確保現(xiàn)有的其他備庫(kù)繼續(xù)為新主庫(kù)提供保護(hù)。
6.備份新主庫(kù)
在執(zhí)行failover之后,備份新主庫(kù),立即執(zhí)行備份是一個(gè)必要的安全措施,因?yàn)闆](méi)有完整的數(shù)據(jù)庫(kù)備份,就不能在failover之后對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù)。
7.還原失敗的主庫(kù)
Failover之后,原主庫(kù)可以轉(zhuǎn)換成新主庫(kù)的邏輯備庫(kù),或者可以應(yīng)用新主庫(kù)的備份重建為邏輯備庫(kù)。一旦原主庫(kù)轉(zhuǎn)換為備庫(kù)角色,就可以通過(guò)swtichover重新轉(zhuǎn)換成主庫(kù)角色。
本文參閱Oracle官方文檔翻譯,不足之處歡迎批評(píng)指正!聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com