You are on page 1of 13

Oracle 12c Active Data Guard Far Sync

V1.0

2013 年 10 月 22 日
Jian Zhang(张剑)
Oracle 全球技术支持

1 Active Data Guard Far Sync 概述 .................................................................................................................... 1


2 Far Sync 示意图................................................................................................................................................. 1
3 创建配置 Active Data Guard(primary+standby).......................................................................................... 2
3.1 系统概述 ................................................................................................................................................ 2
3.2 创建配置主库 ........................................................................................................................................ 2
3.3 创建配置备库 ........................................................................................................................................ 4
4 创建配置 Far Sync 实例.................................................................................................................................... 5
4.1 创建密码/init 参数/控制文件 ............................................................................................................... 5
4.2 修改调整 init 初始化参数..................................................................................................................... 5
4.3 创建 standby redo log ............................................................................................................................ 7
4.4 确认配置 ................................................................................................................................................ 7
5 案例测试 ............................................................................................................................................................ 7
5.1 测试#1 Redo 传输 ................................................................................................................................. 7
5.2 测试#2 Far Sync 实例不可用 ................................................................................................................ 8
5.3 测试#3 Far Sync 实例高可用 ................................................................................................................ 9
6 参考文档 .......................................................................................................................................................... 12
1 Active Data Guard Far Sync 概述
Active Data Guard Far Sync 是 Oracle 12c 的新功能(也称为 Far Sync Standby),Far Sync 功能的实现是
通过在距离主库(Primary Database)相对较近的地点配置 Far Sync 实例,主库(Primary Database) 同步
(synchronous)传输 redo 到 Far Sync 实例,然后 Far Sync 实例再将 redo 异步(asynchronous)传输到终端备
库(Standby Database)。这样既可以保证零数据丢失又可以降低主库压力。Far Sync 实例只有密码文件,init
参数文件和控制文件,而没有数据文件。
如果 redo 传输采用 Maximum Availability 模式,我们可以在距离生产中心(Primary Database)相对较近
的地点配置 Far Sync 实例,主库(Primary Database)同步(synchronous)传输 redo 到 Far Sync 实例,保证零
数据丢失(zero data loss) ,同时主库和 Far Sync 距离较近,网络延时很小,因此对主库性能影响很小。
然后 Far Sync 实例再将 redo 异步(asynchronous)发送到终端备库(Standby Database)。
如果 redo 传输采用 Maximum Performance 模式,我们可以在距离生产中心(Primary Database)相对较
近的地点配置 Far Sync 实例,主库(Primary Database) 异步传输 redo 到 Far Sync 实例,然后 Far Sync 实例
再负责传输 redo 到其他多个终端备库(Standby Database)。这样可以减少主库向多个终端备库(Standby
Database)传输 redo 的压力(offload) 。
Far Sync 配置对于 Data Guard 角色转换(role transitions)是透明的,即 switchover/failover 命令方式
与 12c 之前相同。
考虑到可能发生 Data Guard 角色转换,即 switchover/failover,可以在距离备库较近的地方也配置
Far Sync 实例,这个 Far Sync 实例只有在当前的备库切换为主库后才启用。
考虑到 Far Sync 实例的单点故障,可以在距离主库交近的地点配置 2 个 Far Sync 实例,起到备用的
作用。
本文重点是测试 Far Sync 安装配置。

2 Far Sync 示意图


Far Sync 实例 1 和 Far Sync 实例 2 位于距离主库(Primary Database)相对较近的地点,主库(Primary
Database)同步传输 redo 到 Far Sync 实例 1,实现零数据丢失。Far sync 实例 2 是备用实例,当 Far Sync1
不可用时,Far Sync2 继续提供服务,达到高可用性。Far Sync 实例异步传输 redo 到远端的多个终端备库
(Standby Database),Far Sync 实例分担了主库传输 redo 的压力。
注:可以在距离终端备库(Standby Database)较近的地点配置 Far Sync 实例,这个 Far Sync 实例只有在当前
的备库切换为主库后才启用,本图中没有描述。
3 创建配置 Active Data Guard(primary+standby)
创建 active data guard 方式与 11.2 相同,详细过程参考《Active Database Duplication for A standby database》
下面列出来主要步骤:

