Data Guard实现故障自动切换(二)(r11笔记第40天)
公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2017-01-10 23:55:15 · 原文链接
今天下午我的一个朋友碰到了一个Data Guard的问题,大体是主备网络出现问题,因为环境中配置了自动切换,结果备库就自动切换为了主库,这样就成了“双主”,我帮忙看了下,对备库做了闪回,然后直接转换主库为备库角色,一个看似繁琐的修复工作就完成了。
在一个一主多备的环境中,的确需要一个强大的工具来支持,所以最后朋友说DG Broker真是个好东西,我回了句 用好了DG Broker,手工管理Data Guard就是小米加步枪啊。
就如同我昨天文章Data Guard故障自动切换的想法(r11笔记第39天)所说,自动切换也是故障自愈的一个关键环节。而其中Oracle自带的Fast-Start Failover就是一个相对不错的选择,如果你的环境网络层面做了统一的管理规划,只关注数据层面的自动切换,这个自带的方案其实很强悍,在主库发生宕机或者数据库问题的时候,可以自动将备库切换为主库,实现一些较为复杂的自动化切换需求。
我们先来示范一下,看看它的好,然后说说它的限制和改进之处。
首先就是DG Broker最基础的两个命令了。
第一个命令是创建配置,添加主节点
DGMGRL> create configuration dg_dataguru as> primary database is dataguru> connect identifier is dataguru;Configuration "dg_dataguru" created with primary database "dataguru"启用一下配置
DGMGRL> enable configuration;
第二个命令是添加备库节点
DGMGRL> add database sdataguru as> connect identifier is sdataguru> maintained as physical;Database "sdataguru" addedDGMGRL> enable database sdataguruEnabled.剩下的命令都主要是围绕这两个命令来服务的,查看一下配置成功后的信息情况。
DGMGRL> show configuration;Configuration - dg_dataguru Protection Mode: MaxPerformance Databases: dataguru - Primary database sdataguru - Physical standby databaseFast-Start Failover: DISABLEDConfiguration Status:SUCCESS正如红色字体标识的,目前的主备是在最大性能模式下,我看很多文章说要配置Fast-Start Failover需要在最大高可用模式下,这是错误的,实际上在最大性能模式和最大高可用模式下均可。
如果要开启Fast-Start Failover,单单使用enable选项是不够的。
DGMGRL> enable fast_start failover;Error: ORA-16651: requirements not met for enabling fast-start failoverFailed查看oerr ora 16651你会看到一屏幕的提示信息,把要点都说全了。我点几个主要的点
1.主备库需要开启闪回数据库
主库开启在open状态下即可,非常方便,至于为什么主库需要开启,主要是作为reinstate来铺垫的,是故障自愈的一个环节。
SQL> alter database flashback on;Database altered.
备库开启闪回数据库略有不同,大体步骤如下:
SQL> recover managed standby database cancel;Media recovery complete.SQL> alter database flashback on;Database altered.SQL> recover managed standby database disconnect from session;Media recovery complete. --最后的步骤或者使用enable database的方式也可以2.主备库的网络配置
这个其实根据我的了解,绝大多数的系统中都是会忽略掉这个配置,因为对于基本的Switchover,Failover来说也够用了,所以有的同学也会偷懒不配置了。
一个简单的listener.ora的配置如下:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = newtest.oracle.com)(PORT = 1521)) ) ) )
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = dataguru) (ORACLE_HOME = /U01/app/oracle/product/11.2.0.4) (SID_NAME = dataguru) ) (SID_DESC = (GLOBAL_DBNAME=DATAGURU_DGMGRL) (ORACLE_HOME = /U01/app/oracle/product/11.2.0.4) (SID_NAME = dataguru) ) )重点就是红色的部分,基本格式就是<DB_Unique_Name>_DGMGRL
配置后要确保监听的服务正确注册了,重启对应的监听保证服务使用无误。
备库的配置也是类似的形式,就不重复贴出了。
2.主备延迟,Failover的一些触发条件
设置数据库的切换优先级,可以配置FastStartFailoverTarget
如果我要设置数据库sdataguru的Failover对象为dataguru,就可以使用如下的命令。
edit database sdataguru set property FastStartFailoverTarget=dataguru;
如果主备的设置为最大高可用保护模式,则需要设置LogXptMode为sync
如果主备的设置为最大性能保护模式,则需要设置LogXptMode为async
启用FastStart Failover
DGMGRL> enable fast_start failover;Enabled.DGMGRL> start observer ;Observer started查看状态的信息如下,有几点需要注意的就是我们可以设置Lag Limit,Observer Reconnect等属性。
DGMGRL> show fast_start failover;Fast-Start Failover: ENABLED Threshold: 30 seconds Target: dataguru Observer: snewtest2.cyou.com Lag Limit: 30 seconds Shutdown Primary: TRUE Auto-reinstate: TRUE Observer Reconnect: (none) Observer Override: FALSEConfigurable Failover Conditions Health Conditions: Corrupted Controlfile YES Corrupted Dictionary YES Inaccessible Logfile NO Stuck Archiver NO Datafile Offline YES
Oracle Error Conditions: (none)
在此你可能对故障自愈没有深刻的体验,我们就来实验一下。
主库直接shutdown abort
DG Broker中的observer的日志如下:
22:36:07.60 Tuesday, January 10, 2017Initiating Fast-Start Failover to database "sdataguru"...Performing failover NOW, please wait...Failover succeeded, new primary is "sdataguru"22:36:16.52 Tuesday, January 10, 2017可以清晰的看到,是做了Failover的操作。
对于故障自愈,如果主库已经修复,可以正常启动,那么就会自动触发由主库调整为备库,也就是我们开头所说的reinstate.
我们只需要把数据库启动到mount阶段,然后静观日志变化。22:37:34.67 Tuesday, January 10, 2017Initiating reinstatement for database "dataguru"...Reinstating database "dataguru", please wait...Operation requires shutdown of instance "dataguru" on database "dataguru"Shutting down instance "dataguru"...ORA-01109: database not open
Database dismounted.ORACLE instance shut down.Operation requires startup of instance "dataguru" on database "dataguru"Starting instance "dataguru"...ORACLE instance started.Database mounted.Continuing to reinstate database "dataguru" ...Reinstatement of database "dataguru" succeeded22:38:24.08 Tuesday, January 10, 2017
就这样一个看似复杂的reinstate工作就自动修复了,无需手工干预和处理。
当然你要说这个过程中还有什么特别的研制,数据库层面来说,这种方式是非常好的,可以在这个基础上去借鉴更多的有点和细节之处。
而这个方案的一个瓶颈就在于这个完全自动化的部分,如果出现了误判的情况,可能这时候问题就会很尴尬,会导致一些数据库切换的难解问题。
从实践的角度和通用的角度来说,我们需要定义更多的规则和逻辑。这种方式可以作为一种非常好的参考理念。
