Oracle RAC One Node 和 Oracle Data Guard 配置 DBA 指南

来源:互联网 发布:java 迭代器模式 编辑:程序博客网 时间:2024/06/13 23:48

Oracle RAC One Node 和 Oracle Data Guard 配置 DBA 指南
作者:Martin Bach

按照下文的指导,您可以轻松地结合使用 Oracle RAC One Node 和 Oracle Data Guard 来实现灾难恢复。

2011 年 7 月发布

Oracle RAC One Node 是 Oracle Database 11g 第 2 版 的一个高可用性选件,它是传统的主动/被动集群和 Oracle Real Application Cluster (RAC) 选件的混合体,它与标准 Oracle RAC 的主要区别在于 Oracle RAC One Node 数据库通常仅在一个实例上处于活动状态。Oracle RAC One Node 还允许联机迁移数据库及其会话以进行计划维护。

Oracle RAC One Node 还降低了意外中断的风险。如果发生节点故障,Oracle RAC One 实例将在另一台候选服务器上自动重新启动。此外,因为 Oracle RAC One Node 数据库实际上是一个集群数据库,所以从 Oracle RAC One Node 转换为完全配置的 Oracle RAC 相对较为简单。

大多数具有低恢复时间目标 (RTO) 的企业依靠 Oracle Data Guard(Oracle Database 企业版的一个特性)在出现严重故障或灾难时恢复服务。最初缺乏 Data Guard 对 Oracle RAC One Node 的支持,事实证明,这阻碍了许多企业对 Oracle RAC One Node 的采用。但从 2010 年 Oracle 发布 11.2.0.2 补丁集开始,Oracle Data Guard 现已可用于保护 Oracle RAC One Node 数据库。(Oracle RAC One Node 最初以 11.2.0.1 基础版本上一次性补丁的形式仅适用于数量有限的平台,而如今,它适用于已针对其发布了补丁集的所有支持的平台。)

在本文中,我们首先探讨用于配置 Oracle Data Guard 的“代理”(Broker) 方法,该方法主要针对经验较少的 DBA 或那些不想进行过细的配置管理工作的人员。在第 2 部分中,我们将了解如何在 Oracle RAC One Node 环境中手动配置 Oracle Data Guard,这是更高级的方法。为了简单起见,两种情况都只使用一个物理备用数据库。(假定您对 Oracle Data Guard 有基本的了解。)

环境配置
在以下各节中,我们假定已创建了 Oracle RAC One Node 主数据库(名为 RON),该数据库已启动并正在运行。本示例在 64 位 Oracle Linux 5.5 平台上采用 Oracle 11.2.0.2 配置了一个四节点主集群和一个相同的 DR 集群。这些数据库位于 ASM 中,其 db_create_file_dest 设置为磁盘组 DATA,在磁盘组 FRA 中有一个快速恢复区。

主数据库 RON 与候选服务器 node1 和 node2 以及域 example.com 一起在主集群的 Oracle 集群注册表中注册。并已按照 Oracle 的建议创建了数据库服务 RON_APP.example.com。(注意,用户连接应始终使用此服务而不是 ORACLE_SID,以最大程度减少联机迁移过程中的问题。)

所有诊断和管理文件都存储在名为 /data/oracle/RON/ 的现有 ACFS 挂载点上。这使得信息对整个集群可用,此特性可大大简化管理。

下面的示例显示了主集群 OCR 中的数据库配置:

$ srvctl config database -d RON
Database unique name: RON
Database name: RON
Oracle home: /u01/app/oracle/product/11.2.0.2/
Oracle user: oracle
Spfile: +DATA/RON/spfileRON.ora
Domain: example.com
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: RON
Database instances:
Disk Groups: DATA,FRA
Mount point paths:
Services: RON_APP.example.com
Type: RACOneNode
Online relocation timeout: 30
Instance name prefix: RON
Candidate servers: node1,node2
Database is administrator managed

DR 数据库将在另一个四节点集群上构建,该集群包括 drnode1 和 drnode2 两个数据库节点。注意,不一定要使用四个节点;大多数 Oracle RAC One 数据库驻留在两节点集群上。

准备备用数据库主机
如前所述,在此我们将使用一个共享 ACFS 文件系统(挂载在同一集群的所有节点上)来存储诊断目标目录、数据转储目录及其他信息。对于主数据库,该目录已经存在,但对于备用数据库,情况并非如此。首先需要在 DR 集群上创建 ASM 集群文件系统。

