作者:John Smiley
本指南首先介绍一个将作为 Data Guard 配置主数据库的数据库。对于本次构建,我们将使用一个物理备用数据库。FSFO 还可以与逻辑备用数据库结合使用,支持 FSFO 的配置可有多个备用数据库,包括混合的物理数据库和逻辑数据库,但只有一个备用数据库可随时作为故障切换目标。
本指南中的主要步骤包括:
配置 Oracle Net(即 SQL*Net)
准备主数据库
创建物理备用数据库
启用闪回数据库
创建 Broker 配置
配置观察器
启用并测试 FSFO
数据库主机称为“a”和“b”主机,数据库本身称为“a”和“b”数据库。观察器主机是“observer.demo.org”。
示例中使用的名称:
数据库名称 | db1 |
数据库唯一名称 | db1_a db1_b |
域名 |
demo.org |
主机名 | dbhost-a dbhost-b |
Data Guard 监听器名称 | LISTENER_DG |
TNS 别名 | db1_a db1_b |
输入的命令在阴影框中以普通文本显示。 预期输出以蓝色文本显示。
Data Guard 使用 Oracle Net (SQL*Net) 在主数据库和备用数据库以及 FSFO 观察器之间进行通信。正确配置 Oracle Net 是成功部署 FSFO 的一个关键因素。错误的 Oracle Net 配置是导致所报告的 FSFO 问题的主要原因。
注:Data Guard 的正确操作需要专用服务器连接。 不要针对 Data Guard 使用 Shared Server(以前称为 MTS)
针对应用程序连接和 Data Guard 连接使用不同的监听器是很好的做法。 这样,Data Guard 可以在应用程序监听器因进行维护而停止工作时保持运行。请确保在 local_listeners 数据库参数中包括 Data Guard 监听器。
大多数在 FSFO 环境中使用的网络服务可使用动态注册,但要在角色转换期间或故障切换后的恢复期间启用 Broker 以重新启动实例,您必须定义一个名为 db_unique_name_dgmgrl.db_domain 的静态服务。(注:11.1.0.7 添加了 StaticConnectIdentifierBroker 数据库属性,允许您指定一个不同的服务名称。) 如果您要使用 RMAN 创建备用数据库,还需要一个静态服务来重新启动所创建的数据库。为了将 Broker 和非 Broker 活动分离,建议再定义一个静态服务。
针对主机“a”的 listener.ora 配置:
LISTENER_DG =
(DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=dbhost-a)(PORT=1522)) ) )
SID_LIST_LISTENER_DG= (SID_LIST=
(SID_DESC=
(SID_NAME=db1)
(SDU=32767)
(ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1)
(GLOBAL_DBNAME=db1_a_static.demo.org) )
(SID_DESC=
(SID_NAME=db1)
(SDU=32767)
(ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1)
(GLOBAL_DBNAME=db1_a_dgmgrl.demo.org) ) )
针对主机“b”的 listener.ora 配置:
LISTENER_DG =
(DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=dbhost-b)(PORT=1522)) ) )
SID_LIST_LISTENER_DG=
(SID_LIST=
(SID_DESC=
(SID_NAME=db1)
(SDU=32767)
(ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1)
(GLOBAL_DBNAME=db1_b_static.demo.org) )
(SID_DESC=
(SID_NAME=db1)
(SDU=32767)
(ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1)
(GLOBAL_DBNAME=db1_b_dgmgrl.demo.org) ) )
db1_a:用于连接到数据库“a”上的动态 Data Guard 服务的别名
db1_b:用于连接到数据库“b”上的动态 Data Guard 服务的别名
db1_a_static:用于连接到数据库“a”上的静态 Data Guard 服务的别名
db1_b_static:用于连接到数据库“b”上的静态 Data Guard 服务的别名
示例 tnsnames.ora 条目:
db1_a=
(description=
(SDU=32767)
(address_list= (address=(protocol=tcp)(host=dbhost-a)(port=1522)) )
(connect_data=
(service_name=db1_a.demo.org)
(server=dedicated) ) )
db1_b=
(description=
(SDU=32767)
(address_list= (address=(protocol=tcp)(host=dbhost-b)(port=1522)) )
(connect_data=
(service_name=db1_b.demo.org)
(server=dedicated) ) )
db1_a_static=
(description=
(SDU=32767)
(address_list= (address=(protocol=tcp)(host=dbhost-a)(port=1522)) )
(connect_data=
(service_name=db1_a_static.demo.org)
(server=dedicated) ) )
db1_b_static=
(description=
(SDU=32767)
(address_list= (address=(protocol=tcp)(host=dbhost-b)(port=1522)) )
(connect_data=
(service_name=db1_b_static.demo.org)
(server=dedicated) ) )
hosts.启动“a”和“b”主机上的 Data Guard 监听器。
lsnrctl start LISTENER_DG
验证来自两个主机的配置。
tnsping db1_a
Attempting to contact (description= (SDU=32767) (address_list= (address=(protocol=tcp)(host=dbhost-a)(port=1522))) (connect_data= (service_name=db1_a.demo.org) (server=dedicated)))
OK (0 msec)
tnsping db1_b
Attempting to contact (description= (SDU=32767) (address_list= (address=(protocol=tcp)(host=dbhost-b)(port=1522))) (connect_data= (service_name=db1_b.demo.org) (server=dedicated)))
OK (0 msec)
为了使用快速启动故障切换,主数据库必须满足一系列前提条件。本部分描述将如何配置和验证每个前提条件。要查看主数据库是否已满足某个前提条件,请按照验证部分的说明进行操作。
需要主数据库处于安装(未打开)状态的步骤集中在以下题为需要主数据库回弹的步骤的部分中。
为了使数据库在 Data Guard 监听器中注册,必须将监听器端点添加到数据库的 local_listener 参数中。如果已经使用了 local_listener,则需将 Data Guard 监听器添加到列表中。设置完 local_listener 之后,将数据库注册到监听器并验证该服务已注册成功。
注:您也可以在设置 local_listener 参数时使用 tnsnames.ora 文件中定义的 TNS 别名。 在向参数值可能超过 255 个字符限制的多个监听器注册时,该方法尤其有用。
alter system set local_listener='(address=(host=dbhost-a)(port=1522)(protocol=tcp))';alter system register;
show parameter local_listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string (address=(host=dbhost-a)(port=1522)(protocol=tcp))
lsnrctl status listener_dg
...Services Summary...Service "DB1_A" has 1 instance(s). Instance "db1", status READY, has 1 handler(s) for this service...Service "DB1_A_XPT" has 1 instance(s). Instance "db1", status READY, has 1 handler(s) for this service...Service "db1XDB" has 1 instance(s). Instance "db1", status READY, has 1 handler(s) for this service...Service "db1_a_dgmgrl.demo.org" has 1 instance(s). Instance "db1", status UNKNOWN, has 1 handler(s) for this service...Service "db1_a_static.demo.org" has 1 instance(s). Instance "db1", status UNKNOWN, has 1 handler(s) for this service...The command completed successfully
所有 Data Guard 环境都应在数据库级别启用强制日志记录,以避免添加时产生无日志记录的表空间。
alter database force logging;
select force_logging from v$database;FOR---YES
Broker 将在启动和角色转换期间通过 ALTER SYSTEM 命令时更改数据库参数。 保存这些更改将需要一个 spfile。
create spfile='?/dbs/spfile${ORACLE_SID}.ora' from pfile='?/dbs/init${ORACLE_SID}.ora';alter system set spfile='?/dbs/spfiledb1.ora';
show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string ?/dbs/spfiledb1.ora
所有 Data Guard 环境都需要使用口令文件以使数据库可以互相连接。
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID
select * from v$pwfile_users;
USERNAME SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS TRUE TRUE FALSE
Data Guard 配置中的数据库要进行互相连接,需要带有口令文件的远程登录。
alter system set remote_login_passwordfile=exclusive scope=spfile;
show parameter remote_login_passwordfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
Data Guard 配置中的每个数据库必须有唯一的名称。 本指南使用在 db_name 加一个下划线后接一个字母的命名惯例来创建 db_unique_name。
alter system set db_unique_name = db1_a scope=spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string db1_a
show parameter db_unique_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string db1_a
如果您还没有快速恢复区 (FRA),您将需要为闪回数据库创建一个。 如果您已经拥有一个 FRA,可能需要增加其大小以容纳闪回数据库文件。有关储存需求的信息,请参阅上面的闪回数据库部分。
alter system set db_recovery_file_dest_size = 20g scope=both;
alter system set db_recovery_file_dest = '/u01/fra' scope=both;
show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u02/flash_recovery_areadb_recovery_file_dest_size big integer 2G
非硬性要求,但建议如此。
alter system set standby_file_management=auto;
show parameter standby_file_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_file_management string AUTO
必须先设置该参数,然后才能在最高可用性模式下打开主数据库。其余 Data Guard 相关参数稍后将本指南中通过 Broker 进行设置。
alter system set log_archive_config='DG_CONFIG=(db1_b)' scope=both;
show parameter log_archive_config
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_config string DG_CONFIG=(db1_b)
为适应所有加载条件,Oracle 建议 SRL 组至少比相同大小的 ORL 组多一个。本指南假定主数据库和备用数据库上的所有 ORL 和 SRL 大小相同。
确定联机重做日志文件 (ORL) 的数量和大小
select bytes, count(group#) from v$log group by bytes;
BYTES COUNT(GROUP#)
---------- -------------
52428800 3
找到最大 group#
select max(group#) from v$log;
MAX(GROUP#)
-----------
3
添加 SRL。与 ORL 不同,创建的 SRL 每组中仅有一个成员。无需像 ORL 中那样创建多个 SRL 来保护重做(主数据库中的 ORL 中已对重做进行保护)。多个 SRL 只会增加不必要的 IO 并将增加提交延时。对于具有多个 RAID 控制器的系统,考虑创建 SRL,以便在在控制器之间平衡分布其 IO。
在本示例中,有 3 个最大 ORL,最大 group# 为 3。 我们将从 group# 11 开始递增,创建 4 个 SRL。从 11 开始是完全形式化的,这样使稍后添加的新 ORL 组可以保持其 group# 与现有 ORL 拥有相同的顺序。
alter database add standby logfile group 11 '/u02/oradata/db1/stby-t01-g11-m1.log' size 52428800;alter database add standby logfile group 12 '/u02/oradata/db1/stby-t01-g12-m1.log' size 52428800;alter database add standby logfile group 13 '/u02/oradata/db1/stby-t01-g13-m1.log' size 52428800;alter database add standby logfile group 14 '/u02/oradata/db1/stby-t01-g14-m1.log' size 52428800;
select group#, type, member from v$logfile where type = 'STANDBY';
GROUP# TYPE MEMBER
---------- ------- ----------------------------------------
11 STANDBY /u02/oradata/db1/stby-t01-g11-m1.log
12 STANDBY /u02/oradata/db1/stby-t01-g12-m1.log
13 STANDBY /u02/oradata/db1/stby-t01-g13-m1.log
14 STANDBY /u02/oradata/db1/stby-t01-g14-m1.log
以下步骤均要求数据库处于安装(未打开)状态。 可以在一个回弹中将它们全部同时完成。
alter database archivelog;
select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
alter database flashback on;alter system set db_flashback_retention_target = 60 scope=both;
select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
show parameter db_flashback_retention_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 60
如上文所述,最高可用性模式对于 Oracle 数据库 10g 是必选的,对于 Oracle 数据库 11g 则是可选的。
alter database set standby database to maximize availability;
select protection_mode from v$database;
PROTECTION_MODE
--------------------
MAXIMUM AVAILABILITY
如果您还没有备用数据库,使用您最喜欢的方法创建一个备用数据库。以下示例将利用 11g RMAN 活动数据库复制特性。通过该特性,RMAN 可以通过网络复制现有数据库而无需磁盘或磁带备份。以下部分假定备用主机已根据 Oracle 的建议进行设置,并且操作系统、帐户、安全性、资源限制、目录结构等配置正确。
在 Oracle 数据库 11g 中,由于 Oracle 数据库 11g 中安全性的增强,备用数据库中的口令文件必须是主数据库中口令文件的物理副本。Oracle 数据库 10g 中允许使用不同的口令文件,只要主数据库和备用数据库中的 SYS 口令相同即可。
向备用数据库的 oratab 文件添加一个条目
db1:/u01/app/oracle/product/11.1.0/db_1:Y
对于 RMAN 复制活动数据库方法而言,init.ora 文件(本示例中为 initdb1.ora)仅需要一个参数:db_name(甚至不必是数据库的真实名称 — 可使用任意名称)。RMAN 将从主数据库复制 spfile,因此仅在复制的第一阶段需要该 init.ora 文件。
db_name = db1
确保备用数据库上的操作系统环境已设置。使用 Oracle 提供的 oraenv 脚本。
startup nomount
rman target sys/password@db1_a_static auxiliary sys/password@db1_b_static
connected to target database:
DB1 (DBID=1234567890)
connected to auxiliary database: X (not mounted)
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
Oracle Data Guard 概念和管理文档(10g 第 2 版和 11g 第 1 版)的附录 F 中详细介绍了使用 RMAN 创建备用服务器的过程。本示例使用 11g 中的 FROM ACTIVE DATABASE 子句,该子句允许 RMAN 通过跨网络复制主数据库来创建备用数据库,而无需在磁盘或磁带上存储备份文件。RMAN 还复制 spfile 和口令文件,您可以更改各个参数的值。至少必须设置 db_unique_name。本示例假定备用数据库使用和主数据库相同的的目录结构。
注:如果您刚启用了存档日志模式,则会强行创建一个存档日志 (alter system archive log current) 以确保至少存在一个存档日志。否则,DUPLICATE TARGET DATABASE 命令将失败,错误消息为“RMAN-20208: UNTIL CHANGE is before RESETLOGS change”。
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER SPFILE SET db_unique_name='db1_b' SET log_archive_config='' SET log_file_name_convert= ' ',' ' SET local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbhost-b)(PORT=1522)))' NOFILENAMECHECK;
alter database flashback on;alter system set db_flashback_retention_target = 60 scope=both;
select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
show parameter db_flashback_retention_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 60
Broker 将其配置信息存储在数据库外的一组文件镜像中。默认情况下,两个文件都存储在 $ORACLE_HOME/dbs 中。要保护这两个文件,比较好的做法是将它们存储在不同的文件系统中。
alter system set dg_broker_config_file1='/u01/app/oracle/admin/db1/dgbroker/dg1db1.dat';alter system set dg_broker_config_file2='/u02/app/oracle/admin/db1/dgbroker/dg2db1.dat';
show parameter dg_broker_config_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1 string /u01/app/oracle/admin/db1/dgbroker/dg1
db1.datdg_broker_config_file2 string /u02/app/oracle/admin/db1/dgbroker/dg2db1.dat
alter system set dg_broker_start=true;
show parameter dg_broker_start
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_start boolean TRUE
dgmgrl sys/password@db1_a
create configuration 'FSF' asprimary database is db1_aconnect identifier is db1_a;
Configuration "FSF" created with primary database "db1_a"
add database db1_b asconnect identifier is db1_bmaintained as physical;
Database "db1_b" added
show configuration
Configuration Name:
FSF Enabled: NO
Protection Mode: MaxAvailability
Databases: db1_a - Primary database db1_b - Physical standby database
Fast-Start Failover: DISABLED
Current status for "FSF":DISABLED