3.1 系统概述
角色 主库(Primary Database) Far Sync 实例 备库(Standby Database)
地点 生产中心 距离生产中心较近的的灾 距离生产中心较远的灾备
备中心 中心
IP 地址 192.0.2.31 192.0.2.33 192.0.2.32
DB_UNIQUE_NAME dg12cp dg12cfs dg12cs
数据库版本 12.1.0.1 12.1.0.1 12.1.0.1

3.2 创建配置主库
1. 打开主库 force logging:
SQL>ALTER DATABASE FORCE LOGGING;

查看主库当前是否为 force logging:


SQL> select force_logging from v$database;
FOR
---
YES

2. 修改主库的初始化参数如下:
LOG_ARCHIVE_CONFIG='DG_CONFIG=(dg12cp,dg12cs)'
LOG_ARCHIVE_DEST_1=
'LOCATION=/u01/app/oracle/archived_log
VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cp'
LOG_ARCHIVE_DEST_2=
'SERVICE=dg12cs LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cs'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_MAX_PROCESSES=10

3. 在备库创建数据文件路径,用来存放备库的数据文件,控制文件,standby redo 文件等。


$ mkdir -p /u01/app/oracle/oradata/dg12cs

4. 在备库创建 adump 路径,与参数 audit_file_dest 的路径一致


$ mkdir -p /u01/app/admin/orabak/adump

5. 在备库创建 init 参数文件$ORACLE_HOME/dbs/initdg12cs.ora',


有了这个临时的 init 参数文件,我们就可以在 duplicate 命令运行前将备库的 AUXILIARY 实例启动到
nomount 状态,这也是运行 duplicate 命令的一个必要条件。
initorabak.ora 文件只有一行信息:
DB_NAME=dg12cs

6. 将密码文件从主库服务器拷贝到备库服务器,并且重命名:
$ mv orapwdg12cp orapwdg12cs

7. 在主库服务器和备库服务器, 编辑添加下面信息到$ORACLE_HOME/network/tnsnames.ora
dg12cp =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.0.2.31)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dg12cp)
))

dg12cs =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.0.2.32)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dg12cs)
))

8. 在备库服务器, 添加静态注册信息到 $ORACLE_HOME/network/listener.ora 文件,


这主要是由于 AUXILIARY 实例启动到 nomount 状态时,listener 无法注册 AUXILIARY 实例,listener 会
标志 Auxiliary 实例为'blocked'状态,因此 duplicate 命令就无法通过 TNS 的方式连接到 Auxiliary 实例,为
了解决这个问题,需要先手动静态注册数据库实例到 listener 上。
当 Data Guard 配置完成后,就可以删除静态注册的配置信息。

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dg12cs)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = dg12cs)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = dg12cs)
))

9. 在备库服务器,执行 duplicate 命令前,先启动 AUXILIARY 实例到 nomount 状态:


$ export ORACLE_SID=dg12cs
$ sqlplus / as sysdba
SQL> startup nomount;

10. 在备库测试与 AUXILIARY 实例的连接和与主库的连接,如果连接成功,继续执行下面的步骤,


很多时候 duplicate 命令失败都是由于连接失败导致的。
$ sqlplus sys/oracle@dg12cp as sysdba
$ sqlplus sys/oracle@dg12cs as sysdba

3.3 创建配置备库

--在备库执行 duplicate 命令创建物理备库:


% rman target sys/oracle@dg12cp AUXILIARY sys/oracle@dg12cs
RMAN>
DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER
SPFILE
SET "db_unique_name"="dg12cs"
SET FAL_SERVER="dgdg12cp"
SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archived_log
VALID_FOR=(STANDBY_LOGFILE,STANDBY_ROLE)
DB_UNIQUE_NAME=dg12cs'
SET
CONTROL_FILES='/u01/app/oracle/oradata/dg12cs/control01.ctl','/u01/app/oracle/oradata/dg12cs/control02.ctl'
set audit_file_dest='/u01/app/oracle/admin/dg12cs/adump'
set DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/dg12cp','/u01/app/oracle/oradata/dg12cs'
NOFILENAMECHECK;