首先以网格基础架构所有者的身份为 ASM 集群文件系统创建一个新卷。(在未实现职责分离的环境中,此命令很可能以 oracle 用户的身份来执行。)注意,ORACLE_SID 被设置为第一个 ASM 实例。

[grid@drnode1 ~] $ asmcmd volcreate -G ACFSDG -s 1G RONDG_V1

[grid@drnode1 ~] $ asmcmd volinfo -G ACFSDG RONDG_V1
Diskgroup Name: ACFSDG

     Volume Name: RONDG_V1     Volume Device: /dev/asm/RONDG_v1-329     State: ENABLED     Size (MB): 1024     Resize Unit (MB): 256     Redundancy: UNPROT     Stripe Columns: 4     Stripe Width (K): 128     Usage:     Mountpath:

[grid@drnode1 ~] $

在上面的示例中,在名为 ACFSDG 的专用磁盘组上创建了 ASM 动态卷。为 ADVM/ACFS 使用单独的磁盘组尽管很方便,但没有必要。在本例中,原因很简单:尽管数据库位于“高级”类型的存储上,但 ACFS 卷并非如此,因此使用了不同的磁盘组。

上面的命令创建了一个 1GB 的 ASM 动态卷 RONDG_V1,稍后供磁盘组 ACFSDG 中的 ACFS 使用。接下来必须对该卷进行格式化。您需要以 root 身份使用 mkfs 实用程序来执行此操作,如本示例中所示:

[root@drnode1 ~]# mkfs -t acfs /dev/asm/RONDG_v1-329
mkfs.acfs: version = 11.2.0.2.0
mkfs.acfs: on-disk version = 39.0
mkfs.acfs: volume = /dev/asm/RONDG_v1-329
mkfs.acfs: volume size = 1073741824
mkfs.acfs: Format complete.
[root@drnode1 ~]#

之后必须在 ACFS 注册表中注册该卷。(或者,可以将该卷创建为依赖于 RONDG 数据库的集群资源。)

[root@drnode1 ~]# /sbin/acfsutil registry -a -n \

drnode1,drnode2 \
/dev/asm/RONDG_v1-329 /data/oracle/RONDG/
acfsutil registry: mount point /data/oracle/RONDG successfully added to Oracle Registry

我们来解释一下上面的命令,我们已指示集群级挂载注册表添加一个名为 /dev/asm/RONDG_v1-329 的新文件系统,并将其挂载到所有集群节点上的 /data/oracle/RONDG。

可以将 ACFS 注册表看作一个扩展的、可移植的、集群级 /etc/fstab 文件。使用此注册表,不必也不鼓励在每个集群节点的 fstab 中添加挂载点!您可能需要在初始创建集群文件系统后进行手动挂载。

我们通过一个示例来演示此过程。首先,在所有集群节点上创建挂载点,然后挂载集群文件系统。(同样,ACFS 注册表将在下次服务器重新启动时执行此步骤!)接下来,将放宽文件系统权限,允许 oracle 用户读、写和更改目录。以下所示的 shell 脚本利用用户等效性以及 Oracle 用户在 /etc/sudoers 中有适当的条目的事实。生产环境中通常不具备此条件,您需要请系统管理员为您执行此步骤。

[oracle@drnode1 tmp: RON]mkdir/data/oracle/RONDG/[oracle@drnode1tmp:RON] for i in 2 3 4

do
ssh drnode$i sudo mkdir –p /data/oracle/RONDG/
done

[oracle@drnode1 tmp: RON]$ for i in 2 3 4 ; do

ssh drnode$i sudo mount -t acfs /dev/asm/RONDG_v1-329 \
/data/oracle/RONDG/;
mount;
done

[oracle@drnode1 oracle]# for i in 2 3 4

do
ssh drnode$i sudo chown -R oracle:oinstall /data/oracle/RONDG
done

我以类似方式在挂载点 /data/oracle/RONDG 下为管理文件创建了所需的子目录。这些目录是:

admin
admin/adump
admin/pfile
admin/scripts
admin/dpump

创建备用数据库
准备好基础架构后,下一步是为备用数据库 RONDG 创建初始化文件。通常的做法是,通过执行 create pfile=’/tmp/initRONDG_1.ora’ from spfile… 命令在主集群上创建该文件,然后再将该文件传输到 DR 集群。需要做一点编辑,主要是针对 db_unique_name 并删除 control_files 参数。下面是一个示例。(注意其中将使用 ACFS 挂载的目录用于 audit_dump_dir 和 diagnostic_dest):

