如果切換環境是RAC,無論主或備,切換前均只保留一個節點,切換後正常啓動即可。

一、當前架構檢查 (A→B→C)

1. 檢查主庫A狀態

-- 在主庫A執行
SELECT DATABASE_ROLE, OPEN_MODE, SWITCHOVER_STATUS, PROTECTION_MODE FROM V$DATABASE;
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;

預期結果:

DATABASE_ROLE = 'PRIMARY'
OPEN_MODE = 'READ WRITE'
SWITCHOVER_STATUS = 'TO STANDBY' 或 SESSION ACTIVE

2. 檢查備庫B狀態

-- 在備庫B執行
SELECT DATABASE_ROLE, OPEN_MODE, SWITCHOVER_STATUS FROM V$DATABASE;
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES';

預期結果:

DATABASE_ROLE = 'PHYSICAL STANDBY'
OPEN_MODE = 'READ ONLY'
與主庫A的日誌序列號差距應小於3

3. 檢查備庫C狀態

-- 在備庫C執行
SELECT DATABASE_ROLE, OPEN_MODE, SWITCHOVER_STATUS FROM V$DATABASE;
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES';

預期結果:

DATABASE_ROLE = 'PHYSICAL STANDBY'
OPEN_MODE = 'READ ONLY'
與備庫B的日誌序列號差距應小於3

二、切換為C→B→A架構

1. 將C庫轉換MOUNT

-- 停止當前恢復進程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

2. 將A庫轉換為B的備庫

-- 停止當前恢復進程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 檢查切換狀態
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

-- 轉換為B的備庫
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;

-- 啓動新的恢復進程(指向B庫)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=B_primary ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=B' SCOPE=BOTH;
ALTER DATABASE MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

3. 將B庫提升為主庫

-- 停止當前恢復進程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 檢查切換狀態
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

-- 切換為主庫
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

-- 啓動新主庫
ALTER DATABASE OPEN;

-- 驗證主庫狀態
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

預期結果:

DATABASE_ROLE = 'PRIMARY'
OPEN_MODE = 'READ WRITE'

A和C 都是MOUNT 狀態,且都是 B 的從庫,查看日誌,是否同步正常

ALTER SYSTEM SWITCH LOGFILE;

4. 將B庫降為備庫

-- 停止當前恢復進程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 檢查切換狀態
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

-- 轉換為C的備庫
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;

-- 啓動新的恢復進程(指向C庫)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=C_primary ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=C' SCOPE=BOTH;
ALTER DATABASE MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

5. 將C庫提升為主庫

-- 停止當前恢復進程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 檢查切換狀態
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

-- 切換為主庫
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

-- 啓動新主庫
ALTER DATABASE OPEN;

-- 驗證主庫狀態
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

預期結果:

DATABASE_ROLE = 'PRIMARY'
OPEN_MODE = 'READ WRITE'

6. 驗證新架構(C→B→A)

在C庫(新主庫)檢查:

SELECT DEST_ID, STATUS, ERROR, TYPE, DESTINATION FROM V$ARCHIVE_DEST_STATUS WHERE STATUS <> 'INACTIVE';

在B庫檢查:

SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# DESC;
SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;

在A庫檢查:

SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# DESC;
SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;