Oracle Data Guard Feature 12cR2系列(一)

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=ALTERNATE
    Far 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实例搭建完成。


|  作者简介

杨波,沃趣科技数据库技术专家
主要参与公司产品实施、测试、维护以及优化。

猜你喜欢

转载自blog.csdn.net/woqutechteam/article/details/80451658