[oracle@drnode1 dbs]$ vi /tmp/initRONDG_1.ora
*.archive_lag_target=900
*.audit_file_dest=’/data/oracle/RONDG/admin/adump’
*.audit_sys_operations=TRUE
*.audit_trail=’os’
*.cluster_database=true
*.db_domain=’example.com’
*.compatible=’11.2.0.2.0’
*.cpu_count=1
*.db_block_size=8192
*.db_create_file_dest=’+DATA’
*.db_file_multiblock_read_count=16
*.db_name=’RON’
*.db_unique_name=’RONDG’
*.db_recovery_file_dest_size=10737418240
*.db_recovery_file_dest=’+FRA’
*.diagnostic_dest=’/data/oracle/RONDG/admin’
*.dispatchers=’(PROTOCOL=TCP) (SERVICE=RONDGXDB)’
*.memory_target=4294967296
*.open_cursors=300
*.processes=450
*.remote_listener=’scan2.example.com:1999’
*.remote_login_passwordfile=’exclusive’
*.resource_limit=TRUE
*.resource_manager_plan=’default_plan’
*.standby_file_management=’auto’
RONDG_1.undo_tablespace=UNDOTBS1
*.undo_management=AUTO

这里未特意设置本地监听器:Oracle Clusterware 11.2.0.2 将识别 Oracle RAC 和 Oracle RAC One 数据库中的非默认本地监听器并将其自动添加到配置中。

最后,需要将口令文件从主集群复制并链接到 ACFS 挂载点。转到备用主机上的 $ORACLE_HOME/dbs 目录:

