Data Guard是oracle数据库容灾非常合适的解决方案,并且随着oracle产品的迭代不断进化完善。Active Data Guard Far Sync是Oracle 12c引入的新功能(也称为Far Sync Standby)。
传统的ADG主要由主备库组成,redo数据直接传输到备库,待备库成功写入standbylog file才能保证数据的最大保护。如果主备库之间的网络带宽不足、备库性能较差等因素,不可避免会导致主备库之间的同步延迟,此时一旦出现主库宕机的情况,极易出现数据丢失。12c开始可以在主备库之间添加一个Far Sync实例,redo数据先由主库传输到Far Sync实例,再由于Far Sync实例转发给备库。Far Sync实例只有密码文件、init参数文件和控制文件,而没有数据文件,只负责接收归档和redo而不需要应用,所以主库到Far Sync实例的同步非常迅速,基本没有延迟。
一般Far Sync实例与主库就近部署,主库可以配置同步(synchronous)传输redo到Far Sync实例,保证零数据丢失(zero data loss)。然后Far Sync实例再将redo异步(asynchronous)发送到终端备库(Standby Database)。
Far Sync配置对于Data Guard 角色转换(role transitions)是透明的,即switchover/failover命令方式与12c之前相同。
考虑到可能发生Data Guard 角色转换,即switchover/failover,可以在距离备库较近的地方也配置Far Sync实例,这个Far Sync实例只有在当前的备库切换为主库后才启用。
考虑到Far Sync实例的单点故障,可以在距离主库交近的地点配置2个Far Sync实例,起到备用的作用。
以上是借用网上的一张Active Data Guard Far Sync架构图,图中没有画出备库端的Far Sync实例。

Far Sync的相关参数和用例
1、GROUP和PRIORITY
1) 为日志传输路径分配group
GROUP (12cR2引入)可以使的备用远程传输路径的目标数量增加。GROUP之间相互独立,互不干扰。GROUP可用于从far sync实例或级联将redo分发到多个目标的多个归档目标,GROUP的数量可以设置1到8。每个GROUP可最多配置30个目标。
如果要为日志传输路径分配group,则需要组内的至少一个目的地为可用并为活动状态。组中最多可以存储30个日志存档目标,而且只能为远程日志传输路径(SERVICE = ...)分配组,不能为本地日志传输路径(LOCATION = ...)分配组。同时当一个组中存在多个日志传输路径时,必须把其他备用的日志传输路径状态LOG_ARCHIVE_DEST_STATE_n改为 ALTERNATE。
如下例子中,LOG_ARCHIVE_DEST_2和LOG_ARCHIVE_DEST_3组成一个group.当LOG_ARCHIVE_DEST_2失效时候,系统会自动切换到LOG_ARCHIVE_DEST_3进行日志远程归档,ALTERNATE即为备用的意思。
当LOG_ARCHIVE_DEST_2再次变为可用时,不会立即切换到LOG_ARCHIVE_DEST_2(因为没有指定PRIORITY), 除非后面LOG_ARCHIVE_DEST_3出现不可用。

2)在相同组内,为多个归档目标分配优先级PRIORITY
PRIORITY这个属性可以对相同GROUP中的目标进行优先级排序,以便同个GROUP里只能有一个目标位置处于活动状态。如果活动目的地不可用,其他目的地可用于后续激活并接替不可用的日志传输路径。优先级也是设置1-8 (1优先级最高)。
如下例子,LOG_ARCHIVE_DEST_2将为当前首选的日志归档目标,如果2不可用,将会切换到4(因为4的优先级高过3)。如果2再次可用,2只会作为4的备用目标而不会立马切换回2(因为2和4的优先级相同)。如果2与4都不可用,将会切换到3,后面2或者4任一可用了,会自动切换回其中一个。

1)单个Far Sync 实例 → 单个standby

首先主数据库把redo传输到Far Sync 实例,SYNC与AFFIRM模式保证数据的完整性。在LOG_ARCHIVE_DEST_2不可用情况下,主数据库直接把redo传输到standby备库,同时改成异步方式。当Far Sync 实例恢复后,再自动切换回LOG_ARCHIVE_DEST_2继续使用Far Sync 实例。

首先主数据库把redo传输到Far Sync 实例。在LOG_ARCHIVE_DEST_2不可用情况下,主数据库直接把redo同时传输到standby和standby1。
当Far Sync 实例恢复后,再自动切换回LOG_ARCHIVE_DEST_2继续使用Far Sync 实例。这个又叫做Far Sync 实例的高可用,在靠近primary的环节中部署多个Far Sync 实例,在其中一个Far Sync 实例不可用的时候不会马上切换到standby进行传输日志,更是切换到第二个Far Sync 实例。

首先主数据库把redo传输到primaryfs 这个Far Sync 实例,当primaryfs 这个Far Sync 实例不可用的时候,自动切换到primaryfs1 这个Far Sync 实例,当两个Far Sync 实例都不可用情况下,才直接把redo传输到standby。

首先主数据库把redo传输到primaryfs 这个Far Sync 实例,当primaryfs 这个Far Sync 实例不可用的时候,自动切换到primaryfs1 这个Far Sync 实例,当两个Far Sync 实例都不可用情况下,直接把redo同时传输到standby和standby1。
当任何一个Far Sync 实例恢复后,再自动切换继续使用Far Sync 实例。
配置Active Data Guard with Far Sync
接下来我们测试primary+far sync+ standby架构的ADG环境搭建。
角色 | 主库(Primary Database) | Far Sync实例 | 备库(Standby Database) |
地点 | 生产中心 | 距离生产中心较近的的灾备中心 | 距离生产中心较远的灾备中心 |
IP地址 | 192.168.233.12 | 192.168.233.13 | 192.168.233.14 |
DB_UNIQUE_NAME | primary | primaryfs | standby |
数据库版本 | 12cR2 | 12cR2 | 12cR2 |
1、创建主库、备库之间传统的Active Data Guard
这一步就是我们平时创建ADG,具体过程略过。
2、创建Far Sync实例的密码文件/参数文件/控制文件
1)创建Far Sync实例的控制文件,在主库执行:


将上面的控制文件和参数文件和密码文件复制到Far Sync实例所在的服务器。 将控制文件存放在/u01/app/oracle/oradata/primaryfs/control01.ctl。
3、 启动Far Sync实例
修改参数文件

在Far Sync实例服务器创建监听器(过程略)。
Mount Far Sync实例:

4、创建standby redo log
在Far Sync实例创建standby redo log,standby redo log大小等于主库online redo log大小:

5、 修改主库和备库的参数
1)主 库

2)备 库

6、确认配置

Far Sync马是oracle Dataguard的再次进化和完善,很好地解决了普通ADG最大保护影响发生,其他保护模式无法做到零丢失的问题。同时利用新增group和PRIORITY,可以更加灵活地配置和管理日志归档目标,定制各类故障场景下的日志传输目标和传输机制。
▼
https://blogs.oracle.com/database4cn/12c-active-data-guard-far-sync
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sbydb/creating-oracle-data-guard-far-sync-instance.html
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sbydb/LOG_ARCHIVE_DEST_n-parameter-attributes.html
本期作者|马育义 十年老DBA,精通Oracle数据库管理,精通OGG运维,喜欢各种数据库故障和救援处理。同时熟悉mysql、mongodb运维,喜欢钻研各类疑难杂症、技术新动向。持有oracle OCM,ogg OCP, mysql OCP, mongodb认证,AWS SAP认证,阿里云ACP认证等。





