Data Guard实现故障自动切换(二)(r11笔记第39天)

简介:    今天下午我的一个朋友碰到了一个Data Guard的问题,大体是主备网络出现问题,因为环境中配置了自动切换,结果备库就自动切换为了主库,这样就成了“双主”,我帮忙看了下,对备库做了闪回,然后直接转换主库为备库角色,一个看似繁琐的修复工作就完成了。

   今天下午我的一个朋友碰到了一个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" added
DGMGRL> enable database sdataguru
Enabled.剩下的命令都主要是围绕这两个命令来服务的,查看一下配置成功后的信息情况。

DGMGRL> show configuration;
Configuration - dg_dataguru
  Protection Mode: MaxPerformance
  Databases:
    dataguru  - Primary database
    sdataguru - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS正如红色字体标识的,目前的主备是在最大性能模式下,我看很多文章说要配置Fast-Start Failover需要在最大高可用模式下,这是错误的,实际上在最大性能模式和最大高可用模式下均可。
   如果要开启Fast-Start Failover,单单使用enable选项是不够的。

DGMGRL> enable fast_start failover;
Error: ORA-16651: requirements not met for enabling fast-start failover
Failed查看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:  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)

在此你可能对故障自愈没有深刻的体验,我们就来实验一下。

主库直接shutdown abort
DG Broker中的observer的日志如下:

22:36:07.60  Tuesday, January 10, 2017
Initiating 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, 2017
Initiating 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" succeeded
22:38:24.08  Tuesday, January 10, 2017

就这样一个看似复杂的reinstate工作就自动修复了,无需手工干预和处理。

当然你要说这个过程中还有什么特别的研制,数据库层面来说,这种方式是非常好的,可以在这个基础上去借鉴更多的有点和细节之处。

    而这个方案的一个瓶颈就在于这个完全自动化的部分,如果出现了误判的情况,可能这时候问题就会很尴尬,会导致一些数据库切换的难解问题。

   从实践的角度和通用的角度来说,我们需要定义更多的规则和逻辑。这种方式可以作为一种非常好的参考理念。




目录
相关文章
|
弹性计算 网络协议 容灾
PostgreSQL 时间点恢复(PITR)在异步流复制主从模式下,如何避免主备切换后PITR恢复(备库、容灾节点、只读节点)走错时间线(timeline , history , partial , restore_command , recovery.conf)
标签 PostgreSQL , 恢复 , 时间点恢复 , PITR , restore_command , recovery.conf , partial , history , 任意时间点恢复 , timeline , 时间线 背景 政治正确非常重要,对于数据库来说亦如此,一个基于流复制的HA架构的集群,如果还有一堆只读节点,当HA集群发生了主备切换后,这些只读节点能否与新的主节点保持
1806 0
|
NoSQL Redis 容器
Redis集群报错cluster_state:fail,如何解决并重新恢复集群(IP问题/ slot未完全分配问题)
Redis集群报错cluster_state:fail,如何解决并重新恢复集群(IP问题/ slot未完全分配问题)
227 0
|
存储 NoSQL 数据库
无主复制系统(1)-节点故障时写DB概述
单、多主复制的思路都是:客户端向某主节点发写请求,而DB系统负责将写请求复制到其他副本。
94 0
|
SQL 监控 关系型数据库
Data Guard高级玩法:通过闪回恢复failover备库
    今天看到有一个网友提了一个问题,描述很简短     测试DG时,主库不能宕机,如何测试failover?     其实这个需求从业务层面来说是合理的,一个数据量很大的核心数据库,如果需要做灾难演练,就希望在备库上做一下演练工作,而这个演练其实又不想影响到目前的主库,而且又希望能够尽可能模拟真实的情况,我想这样对于运维部门来说是最具有考核力度,而对于开发业务部门来说是最受欢迎的,因为他们什么都不需要改动。
1129 0