[oracle@drnode1 dbs]scporacle@node1:ORACLE_HOME/dbs/orapwRON* orapwRONDG
[oracle@drnode1 dbs]$ mv orapwRONDG /data/oracle/RONDG/admin/pfile -iv
orapwRONDG' ->/data/oracle/RONDG/admin/pfile/orapwRONDG’
removed `orapwRONDG’
[oracle@drnode1 dbs: RON]$ ln -s /data/oracle/RONDG/admin/pfile/orapwRONDG

您应在充当数据库候选者的所有其他集群节点上重复上述创建符号链接的过程;记住,与 init_R{ORACLE_SID}.ora 不同,无论实例名如何,口令文件始终名为 orapwDBUniqueName。

为了允许 Oracle Data Guard 在主集群与备用集群之间传递日志,在所有集群节点上的所有 RDBMS $ORACLE_HOME/network/admin/tnsnames.ora 中添加一组新条目:

RON =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = scan1.example.com)(PORT = 1999))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RON.example.com)
)
)

RONDG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = scan2.example.com)(PORT = 1999))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RONDG.example.com)
)
)

注意,在此不可能使用服务名 RON_APP.example com — 如果数据库 RON 处于备用角色,将不能启用该服务,从而防止日志被传递到目标而导致 ORA-12514 错误。但在 CONNECT_DATA 部分必须使用 SERVICE_NAME 而不是 SID。

现在该创建备用数据库了。启动 RONDG_1 实例,使其进入“nomount”阶段。以下是我用于创建备用数据库的 RMAN 命令的输出:

[oracle@drnode1 admin]$ rman target sys/sysPassword@ron auxiliary /

Recovery Manager: Release 11.2.0.2.0 - Production on Mon Mar 28 16:25:08 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

connected to target database: RON (DBID=1589116261)
connected to auxiliary database (not started)

RMAN> startup clone nomount

Oracle instance started

Total System Global Area 534462464 bytes

Fixed Size 2228200 bytes
Variable Size 381681688 bytes
Database Buffers 142606336 bytes
Redo Buffers 7946240 bytes

RMAN> duplicate target database for standby;

Starting Duplicate Db at 28-MAR-11
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=15 instance=RONDG_1 device type=DISK

contents of Memory Script:
{
restore clone standby controlfile;
}
executing Memory Script

Starting restore at 28-MAR-11
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/backup/ctrl_04m8c636_1_1
channel ORA_AUX_DISK_1: piece handle=/u01/app/oracle/backup/ctrl_04m8c636_1_1 tag=TAG20110328T155934
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
output file name=+DATA/rondg/controlfile/current.256.746987137
output file name=+FRA/rondg/controlfile/current.256.746987139
Finished restore at 28-MAR-11

contents of Memory Script:
{
sql clone ‘alter database mount standby database’;
}
executing Memory Script

sql statement: alter database mount standby database

contents of Memory Script:
{
set newname for clone tempfile 1 to new;
switch clone tempfile all;
set newname for clone datafile 1 to new;
set newname for clone datafile 2 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 4 to new;
set newname for clone datafile 5 to new;
restore
clone database
;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to +DATA in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 28-MAR-11
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to +DATA
channel ORA_AUX_DISK_1: restoring datafile 00002 to +DATA
channel ORA_AUX_DISK_1: restoring datafile 00003 to +DATA
channel ORA_AUX_DISK_1: restoring datafile 00004 to +DATA
channel ORA_AUX_DISK_1: restoring datafile 00005 to +DATA
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/backup/db_01m8c5on_1_1
channel ORA_AUX_DISK_1: piece handle=/u01/app/oracle/backup/db_01m8c5on_1_1 tag=TAG20110328T155358
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:02:16
Finished restore at 28-MAR-11

contents of Memory Script:
{
switch clone datafile all;
}
executing Memory Script

datafile 1 switched to datafile copy
input datafile copy RECID=6 STAMP=746987293 file name=+DATA/rondg/datafile/system.257.746987155
datafile 2 switched to datafile copy
input datafile copy RECID=7 STAMP=746987294 file name=+DATA/rondg/datafile/sysaux.258.746987155
datafile 3 switched to datafile copy
input datafile copy RECID=8 STAMP=746987294 file name=+DATA/rondg/datafile/undotbs1.259.746987157
datafile 4 switched to datafile copy
input datafile copy RECID=9 STAMP=746987294 file name=+DATA/rondg/datafile/users.261.746987157
datafile 5 switched to datafile copy
input datafile copy RECID=10 STAMP=746987294 file name=+DATA/rondg/datafile/undotbs2.260.746987157
Finished Duplicate Db at 28-MAR-11

最后一步是向 pfile 添加控制文件,文件名显示在上面的“output file name”行中。然后应在 ASM 中创建一个服务器参数文件,并在集群注册表中注册数据库:

SQL> create spfile=’+DATA/RONDG/spfileRONDG.ora’ from pfile;

File created.
SQL> shutdown immediate
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

不要忘记更新 ORACLEHOME/dbsinit{ORACLE_SID}.ora,使其指向 spfile。这只需在当前节点上执行,您将在稍后的步骤中看到,我们将在 OCR 中定义一个指向 spfile 的指针。如果需要,将自动创建 $ORACLE_HOME/dbs 中缺少的任何 pfile,并指向该 spfile,如配置中所指示。

将数据库注册为 Oracle RAC One 数据库,这个数据库有两个候选服务器 drnode1 和 drnode2。此外,指示数据库用作物理备用数据库,并且仅启动进入挂载模式。另外,还创建一个建议的服务。参见以下示例:

[oracle@drnode1 admin: RON]$ srvctl add database -d RONDG –o \

$ORACLE_HOME -c RACONENODE -e drnode1,drnode2 -w 10 -p
‘+DATA/RONDG/spfileRONDG.ora’ -r PHYSICAL_STANDBY -s mount

[RONDG_1]oracle@drnode1 $ srvctl add service -d RONDG -s \

RONDG_APP.example.com -e session

注意,如果未通过 srvctl add filesystem 在 OCR 中注册 ACFS 资源(此时的确未注册),则无法在此设置对 ACFS 资源的依赖关系。ACFS 挂载的注册方式不同,它使用挂载注册表。

[oracle@drnode1 ~] $ srvctl config database -d RONDG
Database unique name: RONDG
Database name:
Oracle home: /u01/app/oracle/product/11.2.0.2/
Oracle user: oracle
Spfile: +DATA/RONDG/spfileRONDG.ora
Domain: example.com
Start options: mount
Stop options: immediate
Database role: PHYSICAL_STANDBY
Management policy: AUTOMATIC
Server pools: RONDG
Database instances:
Disk Groups: DATA,FRA
Mount point paths:
Services: RONDG_APP.example.com
Type: RACOneNode
Online relocation timeout: 10
Instance name prefix: RONDG
Candidate servers: drnode1,drnode2
Database is administrator managed

[oracle@drnode1 ~] $ srvctl config service -d RONDG
Service name: RONDG_APP.example.com
Service is enabled
Server pool: RONDG
Cardinality: 1
Disconnect: false
Service role: PRIMARY
Management policy: AUTOMATIC
DTP transaction: false
AQ HA notifications: false
Failover type: SESSION
Failover method: NONE
TAF failover retries: 0
TAF failover delay: 0
Connection Load Balancing Goal: LONG
Runtime Load Balancing Goal: NONE
TAF policy specification: NONE
Edition:
Preferred instances: RONDG_1
Available instances:

Clusterware 管理的所有数据库都应通过 srvctl 进行控制,而不是通过 SQL*Plus。使用以下命令启动数据库:

[oracle@drnode1 dbs]$ srvctl start database -d RONDG -n drnode1

[oracle@drnode1 dbs]$ srvctl status database -d RONDG
Instance RONDG_1 is running on node drnode1
Online relocation: INACTIVE

很好,Oracle Data Guard 配置的第一步完成!

回顾
在此阶段我们暂停一下,以消化前面所做的工作:我们成功使用恢复管理器为 Oracle RAC One 数据库创建了备用数据库。所有文件都在 ASM 中,ASM 负责文件名转换。standby_file_management 初始化参数设置为 auto,以防止发生名称冲突。一个额外的好处是,ASM 在磁盘组 DATA 下创建了“子目录”RONDG(主数据库中的是 RON),便于我们区分主数据库和备用数据库。在此方面,任何减少人为错误因素的行为都是受欢迎的。

下一步涉及创建 Oracle Data Guard 配置,以允许在主集群和备用集群之间传递重做信息。现在焦点是 Oracle Data Guard Broker。为便于跟着示例进行操作,我们选择了命令行界面。

Broker 方法
Oracle 9i Database 中引入了 Oracle Data Guard Broker,在自动化至关重要或 IT 人员经验可能不足的场合,该工具帮助极大。在 Oracle Database 10g 中,Broker 界面已得到扩展,它负责管理快速启动故障切换特性,该特性可在高度自动化环境中自动执行角色转换。

使用 broker 创建 Oracle Data Guard 配置的最轻松的方法是使用 Oracle Enterprise Manager Grid Control,不过,还有一种命令行界面形式的替代方法 — Data Guard Manager 命令行模式,即 dgmgrl。此方法可在任何可以使用 SSH 连接的主机上执行,且开销极小。(因为 dgmgrl 方法使用广泛,所以在此主要讨论这个方法。记住,broker 负责设置您手动设置的所有初始化参数。因此建议您不要在 Broker 界面之外修改任何与 Oracle Data Guard 有关的参数。)

Oracle Data Guard Broker 依靠两个配置文件来存储元信息。单实例用户可能不会注意到这两个文件,因为其位置在此类配置中并非十分重要,默认设置即可正常工作。对于任何集群环境(包括 Oracle RAC 和 Oracle RAC One Node),broker 配置文件需要位于共享存储上。由于我们毕竟使用 ASM 作为存储后端,因此将 broker 配置文件放在此处再好不过。还可以使用一个支持的集群文件系统。

配置初始化文件
您可以在 SQL*Plus 中定义 broker 配置文件,如在本示例中针对备用数据库 RONDG 那样:

SQL> alter system set dg_broker_config_file1=’+DATA/rondg/dr1.dat’;
SQL> alter system set dg_broker_config_file2=’+DATA/rondg/dr2.dat’;

不要忘记还要为主数据库设置该参数 — 会发生滚动变化:

SQL> alter system set dg_broker_config_file1=’+DATA/ron/dr1.dat’;
SQL> alter system set dg_broker_config_file2=’+DATA/ron/dr2.dat’;

如果本地监听器未在默认端口 1521 监听,且尚未设置初始化参数 local_listener,则须手动设置该参数。如果您不知道监听器端口是什么,可以执行 srvctl config listener 来查明该端口。除此之外,无需为初始化文件进行进一步配置;broker 将负责所有其他配置。

现在在主数据库和备用数据库上启动 broker:

SQL> alter system set dg_broker_start=true;

在 alert.log 中您可以看到 broker 进程启动。

准备监听器
在角色转换期间,broker 将必须重新启动数据库实例。为此,它需要静态注册的数据库实例。默认情况下,静态服务名将遵循 Oracle Data Guard Broker 的以下命名约定:

DB_NAME_DGMGRL.db_domain

如果该域存在,则添加该域非常重要!在本示例中,主数据库将使用 RON_DGMGRL.example.com 作为其静态连接标识符。

(注意:记住,RON 数据库的 ORACLE_SID 是动态的,您的实例与集群节点之间没有静态映射!ORACLE_SID 将采用 dbUniqueName_N 形式,其中 N 可以是 1 或 2。如果您不喜欢,有一个选项可以通过定义自定义实例名前缀 [option -i to srvctl add database] 来偏离命名标准。大多数情况下您会发现数据库使用 dbUniqueName_1 SID,但在迁移或意外停机期间您一定会看到 dbUniqueName_2 SID。)

每个可能的 ORACLE_SID 都需要在每个候选服务器的 listener.ora 中静态注册。在本示例中,RON 有 2 台候选服务器,因此可以有两个 ORACLE_SID:RON_1 和 RON_2。RONDG 同样如此,它也有两台候选服务器。因此需要向其各自候选服务器的监听器静态注册每个 ORACLE_SID。在 broker 的数据库属性 StaticConnectIdentifier 中可以看到此需求。

您需要修改 $GRID_HOME/network/admin/listener.ora 中的 listener.ora 文件以添加静态连接标识符。以下是主集群上监听器的 SID_LIST 的一个示例(注意 SID_LIST_LISTENERNAME 是以前所没有的)。服务名也已静态注册,这是可选的。

SID_LIST_LISTENER=

data guard broker

(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=RON_DGMGRL.example.com)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
(SID_NAME=RON_1)
)
(SID_DESC=
(GLOBAL_DBNAME=RON_DGMGRL.example.com)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
(SID_NAME=RON_2)
)

the same but not exclusively for the broker

(SID_DESC=  (GLOBAL_DBNAME=RON.example.com)  (ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)  (SID_NAME=RON_1))(SID_DESC=  (GLOBAL_DBNAME=RON.example.com)  (ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)  (SID_NAME=RON_2))

)

所有其他服务均动态注册。DR 集群的 listener.ora 文件的设置如下所示:

SID_LIST_LISTENER=

data guard broker

(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=RONDG_DGMGRL.example.com)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
(SID_NAME=RONDG_1)
)
(SID_DESC=
(GLOBAL_DBNAME=RONDG_DGMGRL.example.com)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)
(SID_NAME=RONDG_2)
)

the same but not exclusively for the broker

(SID_DESC=  (GLOBAL_DBNAME=RONDG.example.com)  (ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)  (SID_NAME=RONDG_1))(SID_DESC=  (GLOBAL_DBNAME=RONDG.example.com)  (ORACLE_HOME=/u01/app/oracle/product/11.2.0.2/)  (SID_NAME=RONDG_2))

)

添加配置之后,重新加载了每个本地监听器。

创建 Broker 配置
所有准备工作完成之后,就该启动 dgmgrl 并创建配置了。Broker 要求以 SYSDBA 身份进行连接,用户 martin 拥有该权限。或者,以 SYS 用户身份连接到数据库。

通过以下两个步骤来创建 Broker 配置:第一步创建配置,第二步添加备用数据库。最后,启用该配置。以下是一个示例:

$ dgmgrl martin/xxx
DGMGRL for Linux: Version 11.2.0.2.0 - 64bit Production

Copyright (c) 2000, 2009, Oracle.All rights reserved.

Welcome to DGMGRL, type “help” for information.
Connected.
DGMGRL> CREATE CONFIGURATION brokertest as

PRIMARY DATABASE IS RON
CONNECT IDENTIFIER IS RON;
Configuration “brokertest” created with primary database “RON”

DGMGRL> add database RONDG

as connect identifier is RONDG
maintained as physical;
Database “RONDG” added

添加数据库之后,可以检查配置的状态:

DGMGRL> show configuration verbose

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RON - Primary database
RONDG - Physical standby database

Properties:
FastStartFailoverThreshold = ‘30’
OperationTimeout = ‘30’
FastStartFailoverLagLimit = ‘30’
CommunicationTimeout = ‘180’
FastStartFailoverAutoReinstate = ‘TRUE’
FastStartFailoverPmyShutdown = ‘TRUE’
BystandersFollowRoleChange = ‘ALL’

Fast-Start Failover: DISABLED

Configuration Status:
DISABLED

还可以逐个查看数据库。可以使用“verbose”属性显示更多信息。

DGMGRL> show database verbose RON

Database - RON

Role: PRIMARY
Intended State: OFFLINE
Instance(s):
RON_1

Properties:
DGConnectIdentifier = ‘RON’
ObserverConnectIdentifier = ”
LogXptMode = ‘ASYNC’
DelayMins = ‘0’
Binding = ‘optional’
MaxFailure = ‘0’
MaxConnections = ‘1’
ReopenSecs = ‘300’
NetTimeout = ‘30’
RedoCompression = ‘DISABLE’
LogShipping = ‘ON’
PreferredApplyInstance = ”
ApplyInstanceTimeout = ‘0’
ApplyParallel = ‘AUTO’
StandbyFileManagement = ‘AUTO’
ArchiveLagTarget = ‘900’
LogArchiveMaxProcesses = ‘4’
LogArchiveMinSucceedDest = ‘1’
DbFileNameConvert = ”
LogFileNameConvert = ”
FastStartFailoverTarget = ”
InconsistentProperties = ‘(monitor)’
InconsistentLogXptProps = ‘(monitor)’
SendQEntries = ‘(monitor)’
LogXptStatus = ‘(monitor)’
RecvQEntries = ‘(monitor)’
SidName = ‘RON_1’
StaticConnectIdentifier = ‘(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.99.91)(PORT=2001))(CONNECT_DATA=(SERVICE_NAME=RON_DGMGRL.example.com)(INSTANCE_NAME=RON_1)(SERVER=DEDICATED)))’
StandbyArchiveLocation = ‘USE_DB_RECOVERY_FILE_DEST’
AlternateLocation = ”
LogArchiveTrace = ‘0’
LogArchiveFormat = ‘%t_%s_%r.dbf’
TopWaitEvents = ‘(monitor)’

Database Status:
DISABLED

此处值得注意的一个事实是 Broker 认识到 RON 实际是一个集群数据库。从上述输出的前几行中可以看出这点:

DGMGRL> show database verbose RON

Database - RON

Role: PRIMARY
Intended State: OFFLINE
Instance(s):
RON_1

类似地,可以查看备用数据库的属性:

DGMGRL> show database verbose RONDG

Database - RONDG

Role: PHYSICAL STANDBY
Intended State: OFFLINE
Transport Lag: (unknown)
Apply Lag: (unknown)
Real Time Query: OFF
Instance(s):
RONDG_2

Properties:
DGConnectIdentifier = ‘RONDG’
ObserverConnectIdentifier = ”
LogXptMode = ‘ASYNC’
DelayMins = ‘0’
Binding = ‘OPTIONAL’
MaxFailure = ‘0’
MaxConnections = ‘1’
ReopenSecs = ‘300’
NetTimeout = ‘30’
RedoCompression = ‘DISABLE’
LogShipping = ‘ON’
PreferredApplyInstance = ”
ApplyInstanceTimeout = ‘0’
ApplyParallel = ‘AUTO’
StandbyFileManagement = ‘AUTO’
ArchiveLagTarget = ‘900’
LogArchiveMaxProcesses = ‘4’
LogArchiveMinSucceedDest = ‘1’
DbFileNameConvert = ”
LogFileNameConvert = ”
FastStartFailoverTarget = ”
InconsistentProperties = ‘(monitor)’
InconsistentLogXptProps = ‘(monitor)’
SendQEntries = ‘(monitor)’
LogXptStatus = ‘(monitor)’
RecvQEntries = ‘(monitor)’
SidName = ‘RONDG_2’
StaticConnectIdentifier = ‘(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.99.99)(PORT=2001))(CONNECT_DATA=(SERVICE_NAME=RONDG_DGMGRL.example.com)(INSTANCE_NAME=RONDG_2)(SERVER=DEDICATED)))’
StandbyArchiveLocation = ‘USE_DB_RECOVERY_FILE_DEST’
AlternateLocation = ”
LogArchiveTrace = ‘0’
LogArchiveFormat = ‘%t_%s_%r.dbf’
TopWaitEvents = ‘(monitor)’

Database Status:
DISABLED

看看输出中的 TopWaitEvents 行;您可以轻松查询备用数据库 和主数据库上的主要等待事件。始终可获取主(或逻辑备用)数据库的前 n 个事件,这对于物理备用数据库而言是新的。

从输出来看,一切正常,因此我们来启用配置。我们在主数据库和备用数据库上创建了备用重做日志以解析“show configuration”输出中的警告消息。(稍后我将详细介绍如何创建备用重做日志。)

DGMGRL> enable configuration
Enabled.

DGMGRL> show configuration verbose

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RON - Primary database
RONDG - Physical standby database

Properties:
FastStartFailoverThreshold = ‘30’
OperationTimeout = ‘30’
FastStartFailoverLagLimit = ‘30’
CommunicationTimeout = ‘180’
FastStartFailoverAutoReinstate = ‘TRUE’
FastStartFailoverPmyShutdown = ‘TRUE’
BystandersFollowRoleChange = ‘ALL’

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

角色转换
Oracle Data Guard 的一个主要目标是允许角色转换。可能有两种不同类型的角色转换:正常转换和故障切换。这两个术语在口语中常常互换使用,但实际上却有很大不同。

下面几节说明如何执行它们。

执行正常转换
准备好 Oracle Data Guard Broker 之后,可以轻松执行转换操作。不必使用一些 SQL 命令来转换角色,只需一个命令。至于配置,您需要使用 dgmgrl 工具来启动转换。您应以 SYSDBA 身份通过 Net*8 进行连接:

[oracle@node1 ~]$ dgmgrl sys/xxx@ron

妙处在于,只需键入一个命令即可启动转换。我们来看看下面这个示例:

DGMGRL> show configuration

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RON - Primary database
RONDG - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

DGMGRL> switchover to RONDG
Performing switchover NOW, please wait…
New primary database “RONDG” is opening…
Operation requires shutdown of instance “RON_2” on database “RON”
Shutting down instance “RONDG_2”…
ORACLE instance shut down.
Operation requires startup of instance “RON_2” on database “RON”
Starting instance “RON_2”…
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is “RONDG”

这很简单,对不对?如果您未向监听器静态注册实例,则启动命令将失败。如果出现这种情况,您始终可以手动完成缺失的步骤。在“switchover succeeded, new primary is «RONDG»”行之后,可以验证配置的新状态:

DGMGRL> show configuration

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RONDG - Primary database
RON - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

DGMGRL> exit

转换过程到此结束。要在方便的时候切换回 RON 数据库,请使用同一过程并互换数据库名称。

执行故障切换操作
与转换操作类似,Broker 界面极大地简化了执行故障切换操作的任务。故障切换可以是完全的(complete,默认值)也可以是立即的 (immediate)。默认故障切换在激活备用数据库之前尝试恢复尽可能多的重做信息,从而尽量减少数据损失。对于计划的受控故障切换测试,建议在挂载主数据库时使用 alter system flush redo to db_unique_name confirm apply 语句刷新所有重做来避免数据损失。(注意 ALTER SYSTEM FLUSH REDO 引起的错误 9044026 ORA-16447,这个错误影响低于 Oracle 11.2.0.2 的版本,导致在某些条件下不能刷新重做。)

在进行故障切换之前,我们先来看看当前配置:

DGMGRL> show configuration

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RON - Primary database
RONDG - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

该配置工作正常,没有出现警告。了解了这些之后,我们就可以执行故障切换了,如下所示:

DGMGRL> failover to RONDG
Performing failover NOW, please wait…
Failover succeeded, new primary is “RONDG”
DGMGRL> show configuration

Configuration - brokertest

Protection Mode: MaxPerformance
Databases:
RONDG - Primary database
RON - Physical standby database (disabled)
ORA-16661: the standby database needs to be reinstated

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

如您所见,故障切换已完成,但需要恢复新的备用数据库 RON。启用闪回数据库之后,broker 可以使用 reinstate database 命令完成此操作,如以下示例所示:

DGMGRL> reinstate database RON
Reinstating database “RON”, please wait…
Reinstatement of database “RON” succeeded
DGMGRL> show configuration

Configuration
Name: brokertest
Enabled: YES
Protection Mode: MaxPerformance
Fast-Start Failover: DISABLED
Databases:
RONDG - Primary database
RON - Physical standby database

Current status for “brokertest”:
SUCCESS

DGMGRL>

如果自动恢复失败,很可能需要从备份恢复数据库。作为最后一种办法,您可以尝试使用 flashback database 命令将数据库闪回到主数据库激活时的点(v$database 视图中包含了此信息)。

总结
至此已有许多信息需要消化。本文旨在说明 Oracle RAC One Node 和任何其他 Oracle 数据库类型一样可轻松使用 Oracle Data Guard。遵循本文描述的原则,您可以顺畅地进行故障切换及后续转换操作。

和往常一样,请经常实践 DR 策略并记下需要遵守的过程。许多 DBA 都亲身体验到数据库的角色转换通常是 DR 场景中较为轻松的部分。

在第 2 部分,我们将研究更高级的 Oracle Data Guard 手动配置方法。

原创粉丝点击