Oracle 白皮书-Oracle Data Guard 快速启动故障切换指南(2)

Oracle Data Guard 快速启动故障切换指南

作者:John Smiley

指南概述

本指南首先介绍一个将作为 Data Guard 配置主数据库的数据库。对于本次构建,我们将使用一个物理备用数据库。FSFO 还可以与逻辑备用数据库结合使用,支持 FSFO 的配置可有多个备用数据库,包括混合的物理数据库和逻辑数据库,但只有一个备用数据库可随时作为故障切换目标。

本指南中的主要步骤包括:

  1. 配置 Oracle Net(即 SQL*Net)

  2. 准备主数据库

  3. 创建物理备用数据库

  4. 启用闪回数据库

  5. 创建 Broker 配置

  6. 配置观察器

  7. 启用并测试 FSFO

本文使用的惯例

数据库主机称为“a”和“b”主机,数据库本身称为“a”和“b”数据库。观察器主机是“observer.demo.org”。

示例中使用的名称:

数据库名称

db1

数据库唯一名称

db1_a

db1_b

域名

demo.org
主机名

dbhost-a

dbhost-b
observer

Data Guard 监听器名称 LISTENER_DG
TNS 别名

db1_a

db1_b

输入的命令在阴影框中以普通文本显示。 预期输出以蓝色文本显示。

配置 Oracle Net

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)    )  )

配置命名方法


为每个数据库创建一个唯一的连接别名。用每个数据库的 db_unique_name 作为 Oracle Net 别名既简单又直观。



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)    )  )

启动 Data Guard 监听器

hosts.启动“a”和“b”主机上的 Data Guard 监听器。

lsnrctl start LISTENER_DG

测试 Oracle Net 连接

验证来自两个主机的配置。

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_listeners 参数

为了使数据库在 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

创建 spfile

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

设置 db_unique_name

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

设置 log_archive_config

必须先设置该参数,然后才能在最高可用性模式下打开主数据库。其余 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 条目

向备用数据库的 oratab 文件添加一个条目

db1:/u01/app/oracle/product/11.1.0/db_1:Y

创建 init.ora 文件

对于 RMAN 复制活动数据库方法而言,init.ora 文件(本示例中为 initdb1.ora)仅需要一个参数:db_name(甚至不必是数据库的真实名称 ― 可使用任意名称)。RMAN 将从主数据库复制 spfile,因此仅在复制的第一阶段需要该 init.ora 文件。

db_name = db1

设置环境

确保备用数据库上的操作系统环境已设置。使用 Oracle 提供的 oraenv 脚本。

以非安装方式启动备用数据库

startup nomount

使用 RMAN 创建备用数据库

运行 RMAN 实用程序并连接到目标(主数据库)和辅助对象(新备用数据库)。

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

设置 Data Guard Broker 配置文件的位置

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

启用 Data Guard Broker

启用(主数据库和备用数据库)

alter system set dg_broker_start=true;

验证

show parameter dg_broker_start

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

dg_broker_start                      boolean     TRUE

配置 Broker

在主数据库上启动 dgmgrl 实用程序并以 SYS 身份进行连接

dgmgrl sys/password@db1_a

创建 Broker 配置

添加主数据库

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


你可能感兴趣的:(oracle)