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