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