Oracle 19C Data Guard基礎運維-04 Failovers疑問?

chenoracle發表於2020-04-18

Oracle 19C Data Guard 基礎運維 -0 4 Failovers 疑問?

原主庫

原備庫

 

Failovers

新主庫

獨立庫

192.168.31.90

192.168.31.100

192.168.31.100

192.168.31.90

cjcdb

chendb

chendb

cjcdb

Failover

https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/data-guard-concepts-and-administration.pdf

Figure 9-4 Failover to a Standby Database 

Performing a Failover to a Physical Standby Database  

關於failover的疑問?

模擬主庫意外當機,並且存在archive gap ,檢視歸檔檔案有 3 個歸檔檔案沒有傳到備庫,但是在備庫端檢視 v$archive_gap 顯示卻是空的? 並且沒有使用過 snapshot standby ,在備庫端執行 ALTER DATABASE FAILOVER TO chendb ; 時沒有報錯提示,由於歸檔缺失,備庫failover 成功後,丟失了大量資料。

為什麼備庫明明有archive gap 但在 v$archive_gap 裡查詢不到呢?在存在 archive gap 時,為什麼備庫執行 ALTER DATABASE FAILOVER TO chendb; 可以成功,最終導致資料丟失呢?

實驗過程如下:

場景二:有歸檔間隙

主庫模擬故障,模擬歸檔gap

先停掉備庫: 不接收主庫產生的 redo 或歸檔資料

SQL> shutdown immediate

主庫:生成測試資料,生成redo 和歸檔資料

---session 1

SQL>

declare

begin

  for i in 1 .. 1000 000  loop

    insert into test1 values (i);

    commit;

  end loop;

end;

插入資料期間,生成了3 個歸檔檔案

[oracle@cjcos01 arch]$ pwd

/arch

......

cjcpdb_arch_1_74_1030641846.arc

cjcpdb_arch_1_75_1030641846.arc

cjcpdb_arch_1_76_1030641846.arc

強制關閉主庫

SQL> shutdown abort

主庫重新命名新產生的三個歸檔檔案,模擬歸檔gap

[oracle@cjcos01 arch]$ mv cjcpdb_arch_1_74_1030641846.arc cjcpdb_arch_1_74_1030641846.arc.bak

[oracle@cjcos01 arch]$ mv cjcpdb_arch_1_75_1030641846.arc cjcpdb_arch_1_75_1030641846.arc.bak

[oracle@cjcos01 arch]$ mv cjcpdb_arch_1_76_1030641846.arc cjcpdb_arch_1_76_1030641846.arc.bak

主庫重新命名system01.dbf 模擬資料庫故障

[oracle@cjcos01 arch]$ cd /u01/app/oracle/oradata/CJCDB/

[oracle@cjcos01 CJCDB]$ mv system01.dbf system01.dbf.bak

主庫啟動失敗

SQL> startup

ORACLE instance started.

Total System Global Area 1375728192 bytes

Fixed Size       9134656 bytes

Variable Size    1107296256 bytes

Database Buffers   251658240 bytes

Redo Buffers       7639040 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: '/u01/app/oracle/oradata/CJCDB/system01.dbf'

SQL> select open_mode from v$database;

OPEN_MODE

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

MOUNTED

啟動備庫:

1. 檢查 dg 恢復模式

SQL> select database_role,protection_level,protection_mode from v$database;

DATABASE_ROLE  PROTECTION_LEVEL     PROTECTION_MODE

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

PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

2 檢查 archive_gap ,顯示沒有歸檔gap?

SQL> select thread#, low_sequence#, high_sequence# from v$archive_gap;

no rows selected

檢視備庫歸檔日誌確實少了3個 (74,75,76),但是為什麼 v$archive_gap沒有資料呢?

3 備庫取消 DG 應用 ( 關閉 MRP)

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

Database altered.

4 嘗試備庫在缺少歸檔日誌情況下執行 failover, 居然沒有報錯?

SQL> ALTER DATABASE FAILOVER TO chendb;

Database altered.

也可以正常open 資料庫

SQL> alter database open;

Database altered.

由於缺失歸檔,所有在執行完failover後,丟失了 999999條資料。

SQL> Select * from test1;

ID

---

1

歡迎關注我的微信公眾號"IT小Chen",共同學習,共同成長!!!

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

相關文章