前面介绍了 Oracle DG 手动 SwitchOver & Failover及Failover后利用闪回恢复主从同步 和 Oracle DG Broker 进行 SwitchOver & Failover及Failover后恢复主从同步
这篇来看下DG的自动切换方法 —— Fast-Start Fail Over。
FSFO允许代理在主库故障的情况下自动故障转移到先前选择的备库,无需手动执行任何步骤,以便快速可靠地恢复业务。FSFO只能在代理配置中使用,并且只能通过DGMGRL或OEM进行配置。
FSFO支持在最高可用性与最高性能模式下使用。最大可用性模式保证不会丢失任何数据,最高性能模式可保证丢失的数据量不超过FastStartFailoverLagLimit
属性指定的数据量(单位为秒)。
配置完成后,FSFO将在以下情况下起作用:
FastStartFailoverThreshold
属性配置阈值(单位为秒)Health Condition | Description | 默认启用 |
---|---|---|
Datafile Offline | 数据文件由于写错误脱机 | Yes |
Corrupted Dictionary | 关键数据库对象的字典损坏,该状态可在数据库open时被检测到 | Yes |
Corrupted Controlfile | 控制文件由于写入错误永久损坏 | Yes |
Inaccessible Logfile | 由于IO错误,LGWR无法写入日志组的任何成员 | No |
Stuck Archiver | 由于设备已满或不可用,归档进程无法归档redo log | No |
Observer是一个OCI(Oracle Call Interface)客户端组件,通常运行在独立服务器并监视主库可用性。
Observer 应安装在独立的服务器上,与主、备服务器分开。DGMGRL包含Observer 软件,因此要在独立的服务器上安装DGMGRL。安装方法有以下两种:
顾名思义,Observer可以观察主备库之间的活动,决定是否进行FSFO,因此我们需要在连接性最高的服务器上安装Observer。FSFO可能会导致错误的故障转移,即使主库正在运行并且可以在本地访问,也可能会发生FSFO;如果客户端无法访问主库,也可能不发生FSFO。
DG稳定运行,主库将REDO数据传输到备库,Observer监视整体状态。
主库遇到灾难,并且它与Observer和目标备库均失联。在检测到通信中断后,Observer在FastStartFailoverThreshold
指定时间内尝试重连主库,如果还是无法连接,且目标备库已准备好进行FSFO,则将发生FSFO。
FSFO已完成,并且目标备库以主库角色运行。在修复了原主库之后,Observer将重建与该数据库的连接,并将其恢复为新主库的备库。新主库开始将重做数据传输给它。
最简单的方法只需要配置Observer并enable fast_start failover; 即可。
参考 https://blog.csdn.net/shiyu1157758655/article/details/55504518
下面是按照官方文档配置推荐的主要参数。
DGMGRL> connect sys/oracle
Connected.
DGMGRL> show configuration;
Configuration - dgconfig1
Protection Mode: MaxPerformance
Databases:
testdb - Primary database
std_testdb - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status: SUCCESS
只能为当前主库设置一个目标转移备库,若只有一个备库,此步骤可忽略。若要修改目标转移备库,需要先禁用FSFO,改完后再启用。
DGMGRL> EDIT DATABASE TESTDB SET PROPERTY FASTSTARTFAILOVERTARGET=STD_TESTDB;
Property "faststartfailovertarget" updated
DGMGRL> EDIT DATABASE STD_TESTDB SET PROPERTY FASTSTARTFAILOVERTARGET=TESTDB;
Property "faststartfailovertarget" updated
LOGXPTMODE属性在最大可用性模式下应为SYNC,在最大性能模式下应为ASYNC,主备库LOGXPTMODE设置必须相同
DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MaxAvailability;
DGMGRL> edit database orcl set property 'LogXptMode'='ASYNC';
DGMGRL> edit database orcl_dg set property 'LogXptMode'='ASYNC';
如果主库与 Observer和目标备库 失联时间均超过FastStartFailoverThreshold
属性配置阈值(单位为秒),将启动FSFO。
换句话说,FastStartFailoverThreshold
表示,Observer和目标备库 在检测到主库不可用后、希望等多少秒才启动FSFO。再此期间,它们会尝试重连主库。
默认值为30秒,最小6秒。
DGMGRL> edit configuration set property faststartfailoverthreshold=300;
FastStartFailoverLagLimit表示,自动故障转移允许的最大数据丢失量(单位为秒),仅在最高性能保护模式时才可使用。
FastStartFailoverLagLimit作为DG可接受的最大延迟时间,备库的apply lag只有在此限制之内,才允许FSFO。
如果无法维持已配置的数据丢失保证,主库上的redo生成将停止。为了避免长时间停顿,Observer或者目标备库可能会在第一次记录到无法发生FSFO之后,允许主库继续生成redo。此时若主库故障,将无法发生FSFO。
默认值为30秒,最小值为10秒。
DGMGRL> edit configuration set property faststartfailoverlaglimit=50;
默认为true,表示在FastStartFailoverThreshold
属性指定的秒数过去之后,使用ABORT选项关闭主数据库。
如果不希望由于 主库redo生成停止 或 主库与Observer和目标备库 失联时间超过FastStartFailoverThreshold
指定时间而在触发FSFO后关闭主库,需要将其设置为假。
DGMGRL> edit configuration set property FastStartFailoverThreshold=false;
如果FastStartFailoverAutoReinstate
属性设置为TRUE
,在原主库故障修复后,会自动尝试将其恢复为新主库的备库。
DGMGRL> EDIT CONFIGURATION SET PROPERTY FASTSTARTFAILOVERAUTOREINSTATE=TRUE;
Property "faststartfailoverautoreinstate" updated
ObserverConnectIdentifier用于指定Observer应如何连接并监视主备库。如果希望Observer使用不同于发送重做数据连接串的连接标识符,请为主库和目标备库设置此属性(可选)。
配置Observer(可选)
dgmgrl sys/xxxx@OBSRV_ORCL_DGMGRL
DGMGRL>edit database orcl set property ObserverConnectIdentifier='OBSRV_ORCL_DGMGRL';
DGMGRL>edit database orcl_dg set property ObserverConnectIdentifier='OBSRV_ORCL_DG_DGMGRL';
启动Observer
[oracle@localhost oradata]$ dgmgrl
...
DGMGRL> connect sys/oracle@testdb
Connected.
DGMGRL> start observer;
Observer started
DGMGRL> enable fast_start failover;
Enabled.
启用Fast_Start Failover时alert日志如下:
Fast-Start Failover (FSFO) has been enabled between:
Primary = "testdb"
Standby = "std_testdb"
Sat Jun 23 15:49:22 2018
FSFP started with pid=69, OS id=17552
DGMGRL> show fast_start failover;
Fast-Start Failover: ENABLED
Threshold: 50 seconds
Target: std_testdb
Observer: test1.localdomain
Lag Limit: 50 seconds (not in use)
Shutdown Primary: TRUE
Auto-reinstate: TRUE
Observer Reconnect: (none)
Observer Override: FALSE
Configurable Failover Conditions
Health Conditions:
Corrupted Controlfile YES
Corrupted Dictionary YES
Inaccessible Logfile NO
Stuck Archiver NO
Datafile Offline YES
Oracle Error Conditions: (none)
也可以从v$database视图检查
SELECT fs_failover_status,
fs_failover_current_target,
fs_failover_threshold,
fs_failover_observer_present,
fs_failover_observer_host
FROM v$database;
测试环境描述: | ||||
1 | 操作系统: | SUSE Linux 11 | ||
2 | Oracle Cluster版本: | N/A | ||
3 | Oracle数据库版本: | 12.1.0.2 | ||
4 | 架构: | Dataguard+FSFO | ||
编号 | 描述 | 测试动作 | 预期结果 | 实际结果/备注 |
1 | 计划外主库实例挂掉 | kill -9 pid_of_smon 或者 SQL > shutdown abort |
Primary instance crash,standby instance进行切换。 切换后,原standby instance成primary instance. 在dgmgrl控制台可以看到ORA-16829: fast-start failover configuration is lagging,且原primary instance可以看到ORA-16661: the standby database needs to be reinstated |
2分钟左右完成切换 |
2 | 计划外备库实例挂掉 | kill -9 pid_of_smon 或者 SQL > shutdown abort |
dgmgrl控制台主库报错ORA-16810: multiple errors or warnings detected for the database,备库报错ORA-01034: ORACLE not available | 备库挂掉,应用不受影响 |
3 | 计划内关闭主库 | SQL > shutdown immediate | 主备库不切换,在dgmgrl控制台可以看到主库报错:Error: ORA-01034: ORACLE not available,备库提示信息:(*) Physical standby database | 计划内维护 |
4 | 计划内关闭备库 | SQL > shutdown immediate | 主备库不切换,在dgmgrl控制台可以看到主库报错:ORA-16829: fast-start failover configuration is lagging,备库提示信息:(*) Physical standby database (disabled) | 计划内维护 |
5 | 重新启动失败数据库实例 | SQL > startup | 启动原primary库之后,自动变成physical standby角色。在完成Clearing online log之后,进行mrp的介质恢复。 在dgmgrl控制台,看到原primary状态从ORA-16661: the standby database needs to be reinstated,变成ORA-16657: reinstatement of database in progress,继而变成ORA-16829: fast-start failover configuration is lagging,待lag补齐之后最终变成Physical standby database |
重启的原primary库恢复正常大约5~10分钟,重启期间应用完全不受影响。 |
6 | 主库监听挂掉 | kill -9 pid_of_listener | 应用无法连接。 主库和备库之间如果没有lag,处于standby redolog的recovery,则不受影响。 主库和备库之间如果有lag,则当备库启动时,需要使用archivelog的recovery,就会报错 ORA-01196: file n is inconsistent due to a failed media recovery session。Dgmgrl控制台报错备库 ORA-16664: unable to receive the result from a database |
监听挂掉,应用无法连接数据库,需要手工启动监听。 注:已经添加自动重启监听脚本,发现监听宕掉,自动拉起监听。 |
7 | 备库监听挂掉 | kill -9 pid_of_listener | 应用正常连接。 主库和备库之间如果没有lag,处于standby redolog的recovery,则不受影响。 主库和备库之间如果有lag,dgmgrl控制台主库报错:ORA-16810: multiple errors or warnings detected for the database,备库报错:ORA-12541: TNS:no listener 备库启动时,需要使用archivelog的recovery,就会报错 ORA-01196: file n is inconsistent due to a failed media recovery session。Dgmgrl控制台报错备库 ORA-16664: unable to receive the result from a database |
应用连接正常,需要手工启动备库监听 注:已经添加自动重启监听脚本,发现监听宕掉,自动拉起监听。 |
8 | 计划内切换主备库 | DGMGRL> switchover to 'fltrec_dg'; | 在切换期间,应用连接报错ORA-16456: switchover to standby in progress or completed。 切换后,应用恢复正常。 |
大约2分钟左右完成切换 |
参考
https://docs.oracle.com/cd/E11882_01/server.112/e40771/sofo.htm#DGBKR390
https://www.oracle.com/technetwork/cn/tutorials/smiley-fsfo-088047-zhs.html
http://oracle-help.com/dataguard/configuring-fast-start-fail-over/
https://blog.csdn.net/Hehuyi_In/article/details/94384431
https://blog.csdn.net/Hehuyi_In/article/details/105258110
How to run Observer process as a background process (文档 ID 1084681.1)