Oracle 11g Data Guard 之邏輯備庫角色轉換
邏輯備庫不復制資料庫服務,在進行switchover或者failover時,連線主庫服務的中間層將不能連線(因為服務的建立沒有被複制),或者連線不正確的版本(因為服務屬性的修改沒有被複制)。
Oracle叢集不復制管理邏輯備庫的服務,必須手動對主庫與備庫進行同步,具體的詳參Oracle叢集管理和部署的相關內容。
一.邏輯備庫的switchover操作
當進行switchover操作來改變主庫和邏輯備庫的角色時,總是在主庫啟動switchover,然後在邏輯備庫完成操作,其中的步驟必須按順序,否則將不能成功執行switchover。
1.確保主庫可以進行switchover操作
通過查詢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;
該語句將等待當前所有主庫停止所有的事務以及防止任何新使用者啟動新事務,並且建立切換提交的時間點。
該語句還將防止使用者對邏輯備庫的資料做任何的修改操作,為了確保快速執行完,執行該switchover語句前確保主庫在沒有更新活動的靜止狀態,比如,所有使用者暫時不要登入主庫。可以通過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操作,邏輯備庫的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。
該語句關閉RFS程序,在目標備庫成為新主庫之前,應用目標備庫中剩下的重做日誌,然後停止SQL應用,啟用主庫。如果沒有FINISH APPLY子句,那麼在目標備庫轉為主庫角色前,當前目標備庫不會應用還未應用的重做日誌。4.啟用新主庫
在目標備庫上執行SQL:
SQL> ALTER DATABASE ACTIVATE LOGICAL STANDBY DATABASE FINISH APPLY;
5.Failover後恢復其他備庫
確保現有的其他備庫繼續為新主庫提供保護。
6.備份新主庫
在執行failover之後,備份新主庫,立即執行備份是一個必要的安全措施,因為沒有完整的資料庫備份,就不能在failover之後對資料庫進行恢復。
7.還原失敗的主庫
Failover之後,原主庫可以轉換成新主庫的邏輯備庫,或者可以應用新主庫的備份重建為邏輯備庫。一旦原主庫轉換為備庫角色,就可以通過swtichover重新轉換成主庫角色。
本文參閱Oracle官方文件翻譯,不足之處歡迎批評指正!