“alter database switchover to xx“過程不當導致的primary-primary 雙主問題

darren__chan發表於2021-12-24

關於切換時primary-primary 雙主問題,看起來是因為使用“alter database switchover to xx” 執行切換時的流程上缺陷問題:

首先在以往傳統的switchover切換方式下,切換的流程是這樣的:

假如當前A庫(primary),B庫(standby)

1. 在A庫(primary)庫上,執行切換語句"alter database commit to switchover to physical standby with session shutdown"。此時主庫A在最後一個redo檔案頭中的EOR(End-of-redo)置為YES,表示其是當前作為主庫的最後一個日誌。

           --dump出最後一個歸檔檔案頭:

ALTER SYSTEM DUMP LOGFILE '/home/oracle/archive/1_59_1047029376.dbf' RBA MIN 1 1 RBA MAX 1 1; 

 

 DUMP OF REDO FROM FILE '/home/oracle/archive/1_59_1047029376.dbf'

Container ID: 0

Container UID: 0

Opcodes *.*

Container ID: 0

Container UID: 0

RBAs: 0x000001.00000001.0000 thru 0x000001.00000001.0000

SCNs: scn: 0x0000000000000000 thru scn: 0xffffffffffffffff

                 ……..

Largest LWN: 0 blocks

End-of-redo stream : Yes <<<<<<<<<<<

             Unprotected mode

2. A庫將這個日誌傳送到B(standby)庫上。

3. B庫接收到這個日誌後並應用到EOR(End-of-redo)時,才將v$database.switchover_status從"not allowed"  切換為 "to primary" 為 "sessions active". 此時B standby庫便可以開始進行切換為主庫。

4. 原standby庫b庫在沒有接收到EOR前,v$database.switchover_status時not allowed,代表不會出現 primary-primary情況出現。

當在19c下使用alter database switchover to xx的方法切換,其流程如下:

     假如依然如同以上A庫(primary),B庫(standby),

1. 此時我在A庫上執行alter database switchover to B;命令,將主庫切換到B庫;

2. 開始切換後,A庫會傳送角色轉換的指令到B庫(standby),此時,B庫角色提升為primary,B庫例項重新啟動到MOUNT狀態下:


OPEN_MODE           DATABASE_ROLE    SWITCHOVER_STATUS

-------------------- ---------------- --------------------

MOUNTED               PRIMARY              NOT ALLOWED

3. A庫則被shutdown abort掉,重新啟動A庫並啟動應用日誌時,此時的switchover_status狀態變為to primary:

啟動到mount狀態:

OPEN_MODE           DATABASE_ROLE    SWITCHOVER_STATUS

-------------------- ---------------- --------------------

MOUNTED               PHYSICAL STANDBY RECOVERY NEEDED


啟動日誌應用:

OPEN_MODE           DATABASE_ROLE    SWITCHOVER_STATUS

-------------------- ---------------- --------------------

MOUNTED               PHYSICAL STANDBY TO PRIMARY



  4.檢視alert日誌發現時A庫recover了65號歸檔,這個歸檔其實A庫做primary庫時的最後一個歸檔。

2021-09-24T17:48:32.739450+08:00

TT02 (PID:40943): LOG_FILE_NAME_CONVERT is not defined, stop clearing ORLs

2021-09-24T17:48:32.870791+08:00

PR00 (PID:40937): Media Recovery Log /home/oracle/archive/1_65_1047029376.dbf

2021-09-24T17:48:32.941701+08:00

PR00 (PID:40937): Resetting standby activation ID 0 (0x0)

2021-09-24T17:48:32.944149+08:00

   對這個歸檔的檔案頭dump出來時發現其EOR是YES.如上面的機制所說,這也是為何此時A庫的狀態可以為to primary的原因:

          

DUMP OF REDO FROM FILE '/home/oracle/archive/1_65_1047029376.dbf'

Container ID: 0

Container UID: 0

Opcodes *.*

Container ID: 0

Container UID: 0

RBAs: 0x000001.00000001.0000 thru 0x000001.00000001.0000

SCNs: scn: 0x0000000000000000 thru scn: 0xffffffffffffffff

Times: creation thru eternity

FILE HEADER:

        Compatibility Vsn = 318767104=0x13000000

        Db ID=2146799166=0x7ff58e3e, Db Name='ORCL193'

        Activation ID=2183894505=0x822b95e9

        Control Seq=1084123756=0x409e6a6c, File size=409600=0x64000

        File Number=3, Blksiz=512, File Type=2 LOG

…….

End-of-redo stream : Yes<<<<<<<<<<

Unprotected mode

Miscellaneous flags: 0x88000a9

Miscellaneous second flags: 0x0

Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000000000000000

  此時,你剛好再去將B庫提升為主庫,便出現primary-primary 雙主的情況了。


  5.這應該是一種流程上的缺陷,因為在原standby庫B庫提升為primary後,應該先將其open起來,再到新的standby庫啟動應用日誌,此時新的standby庫應用到新主庫的日誌,switchover_status的狀態便變回not allowed:


2021-09-24T18:35:31.461468+08:00

PR00 (PID:40937): Media Recovery Log /home/oracle/archive/1_66_1047029376.dbf

PR00 (PID:40937): Media Recovery Waiting for T-1.S-67 (in transit)


OPEN_MODE           DATABASE_ROLE    SWITCHOVER_STATUS

-------------------- ---------------- --------------------

MOUNTED               PHYSICAL STANDBY NOT ALLOWED


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29863023/viewspace-2849184/,如需轉載,請註明出處,否則將追究法律責任。

相關文章