--创建 standby redo log,standby redo log 大小等于主库 online redo log 大小:
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11
('/u01/app/oracle/oradata/dg12cs/redo11.log') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12
('/u01/app/oracle/oradata/dg12cs/redo12.log') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13
('/u01/app/oracle/oradata/dg12cs/redo13.log') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 14
('/u01/app/oracle/oradata/dg12cs/redo14.log') SIZE 52428800;

--配置 active data guard:


SQL>startup mount;
SQL>alter database open read only;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

--配置 redo 传输为 MAXIMIZE AVAILABILITY 模式:


SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;

以上创建 Active Data Guard 环境,包括主库和备库,下面创建 Far Sync 实例。

4 创建配置 Far Sync 实例

4.1 创建密码/init 参数/控制文件

-创建 Far Sync 实例的控制文件,在主库执行:

SQL> ALTER DATABASE CREATE FAR SYNC INSTANCE CONTROLFILE AS '/tmp/controlfs01.ctl';

-创建 Far Sync 实例的 pfile 文件,在主库执行:

SQL> create pfile='/tmp/pfile.fs' from spfile;

-将上面的控制文件和参数文件和密码文件复制到 Far Sync 实例所在的服务器。

4.2 修改调整 init 初始化参数

主库(dg12cp)
DB_UNIQUE_NAME dg12cp

CONTROL_FILES /u01/app/oracle/oradata/dg12cp

FAL_SERVER dg12cs

LOG_ARCHIVE_CONFIG 'DG_CONFIG=(dg12cp,dg12cfs,dg12cs)'

LOG_ARCHIVE_DEST_1 'LOCATION=/u01/app/oracle/archived_log/dg12cp
VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cp'
LOG_ARCHIVE_DEST_2 'SERVICE=dg12cfs SYNC AFFIRM MAX_FAILURE=1
ALTERNATE=LOG_ARCHIVE_DEST_3
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cfs'
备注:设置 redo 同步传输到 FarSync 实例 dg12cfs,并且设置 DEST_3
为备用 DEST.
LOG_ARCHIVE_DEST_STATE_3 ALTERNATE
LOG_ARCHIVE_DEST_3 'SERVICE=dg12cs ASYNC ALTERNATE=LOG_ARCHIVE_DEST_2
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cs'
备注:设置 DEST_3 为备用 DEST,当 DEST_2 不可用,redo 通过异
步传输方式直接到备库。
Far Sync 实例(dg12cfs)
DB_UNIQUE_NAME dg12cfs

CONTROL_FILES /u01/app/oracle/oradata/dg12cfs

FAL_SERVER Dg12cp

LOG_ARCHIVE_CONFIG 'DG_CONFIG=(dg12cp, dg12cfs, dg12cs)'

LOG_ARCHIVE_DEST_1 'LOCATION=/u01/app/oracle/archived_log/dg12cfs
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=dg12cfs
LOG_ARCHIVE_DEST_2 LOG_ARCHIVE_DEST_2='SERVICE=dg12cs ASYNC
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
DB_UNIQUE_NAME=dg12cs'
备注:设置 Far Sync 实例异步传输 redo 到备库。
备库(dg12cs)
DB_UNIQUE_NAME dg12cs

CONTROL_FILES /u01/app/oracle/oradata/dg12cs

FAL_SERVER dg12cfs,dg12cp

LOG_ARCHIVE_CONFIG 'DG_CONFIG=(dg12cp, dg12cfs, dg12cs)'

