Data Guard是Oracle推出的一种高可用性数据库方案,从Oracle 9i开始正式更名为Oracle Data Guard。Data Guard在11g中引入Active Data Guard,12c又赋予了新的功能,如: Far Sync Instance等。本文将分为系列文章,介绍12cR2中Data Guard与我们最为息息相关的新特性。
| Far Sync Instance
Far Sync Instance,实际上是一个级联备库,该特性似乎为两地三中心设计提供的解决方案。使用该特性可以解决远距离传输的延迟时间,同时也增加了主备容灾的距离,可进一步实现数据零丢失的同时,又可以减少主库的压力。以下是官方提供的示意图:
从上述图中可以看出,实际上Far Sync实例数据库是一个级联备用数据库,它充当终端数据库的日志存储库,可以理解为日志中转站。这个实例非常特殊,仅仅只有参数文件,控制文件和密码文件,以及备用日志文件。它不包含任何数据文件,因此无法打开,无法运行日志应用,也无法转换为任何类型的备库。并且只有日志传输服务在远程同步备用数据库上处于活动状态。
远程同步实例的优势在于:它可以是主数据库的本地Archive Log存储库,以最高可用性模式运行,其中物理或逻辑备用数据库可以位于远端站点上。由于它和主库距离较近,同主库端采取同步传输,网络延时很小,而用异步将日志分发到终端备库,因此对主库性能影响很小。
当发生角色转换,例如:switchover/failover时,对Far Sync实例是透明的,即角色转换和12c之前的版本是相同的。
考虑到整个架构的高可用性,Far Sync实例也可以配置多个,以防止Far Sync实例造成地单点故障。如上图,配置两个Far Sync实例以防止引起单点故障。同时在配置多个Far Sync实例时,可以使用Enhanced Alternate Destination的新特性。对FS1,FS2配置Alternate Destinations,并将FS1设置高优先级,FS2设置为相对较低的优先级,当FS1出现故障时,主库会自动将归档日志传输到FS2。而在切换过程中对下级的任意备库,都是完全透明的,实现了Far Sync实例的高可用性。
| Enhancing Support for Alternate Destinations
在Oracle 9.2中日志传输备用目标的概念被引入,当初始目标不再可用时,作为单一故障切换的备用目标。在Oracle Database 12cR1(12.1)中,增强了这一功能可以使用一个首选目标,第二个作为备用目标,并且在初始目标再次可用时具有自动重新配置和简单故障恢复功能。但是不支持新的Oracle Active Data Guard远程同步实例和实时级联功能。
该功能提供了更大的灵活性来定义优先级的规则,并提供了许多用于定义失败状态策略的选项。无论使用何种配置,目的是都为了满足各种数据保护和高可用性目标。
从12.2.0.1开始通过设置LOG_ARCHIVE_DEST_n参数中的GROUP和PRIORITY属性来完成。
示例:
LOG_ARCHIVE_DEST_2=’SERVICE=chicagoFS SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) GROUP=1 PRIORITY=1’ LOG_ARCHIVE_DEST_STATE_2=ENABLE LOG_ARCHIVE_DEST_3=’SERVICE=chicagoFS1 SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) GROUP=1 PRIORITY=1’ LOG_ARCHIVE_DEST_STATE_3=ALTERNATE LOG_ARCHIVE_DEST_4=’SERVICE=chicagoFS2 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) GROUP=1 PRIORITY=2’ LOG_ARCHIVE_DEST_STATE_4=ALTERNATE
以上配置会产生以下结果:
1. 日志将优先传输到远程同步实例chicagoFS;
2. 如果chicagoFS不可用时,将使用chicagoFS1;
3. 如果chicagoFS恢复后,由于优先级相同chicagoFS将成为备用目标;
4. 如果chicagoFS和chicagoFS1都不可用时,将使用chicagoFS2(此示例中将会异步传输到chicagoFS2);
5. 如果chicagoFS和chicagoFS1恢复后,主库日志传输会恢复到可用的首选目标
| Automatically Synchronize Password Files in Oracle Data Guard Configurations
在12cR2中,当主库密码文件(包含SYS,SYSDG等)发生修改后,会自动同步到Oracle Data Guard配置。这个功能很够温暖了吧。
此功能提供了解决了该版本前,当主库密码文件发生改变后,需要手动同步到备库,才能将日志继续同步到备库,进一步简化了Oracle Data Guard配置的管理和维护成本。这个特性使所有的DBA都为之兴奋,从此再也不会为了因为主库密码发生改变没有同时更新到备库,导致主备库无法同步,甚至可能面临重新搭建备库。我想大家对上一次处理过因主库SYS密码改变导致重新搭建备库的经历还记忆犹新吧。
注:1.当有Far Sync实例时,仍需手动将修改后的密码文件同步到远程同步实例,一旦远程同步实例更新后,会自动同步到所有的物理备库。
2. 当然也可以在Oracle 11g的版本设置redo_transport_user参数来实现同样的功能。
在了解了上述3个特性外,接下来咱们部署一套高可用的容灾环境:一主一备二个Far Sync实例,要求Far Sync实例实现高可用性。创建和配置Far Sync实例非常轻松,过程如此简单,和传统搭建备库完全一样。因此我将介绍配置Far Sync实例的所有步骤:
1. 创建控制文件。
SQL> ALTER DATABASE CREATE FAR SYNC INSTANCE CONTROLFILE AS '/tmp/ctrlfsync01.ctl'; Database altered. SQL>2. 从SPFILE创建PFILE,并修改相应的参数。
SQL> CREATE PFILE='/tmp/initfsync.ora' FROM SPFILE; File created. SQL>主库orcl部分参数:
DB_UNIQUE_NAME=orcl LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl,fsync,fsync2)' LOG_ARCHIVE_DEST_2='SERVICE=fsync SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=fsync GROUP=1 PRIORITY=1’ LOG_ARCHIVE_DEST_STATE_2=ENABLE LOG_ARCHIVE_DEST_3='SERVICE=fsync2 SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=fsync2 GROUP=1 PRIORITY=2’ LOG_ARCHIVE_DEST_STATE_3=ALTERNATEFar Sync实例fsync:
DB_UNIQUE_NAME=fsync CONTROL_FILES='/oradata/fsync/control01.ctl' DB_FILE_NAME_CONVERT='+data','/oradata/fsync' LOG_FILE_NAME_CONVERT='+data','/oradata/fsync' FAL_SERVER=orcl LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl,fsync,fsync2)' LOG_ARCHIVE_DEST_1='LOCATION=/oradata/arch/fsync VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=fsync'Far Sync实例fsync2:
DB_UNIQUE_NAME=fsync2 CONTROL_FILES='/oradata/fsync2/control01.ctl' DB_FILE_NAME_CONVERT='+data','/oradata/fsync2' LOG_FILE_NAME_CONVERT='+data','/oradata/fsync2' FAL_SERVER=orcl LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl,fsync,fsync2)' LOG_ARCHIVE_DEST_1='LOCATION=/oradata/arch/fsync2 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=fsync2'
3. 生成SPFILE。
SQL>CREATE SPFILE='/u01/app/oracle/products/12.2.0/db_1/dbs/spfilefsync.ora' FROM PFILE='/tmp/initfsync.ora' ; File created. SQL>
4. 拷贝步骤1和步骤3生成的文件到Far Sync实例fsync和fsync2。
5. 拷贝密码文件的Far Sync实例fsync和fsync2。
6. 在Far Sync实例上配置监听。
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = fsync) (ORACLE_HOME =/u01/app/oracle/products/12.2.0/db_1) (SID_NAME = fsync) ) (SID_DESC = (GLOBAL_DBNAME = fsync2) (ORACLE_HOME =/u01/app/oracle/products/12.2.0/db_1) (SID_NAME = fsync2) ) )
7. 主库创建网络服务名到Far Sync实例fsync和fsync2。
主库网络服务名:orcl;Far Sync:fsync,fsync2
ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.70.124)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) fsync= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.10.70.120)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = fsync) ) ) fsync2= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.10.70.122)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = fsync2) ) )8. 启动Far Sync实例fsync和fsync2到mount状态。
SQL> startup mount ORACLE instance started. Total System Global Area 536870912 bytes Fixed Size 8622776 bytes Variable Size 218107208 bytes Database Buffers 301989888 bytes Redo Buffers 8151040 bytes Database mounted. SQL>9. 创建Far Sync实例备用日志文件。
SQL> alter database add standby logfile '/oradata/fsync/standby01.log' size 50M; Database altered. SQL> alter database add standby logfile '/oradata/fsync/standby02.log' size 50M; Database altered. SQL> alter database add standby logfile '/oradata/fsync/standby03.log' size 50M; Database altered. SQL> alter database add standby logfile '/oradata/fsync/standby04.log' size 50M; SQL>
10. 验证Far Sync实例fsync和fsync2。
SQL> SELECT * FROM V$DATAGUARD_CONFIG; DB_UNIQUE_NAME PARENT_DBUN DEST_ROLE CURRENT_SCN CON_ID ------------- ------------ ----------------- ------------- ----- orcl NONE PRIMARY DATABASE 4306114 0 fsync orcl FAR SYNC INSTANCE 0 0 fsync2 UNKNOWN UNKNOWN 0 0 当前主库将归档日志传输到fsync中。 [oracle@node1 fsync]$ ls -l -rw-r----- 1 oracle asmadmin 37376 Apr 12 23:21 2_27_964813855.dbf -rw-r----- 1 oracle asmadmin 67072 Apr 12 23:23 2_28_964813855.dbf -rw-r----- 1 oracle asmadmin 2409984 Apr 12 23:24 2_29_964813855.dbf -rw-r----- 1 oracle asmadmin 56320 Apr 12 23:25 2_30_964813855.dbf -rw-r----- 1 oracle asmadmin 209715712 Apr 12 23:29 2_31_964813855.dbf
11. 主库开启最大可用模式。
SQL> ALTER DATABASE SET STANDBY TO MAXIMIZE AVAILABILITY; Database altered. Elapsed: 00:00:00.00 SQL> SELECT NAME,DATABASE_ROLE,PROTECTION_MODE FROM V$DATABASE; NAME DATABASE_ROLE PROTECTION_MODE ----- -------------- ------------------------- ORCL PRIMARY MAXIMUM AVAILABILITY
12. 模拟Far Sync实例fsync故障,验证Far Sync实例高可用。
将Far Sync实例fsync关闭 SQL> shut abort ORACLE instance shut down. 查看主库当前日志传输: SQL> SELECT * FROM V$DATAGUARD_CONFIG; DB_UNIQUE_ PARENT_D DEST_ROLE CURRENT_SCN CON_ID ---------- -------- ----------------- ----------- ---------- orcl NONE PRIMARY DATABASE 5089347 0 fsync2 orcl FAR SYNC INSTANCE 0 0 fsync UNKNOWN UNKNOWN 0 0 SQL> select dest_id,status,error from v$archive_dest; DEST_ID STATUS ERROR ---------- -------- ------------------------------------------- 1 VALID 2 ALTERNATE 3 VALID 主库将日志传输自动切换到fsync2上。
至此整个高可用的Far Sync实例搭建完成。
| 作者简介
杨波,沃趣科技数据库技术专家
主要参与公司产品实施、测试、维护以及优化。