Oracle 19C Data Guard基础运维-04 Failovers疑问?

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",共同学习,共同成长!!!

请使用浏览器的分享功能分享到微信等