LOG_ARCHIVE_DEST_1 'LOCATION=/u01/app/oracle/archived_log/dg12cs
VALID_FOR=( ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=dg12cs
LOG_ARCHIVE_DEST_2 LOG_ARCHIVE_DEST_2='SERVICE=dg12cp ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cp'

-在 Far Sync 实例服务器创建监听器。


-修改主库/备库/Far Sync 实例的 tnsnames.ora 文件。
-Mount Far Sync 实例:
$export ORACLE_SID=dg12cfs
$sqlplus / as sysdba
SQL> startup mount;

4.3 创建 standby redo log

在 Far Sync 实例创建 standby redo log,standby redo log 大小等于主库 online redo log 大小:
ALTER DATABASE ADD STANDBY LOGFILE GROUP 21
('/u01/app/oracle/oradata/dg12cfs/redo11.log') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 22
('/u01/app/oracle/oradata/dg12cfs/redo12.log') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 23
('/u01/app/oracle/oradata/dg12cfs/redo13.log') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 24
('/u01/app/oracle/oradata/dg12cfs/redo14.log') SIZE 52428800;

4.4 确认配置
SQL> set linesize 160
SQL> select * from V$DATAGUARD_CONFIG;

DB_UNIQUE_NAME PARENT_DBUN DEST_ROLE CURRENT_SCN CON_ID


------------------------------ ------------------------------ ----------------- ----------- ----------
dg12cfs dg12cp FAR SYNC INSTANCE 682995 0
dg12cs dg12cfs PHYSICAL STANDBY 682995 0
dg12cp NONE PRIMARY DATABASE 683138 0

5 案例测试

5.1 测试#1 Redo 传输

-主库 switch log

-主库 alert log 记录 redo 传输到 FarSync 实例


-Far Sync 实例 alert log 记录 FarSync 实例接收到 redo,并传输 redo 到备库

-备库 alert log 记录接收到 redo 并 recovery。

5.2 测试#2 Far Sync 实例不可用

如果只配置了一个 Far Sync 实例, 并且 LOG_ARCHIVE_DEST_2 参数指定了 Alternate 选项,那么在 Far Sync
实例不可用的情况下,primary 库自动将 redo 信息发送到 LOG_ARCHIVE_DEST_3。即当 Far Sync 实例不
可用,primary 库绕过 Far Sync 实例(dg12cfs)直接发送 redo 到备库(dg12cs),保证 redo 传输的连续性,但是
primary 库保护模式从最大可用模式(Maximum Availability)降为最大性能模式(Maximum Performance) 。

-中断 Far Sync 实例:


SQL> shutdown abort

Far Sync Alert log


Mon Oct 21 10:39:01 2013
Shutting down instance (abort)

-primary 库 redo 切换:


SQL> alter system switch logfile;

Primary 库 alert log


Mon Oct 21 10:39:01 2013
LGWR: Attempting destination LOG_ARCHIVE_DEST_2 network reconnect (3113)
LGWR: Destination LOG_ARCHIVE_DEST_2 network reconnect abandoned
Error 3113 for archive log file 1 to 'dg12cfs'
LGWR: Error 1041 disconnecting from destination LOG_ARCHIVE_DEST_2 standby host 'dg12cfs'
Mon Oct 21 10:39:02 2013
Destination LOG_ARCHIVE_DEST_2 is UNSYNCHRONIZED
LGWR: Failed to archive log 1 thread 1 sequence 61 (3113)
Mon Oct 21 10:39:04 2013
Destination LOG_ARCHIVE_DEST_2 no longer supports SYNCHRONIZATION
Mon Oct 21 10:39:04 2013
Thread 1 advanced to log sequence 62 (LGWR switch)
Current log# 2 seq# 62 mem# 0: /u01/app/oracle/oradata/dg12cp/redo02.log
Mon Oct 21 10:39:04 2013
******************************************************************
TT01: Setting 'active' archival for destination LOG_ARCHIVE_DEST_3
******************************************************************
Mon Oct 21 10:39:04 2013
Archived Log entry 62 added for thread 1 sequence 61 ID 0x678cb80a dest 1:
Mon Oct 21 10:39:04 2013
TT01: Standby redo logfile selected for thread 1 sequence 62 for destination LOG_ARCHIVE_DEST_3
Mon Oct 21 10:39:04 2013
ARC5: Standby redo logfile selected for thread 1 sequence 61 for destination LOG_ARCHIVE_DEST_3

<<<以上日志说明 primary 发现 LOG_ARCHIVE_DEST_2 不可用后,自动使用 LOG_ARCHIVE_DEST_3,


保证了 redo 继续传输到 standby database.

-Far Sync 实例启动后,primary 自动使用 FarSync 实例


Primary 库 alert log
Mon Oct 21 10:52:21 2013
LGWR: Standby redo logfile selected for thread 1 sequence 65 for destination LOG_ARCHIVE_DEST_2

5.3 测试#3 Far Sync 实例高可用

测试#1 中只有一个 Far Sync 实例,如果出现问题,虽然能够保证 redo 直接传输到 standby 库,但是 primary
库保护模式从最大可用模式(Maximum Availability)降为最大性能模式(Maximum Performance) 。
因此我们可以在距离主库较近的地点设置 2 个 FarSync 实例保证高可用性。当一个 Far Sync 实例不可用,
primary 库自动使用备用 FarSync 库,并且 primary 库保护模式保持最大可用模式(Maximum Availability)
不变,零数据丢失。

-创建备用 Far Sync 实例(dg12cfs2)


,创建方法与前面 Far Sync 实例(dg12cfs)相同。
-调整修改主库(dg12cp)初始化参数,见下表格:
主库(dg12cp)

DB_UNIQUE_NAME dg12cp

CONTROL_FILES /u01/app/oracle/oradata/dg12cp
FAL_SERVER Dg12cs

LOG_ARCHIVE_CONFIG 'DG_CONFIG=(dg12cp, dg12cfs, dg12cfs2, dg12cs)'

LOG_ARCHIVE_DEST_1 'LOCATION=/u01/app/oracle/archived_log/dg12cp
VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cp'
LOG_ARCHIVE_DEST_2 'SERVICE=dg12cfs SYNC AFFIRM MAX_FAILURE=1
ALTERNATE=LOG_ARCHIVE_DEST_3
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cfs'
备注:设置 DEST_3 为备用 DEST.
LOG_ARCHIVE_DEST_STATE_3 ALTERNATE
备注:设置为备用 DEST
LOG_ARCHIVE_DEST_3 'SERVICE=dg12cfs2 ASYNC ALTERNATE=LOG_ARCHIVE_DEST_2
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=dg12cfs2'
备注:DEST_3 设置为将 redo log 传输到备用 FarSync 实例,达到高可
以性。
Far Sync 实例(dg12cfs)
DB_UNIQUE_NAME dg12cfs

CONTROL_FILES /u01/app/oracle/oradata/dg12cfs

FAL_SERVER Dg12cp

LOG_ARCHIVE_CONFIG 'DG_CONFIG=(dg12cp, dg12cfs, dg12cfs2, dg12cs)'

LOG_ARCHIVE_DEST_1 'LOCATION=/u01/app/oracle/archived_log/dg12cfs
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=dg12cfs
LOG_ARCHIVE_DEST_2 LOG_ARCHIVE_DEST_2='SERVICE=dg12cs ASYNC
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
DB_UNIQUE_NAME=dg12cs'
备用 Far Sync 实例(dg12cfs2)
DB_UNIQUE_NAME dg12cfs2

CONTROL_FILES /u01/app/oracle/oradata/dg12cfs2

FAL_SERVER dg12cp

LOG_ARCHIVE_CONFIG 'DG_CONFIG=(dg12cp, dg12cfs, dg12cfs2, dg12cs)'

LOG_ARCHIVE_DEST_1 'LOCATION=/u01/app/oracle/archived_log/dg12cfs2
VALID_FOR=( ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=dg12cfs2
LOG_ARCHIVE_DEST_2 LOG_ARCHIVE_DEST_2='SERVICE=dg12cs ASYNC
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
DB_UNIQUE_NAME=dg12cs'
-中断 Far Sync 实例:
SQL> shutdown abort

Far Sync Alert log


Mon Oct 21 21:49:33 2013
Shutting down instance (abort)

-Primary database Alert log

-备用 Far Sync 实例(dg12cfs2)Alert log 显示备用 Far Sync 实例继续传输 redo log
6 参考文档
http://docs.oracle.com/cd/E16655_01/server.121/e17640/create_fs.htm#CJAGJBBG
http://docs.oracle.com/cd/E16655_01/server.121/e17601/hafeatures.htm#CIHHJCGI
http://docs.oracle.com/cd/E16655_01/server.121/e17906/chapter1.htm#NEWFT302

You might also like