本文為墨天輪數據庫管理服務團隊第149期技術分享,內容原創,作者為技術顧問達世德,如需轉載請聯繫小墨(VX:modb666)並註明來源。如需查看更多文章可關注【墨天輪】公眾號。
當ADG發生故障時的切換,我們稱之為高烈度切換。因為這個和你的生產系統是息息相關的。
模擬故障前建立保障(強制)還原點
查看主庫狀態
select database_role,protection_mode,open_mode from v$database;
查看數據庫的歸檔模式及是否啓用flashback database
archive log list;
select flashback_on from v$database;
創建保障(強制)還原點
create restore point orcl_rest_01 guarantee flashback database;
如果創建還原點有以下報錯的話:
SQL> create restore point orcl_rest_01 guarantee flashback database;
create restore point orcl_rest_01 guarantee flashback database
*
ERROR at line 1:
ORA-38784: Cannot create restore point 'ORCL_REST_01'.
ORA-38786: Recovery area is not enabled.
你需要創建一個數據庫恢復文件目錄:
創建數據庫文件恢復目錄
mkdir -p /u01/app/oracle/oradata/ORCL/dfa
指定數據庫文件恢復目錄的大小(最大空間使用量)
alter system set DB_RECOVERY_FILE_DEST_SIZE=5G scope=both;
在數據庫中指定數據庫文件恢復目錄的位置(用我們剛才創建出來的那個目錄)
alter system set db_recovery_file_dest='/u01/app/oracle/oradata/ORCL/dfa' scope=both;
再次查看一下狀態:
select flashback_on from v$database;
FLASHBACK_ON
------------------
RESTORE POINT ONLY
檢查備庫狀態
select database_role,protection_mode,open_mode from v$database;
從這裏開始試驗:
在主庫中我們直接使用shutdown abort來創造主庫意外崩潰:
shutdown abort
主庫執行如下操作,先保證主庫可已經入到mount:
startup mount
從oracle 11g開始有一個新特性叫flush redo,就是説如果主庫掛了,只要能mount,就可以將沒傳到備庫的online redo log信息刷到備庫去,
這樣就不會有數據丟失。
alter system flush redo to 'orclsd'; --這裏的是數據庫唯一名稱
在備庫查看備庫是否有gap
所謂的GAP就是當redo data 傳送發生中斷時就會產生redo gap。當redo傳送恢復正常以後,redo transport service 會自動檢測redo gap併發送缺失的redo 到destination。解決redo gap的時間與gap 的數量和網絡有一定的關係。 Gap越少,網絡越好,解決gap就會越快。
select thread#, low_sequence#, high_sequence# from v$archive_gap;
#######################################################
如果有GAP就需要把查詢出來的歸檔日誌給發送到備庫上。
比如説:
select thread#, low_sequence#, high_sequence# from v$archive_gap;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
----------- ------------- --------------
1 8 11
主庫查詢確認一下
SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 11;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/arch/arcr_1_8.arc
/u01/app/oracle/oradata/ORCL/arch/arcr_1_9.arc
/u01/app/oracle/oradata/ORCL/arch/arcr_1_10.arc
THREAD根據SELECT * FROM V$ARCHIVE\_GAP;這條語句定義
- DEST\_ID=1 你定義的第一個歸檔目錄本地的那個
- BETWEEN後的值儘量用SELECT * FROM V$ARCHIVE\_GAP;得到的LOW\_SEQUENCE#的值-1
- AND後的值就是SELECT * FROM V$ARCHIVE\_GAP;得到的HIGH\_SEQUENCE#的值
然後把找到的歸檔發送到備庫,並使用ALTER DATABASE REGISTER LOGFILE應用這些歸檔:
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/oradata/ORCL/arch/arcr_1_8.arc';
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/oradata/ORCL/arch/arcr_1_9.arc';
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/oradata/ORCL/arch/arcr_1_10.arc';
###########################################################
備庫切換成主庫
在備庫上發生的:
取消和停止日誌應用
alter database recover managed standby database cancel;
alter database recover managed standby database finish;
注意:如果主庫和備庫之間的網絡中斷了,那麼備庫的RFS(remote file server)進程就會等待網絡的連接,直到TCP超時。此時需要加上force關鍵字
alter database recover managed standby database finish force;(網絡沒有問題就不用執行了)
查看可切換狀態
select open_mode, switchover_status from v$database;
OPEN_MODE SWITCHOVER_STATUS
-------------------- --------------------
READ ONLY TO PRIMARY
切換成主庫
alter database commit to switchover to primary with session shutdown;
select open_mode, switchover_status from v$database;
OPEN_MODE SWITCHOVER_STATUS
-------------------- --------------------
MOUNTED NOT ALLOWED
嘗試關閉數據庫
shutdown immediate;
重新啓動數據庫
startup
檢查可切換狀態
select open_mode, switchover_status from v$database;
OPEN_MODE SWITCHOVER_STATUS
-------------------- --------------------
READ WRITE FAILED DESTINATION
恢復主庫
關閉主庫
shutdown immediate
重新開啓主庫到mount狀態
startup mount;
查看還原點信息
select flashback_on from v$database;
FLASHBACK_ON
------------------
RESTORE POINT ONLY
使用還原點閃回還原數據庫
flashback database to restore point orcl_rest_01;
還原成功後可以刪除該還原點,但是建議保留一會
drop restore point orcl_rest_01;
切換到物理備庫
alter database convert to physical standby;
關閉數據庫
shutdown immediate;
重新打開數據庫
startup
開啓實時日誌應用
alter database recover managed standby database using current logfile disconnect from session;
如果上一步你刪除了還原點這裏可以檢查是否刪除乾淨,沒有的話以後再説
select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
檢查主庫狀態
select database_role,protection_mode,open_mode from v$database;
DATABASE_ROLE PROTECTION_MODE OPEN_MODE
---------------- -------------------- --------------------
PHYSICAL STANDBY MAXIMUM PERFORMANCE READ ONLY WITH APPLY
最後別忘記再檢查一下備庫狀態
select database_role,protection_mode,open_mode from v$database;
墨天輪從樂知樂享的數據庫技術社區蓄勢出發,全面升級,提供多類型數據庫管理服務。墨天輪數據庫管理服務旨在為用户構建信賴可託付的數據庫環境,併為數據庫廠商提供中立的生態支持。
墨天輪數據庫服務官網:https://www.modb.pro/service