概述
本文档将指导您使用物理备用服务器配置 Oracle Data Guard 快速启动故障切换 (FSFO)。FSFO 可以显著提高所有环境的可用性和灾难恢复准备,从基于云的价格低廉的系统一直到全球分布的数据中心。
本指南中的信息基于在跨国公司生产环境中部署 FSFO 的实践经验。 本指南对您的现有环境做出几个假设,并且包括创建物理备用服务器和 Data Guard Broker 配置的示例。要开始本指南,您只需 Oracle 数据库企业版 10.2 版或更高版本、一个数据库和三个主机:两个主机用于数据库,一个小型主机用于 FSFO 观察器。本指南不对操作系统进行讨论;然而,一些示例中可能包含了特定于平台的元素(如路径和文件命名惯例)。
FSFO 环境的主要组件
FSFO 构建于众多其他 Oracle 技术和特性(如 Data Guard、闪回数据库和 Data Guard Broker)之上。
Data Guard
FSFO 的基础是 Data Guard — 一个主数据库和至少一个备用数据库。备用数据库可以是物理的或逻辑的,可以有多个备用数据库,但只有一个备用数据库可作为随时进行故障切换的目标。以下段落将描述受支持的可用性模式。
最高可用性模式(Oracle 数据库 10g 第 2 版及更高版本)
在最高可用性模式中,FSFO 保证在故障切换期间不会丢失已收到提交确认 的事务。该保证的代价是增加提交延迟(log file sync 等待事件)。最高可用性模式使用同步重做传输,FSFO 则增加了额外要求,即重做应记录在目标备用数据库(log_archive_dest_n 的 AFFIRM 选项)的备用重做日志 (SRL) 中。Overall commit latency is increased by the round-trip network latency.往返网络延迟增加了总体提交延迟。增加的延迟降低了吞吐量;然而,有些时候吞吐量的差异是由增加的并行造成的。
虽然重做传输是同步的,但如果备用数据库由于某种原因(如备用数据库、主机或网络故障)不可用,最高可用性模式会保持主数据库可用。如果在用户指定的时间段(log_archive_dest_n 的 NET_TIMEOUT 选项)之后,主数据库无法联系到备用数据库,它将退出同步传输模式并开始像在最高性能模式中一样进行操作。当备用数据库再次可用时,主数据库和备用数据库重新同步并恢复同步重做传输。
最高性能模式(Oracle 数据库 11g 第 1 版及更高版本)
Oracle 数据库 11g FSFO 增加了对最高性能模式的支持(异步重做传输),提供了用持久性换取性能的灵活性。提交延迟不受重做传输的影响,但备用数据库未收到其重做的已提交事务将在故障切换期间丢失。通过指定故障切换期间丢失事务的最大允许时间,最高性能模式中的 FSFO 配置可以限制潜在的数据丢失。例如,如果指定的限定值为 30 秒(默认),FSFO 将保证在故障切换期间保存 30 秒钟内提交的所有事务。最小允许限定值为 10 秒钟。
Data Guard Broker
Broker 是一个 Data Guard 管理实用程序,用于维护有关主数据库及其备用数据库的状态信息。它自动设置与 Data Guard 相关的数据库初始化参数(如实例启动和角色转换)、启动备用数据库的应用服务,并且自动执行与维护 Data Guard 配置相关的许多管理任务。FSFO 是 Broker 的一个特性,用于记录故障切换目标的相关信息,例如,故障发生后到触发故障切换之间的等待时间以及 FSFO 的其他特有属性。
闪回数据库
闪回数据库是一个集成在 Oracle 数据库中的持续数据保护 (CDP) 解决方案。它使用名为闪回日志的磁盘数据结构,提供一个将数据库快速恢复到之前时间点或 SCN 的方法。数据库闪回比传统的时间点或基于 SCN 的恢复速度更快、结合更完美(一条简单的 DDL 语句)。FSFO 将闪回数据库用作将故障主数据库恢复为备用数据库流程的一部分。
自动恢复的问题通常因为错误的配置,因此我们来了解一些详细信息。
闪回数据库记录经过更改的数据块的前映像。为了避免记录每个数据块的每次更改的开销,闪回数据库每 30 分钟进行一次“模糊”快照,仅记录前映像块上一次快照后的第一次更改。在同一快照期间中,不再记录对同一数据块的后续更改。
数据库的闪回分成两个阶段:
- 恢复 — 闪回数据库将数据文件恢复到指定 SCN 前最近的快照。这可以与执行从指定 SCN 前的备份进行数据文件 RMAN 恢复相比,但是速度更快。
- 介质恢复 — 恢复完成后,恢复将作为典型介质恢复继续进行,根据存档重做日志和联机重做日志应用重做并通过撤消回滚未提交的更改。这意味着为了使闪回数据库操作成功,闪回数据库需要在快照时间和恢复 SCN 之间生成的所有存档重做日志(通常为重做后的 30 分钟)。使用 V$RECOVERY_PROGRESS 视图监视恢复状态。
对于 FSFO 环境,设置 db_flashback_retention_target = 60 或更高值,可以为自动备用恢复提供足够的闪回数据库历史记录。模糊快照的元数据存储在闪回日志本身中。如果没有元数据,Oracle 将无法找到模糊快照,从而无法进行闪回。为了避免计时差异产生的问题,我们建议值设置为不少于 60 分钟,实际上,如果值设置为 30 或 30 以下,肯定会导致闪回数据库故障。
闪回数据库将日志存储在快速恢复区 (FRA) 中,所以 FRA 必须有足够大的空间来存储至少 60 分钟的闪回数据库历史记录。总的存储需求与快照期间更改的不同数据块的数量成比例,例如,一小组数据块上的 1,000,000 次块更改生成的闪回数据库历史记录小于一大组数据块上的 1,000,000 次块更改所生成的闪回数据库历史记录。确定闪存数据库存储需求的一个好方法是,启用闪存数据库并观察其在几次峰值负载时所使用的存储量。通过启用闪回数据库来确定其存储需求也有一定的风险 — 如有必要,在主数据库处于打开状态时可以将其禁用。然而,重新启用闪回数据库将需要回弹,因为数据库必须进行安装且未打开。
FSFO 观察器
观察器是非常典型的主/备用 Data Guard 配置中的第三方。它实际上是一个内置于 DGMGRL CLI(Data Guard Broker 命令行界面)中、占用空间很小的 OCI 客户端,与其他所有客户端一样,可以运行在与数据库服务器不同的硬件平台上。其主要工作是在条件允许时执行故障切换,而不影响 DBA 设置的数据持久性约束条件。只有观察器能启动 FSFO 故障切换。它的另一个工作是在启用该特性的情况下(默认)自动将主数据库恢复为备用数据库。观察器是 Data Guard 故障切换在强健的高可用性解决方案中承担重要角色的关键因素,也是造成 Data Guard 故障切换在 FSFO 出现前后重大差异的关键因素。
注:FSFO 观察器版本必须与数据库版本匹配。 Oracle 数据库 11g 观察器与 10g 数据库不兼容,Oracle 数据库 10g 观察器与 11g 数据库也不兼容。
FSFO 故障切换的条件
默认情况下,当且仅当满足以下条件时,观察器才会启动到目标备用数据库的故障切换:
- 观察器正在运行
- 观察器和备用数据库均与主数据库失去联系
- 注:如果观察器与主数据库失去联系,但是备用数据库并未失去联系,观察器可以确定主数据库仍然通过备用数据库运行。
- 观察器仍然保持与备用数据库的联系
- 满足持久性约束条件
- 故障切换阈值延时已过
用户可配置的故障切换条件(11g 及更高版本)
Oracle 数据库 11g 第 1 版引入了用户可配置的故障切换条件,这些条件可以触发观察器立即启动故障切换。
运行状况条件
Broker 可配置为在以下任一条件下启动故障切换。以蓝色显示的条件是默认启用的。
- Datafile Offline(由于 IO 错误)
- Corrupted Controlfile
- Corrupted Dictionary
- Inaccessible Logfile(由于 IO 错误)
- Stuck Archiver
Oracle 错误 (ORA-NNNNN)
您可以指定一个将启动 FSFO 故障切换的 ORA 错误列表。该列表默认为空。
应用程序启动
应用程序可直接使用 DBMS_DG.INITIATE_FS_FAILOVER 过程启动 FSFO 故障切换,并包括一个可选的在观察器日志和主数据库警报日志中显示的消息文本。
指南概述
本指南首先介绍一个将作为 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 |
输入的命令在阴影框中以普通文本显示。预期输出以 蓝色文本显示。
配置 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)
)
)
配置命名方法
示例 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 监听器
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 参数
注:您也可以在设置 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
启用强制日志记录
启用
alter database force logging;
验证
select force_logging from v$database;
FOR
---
YES
创建 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
创建口令文件
创建
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID
验证
select * from v$pwfile_users;
USERNAME SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS TRUE TRUE FALSE
启用远程登录
启用
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
设置
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
配置快速恢复区
配置
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_area
db_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
设置
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)
创建备用重做日志
创建
select bytes, count(group#) from v$log group by bytes;
BYTES COUNT(GROUP#)
---------- -------------
52428800 3
select max(group#) from v$log;
MAX(GROUP#)
-----------
3
在本示例中,有 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
启用最高可用性模式
启用
alter database set standby database to maximize availability;
验证
select protection_mode from v$database;
PROTECTION_MODE
--------------------
MAXIMUM AVAILABILITY
创建备用数据库
将主数据库中的口令文件复制到备用数据库
创建 oratab 条目
db1:/u01/app/oracle/product/11.1.0/db_1:Y
创建 init.ora 文件
db_name = db1
设置环境
以非安装方式启动备用数据库
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;
从活动主数据库复制数据库
注:如果您刚启用了存档日志模式,则会强行创建一个存档日志 ( 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 配置文件的位置
设置(主数据库和备用数据库)
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/dgbr
oker/dg1db1.dat
dg_broker_config_file2 string /u02/app/oracle/admin/db1/dgbr
oker/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' as
primary database is db1_a
connect identifier is db1_a;
Configuration "FSF" created with primary database "db1_a"
添加备用数据库
add database db1_b as
connect identifier is db1_b
maintained 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
编辑数据库属性
默认情况下,Broker 将主数据库设置为使用异步日志传输。针对最高可用性环境时,需要将此设置更改为同步。
NetTimeout
NetTimeout 属性指定在考虑连接丢失前 LGWR 将阻塞对同步模式中来自备用数据库的确认的等待秒数(对应于 log_archive_dest_n 的 NET_TIMEOUT 选项)。默认值为 30 秒。使用最高可用性模式时,考虑降低该值以减少备用数据库不可用时的提交阻塞时间。选择一个足够高的值,避免由间歇性网络问题引起的假性断开。本示例使用 10 秒钟。
ObserverConnectIdentifier(11g 及更高版本)
Oracle 数据库 11 g 将 ObserverConnectIdentifier 数据库属性添加到 Broker 配置,使您可以为观察器指定一个连接标识符,用于监视主数据库和故障切换目标。默认情况下,观察器和 Data Guard 使用相同的连接标识符在主数据库和备用数据库间进行重做传输和信息交换(Oracle 数据库 11 g 中为
DGConnectIdentifier
,Oracle 数据库 10
g 中为
InitialConnectIdentifier
)。
ObserverConnectIdentifier 使您可以指定观察器使用不同的连接标识符。例如,您可以用此参数使观察器使用与客户端应用程序相同的连接标识符监视数据库。
在本指南中,我们将在保留其他属性的默认值,但您应熟悉所有 Broker 配置和数据库属性。Data Guard Broker 文档(10 g 和 11 g)第 9 章中包含了每个属性的描述。其中一些属性已经在这两个版本中有所改动。
注:Broker 的许多数据库属性与数据库 spfile 参数相对应。Broker 在角色转换、数据库启动/关闭以及其他事件期间,通过执行相应的 ALTER SYSTEM 命令来维护这些参数。如果这些参数在 Broker 外部进行了修改,将出现警告。要查看特定参数,使用“show database ... StatusReport”命令。
edit database db1_a set property LogXptMode='SYNC';
edit database db1_a set property NetTimeout=10;
edit database db1_b set property NetTimeout=10;
启用配置
enable configuration;
验证配置
show configuration
Configuration
Name: FSF
Enabled: YES
Protection Mode: MaxAvailability
Databases:
db1_a - Primary database
db1_b - Physical standby database
Fast-Start Failover: DISABLED
Current status for "FSF":
SUCCESS
启用快速启动故障切换
注意,启用 FSFO 并不能使其完成自动故障切换的配置 — 这需要我们接下来将介绍的观察器。
enable fast_start failover;
Enabled.
show configuration
Configuration
Name: FSF
Enabled: YES
Protection Mode: MaxAvailability
Databases:
db1_a - Primary database
db1_b - Physical standby database
- Fast-Start Failover target
Fast-Start Failover: ENABLED
Current status for "FSF":
Warning: ORA-16608: one or more databases have warnings
show database db1_a statusreport
STATUS REPORT
INSTANCE_NAME SEVERITY ERROR_TEXT
* ERROR ORA-16819: fast-start failover observer not started
配置观察器
由于观察器是 dgmgrl 会话的特定实例,观察器主机应安装 Oracle Client Administrator 软件或完整的 Oracle 数据库软件系列。
验证到主数据库和备用数据库的连接
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)
启动观察器
dgmgrl sys/password@db1_a
start observer;
observer started
验证配置
dgmgrl sys/password@db1_a
show configuration verbose
Configuration
Name: FSF
Enabled: YES
Protection Mode: MaxAvailability
Databases:
db1_a - Primary database
db1_b - Physical standby database
- Fast-Start Failover target
Fast-Start Failover: ENABLED
Threshold: 30 seconds
Target: db1_b
Observer: observer.demo.org
Lag Limit: 30 seconds (not in use)
Shutdown Primary: TRUE
Auto-reinstate: TRUE
Current status for "FSF":
SUCCESS
show fast_start failover;
Fast-Start Failover: ENABLED
Threshold: 30 seconds
Target: db1_b
Observer: observer.demo.org
Lag Limit: 30 seconds (not in use)
Shutdown Primary: TRUE
Auto-reinstate: TRUE
Configurable Failover Conditions
Health Conditions:
Corrupted Controlfile YES
Corrupted Dictionary YES
Inaccessible Logfile NO
Stuck Archiver NO
Datafile Offline YES
Oracle Error Conditions:
(none)
测试配置
测试双向转换
dgmgrl sys/password@db1_a
switchover to db1_b
Performing switchover NOW, please wait...
New primary database "db1_b" is opening...
Operation requires shutdown of instance "db1" on database "db1_a"
Shutting down instance "db1"...
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
Operation requires startup of instance "db1" on database "db1_a"
Starting instance "db1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "db1_b"
show configuration
Configuration
Name: FSF
Enabled: YES
Protection Mode: MaxAvailability
Databases:
db1_b - Primary database
db1_a - Physical standby database
- Fast-Start Failover target
Fast-Start Failover: ENABLED
Current status for "FSF":
SUCCESS
switchover to db1_a
Performing switchover NOW, please wait...
New primary database "db1_a" is opening...
Operation requires shutdown of instance "db1" on database "db1_b"
Shutting down instance "db1"...
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
Operation requires startup of instance "db1" on database "db1_b"
Starting instance "db1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "db1_a"
show configuration
Configuration
Name: FSF
Enabled: YES
Protection Mode: MaxAvailability
Databases:
db1_a - Primary database
db1_b - Physical standby database
- Fast-Start Failover target
Fast-Start Failover: ENABLED
Current status for "FSF":
SUCCESS
双向测试 FSFO 故障切换
我们还可以使用 dgmgrl 故障切换命令来启动故障切换。这将演练配置,但触发故障切换的方式与失去与主数据库的连接不同。
检查闪回数据库记忆
在即将中止的主数据库上:
select (sysdate - oldest_flashback_time)*24*60 as history from v$flashback_database_log;
HISTORY
----------
140.35
创建一些测试数据
作为测试用户登录,并进行一些不会影响系统其他部分的更改。
-- Note that DDL statements automatically commit
create table x as select * from all_objects;
Table created.
select count(*) from x;
COUNT(*)
----------
68855
启动 FSFO 故障切换
shutdown abort
观察器日志:
Initiating Fast-Start Failover to database "db1_b"...
Performing failover NOW, please wait...
Failover succeeded, new primary is "db1_b"
dgmgrl sys/password@db1_b
show configuration
Configuration
Name: FSF
Enabled: YES
Protection Mode: MaxAvailability
Databases:
db1_b - Primary database
db1_a - Physical standby database (disabled)
- Fast-Start Failover target
Fast-Start Failover: ENABLED
Current status for "FSF":
Warning: ORA-16608: one or more databases have warnings
查看测试数据
select count(*) from x;
COUNT(*)
----------
68855
将之前中止的主数据库恢复为备用数据库
恢复的第一步是将数据库闪回到备用数据库变为主数据库的 SCN 处(新主数据库上的 v$database.standby_became_primary_scn)。如 闪回数据库部分中所述,闪回数据库将分成两个阶段进行:恢复阶段和介质恢复阶段。在恢复阶段,闪回数据库使用闪回数据库日志中的前映像块将数据库恢复到 standby_became_primary_scn 之前的一点。在介质恢复阶段中,闪回数据库应用重做以将数据库带到 standby_became_primary_scn。为使闪回数据库成功,闪回数据库日志中必须包括足够的可用历史记录,并且恢复点和 standby_became_primary_scn 之间生成的所有重做必须可用。如果闪回数据库失败,自动恢复将停止,您将需要手动执行基于 SCN 的恢复以恢复到 standby_became_primary_scn,直到完成该恢复。
一旦闪回数据库成功,观察器会将该数据库转换为备用数据库,执行回弹并开始应用服务。
startup mount
Initiating reinstatement for database "db1_a"...
Reinstating database "db1_a", please wait...
Operation requires shutdown of instance "db1" on database "db1_a"
Shutting down instance "db1"...
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
Operation requires startup of instance "db1" on database "db1_a"
Starting instance "db1"...
ORACLE instance started.
Database mounted.
Continuing to reinstate database "db1_a" ...
Reinstatement of database "db1_a" succeeded
Configuration
Name: FSF
Enabled: YES
Protection Mode: MaxAvailability
Databases:
db1_b - Primary database
db1_a - Physical standby database
- Fast-Start Failover target
Fast-Start Failover: ENABLED
Current status for "FSF":
SUCCESS
在另一个方向重复操作
主数据库停滞
本指南中介绍的简单测试有利于确保基础部分正常工作,但是您可能希望开发一套更全面、更适合您的环境和需求的测试。
监视 FSFO 准备情况
询问 Broker
询问主数据库
fs_failover_status =
'SYNCHRONIZED' for MaxAvail
'TARGET UNDER LAG LIMIT' for MaxPerf
fs_failover_observer_present = 'YES'
备用数据库应用
闪回数据库历史记录
客户端通知
Oracle 还为 OCI 客户端提供快速应用通知 (FAN),为 JDBC 客户端提供快速连接故障切换。这些功能使利用它们的应用程序可以异步接收数据库事件的通知(包括角色转换)。
附录
创建观察器包装
创建钱夹
下面提供的 *nix 简单示例适用于两个版本。Oracle 数据库 10 g FSFO 观察器限于使用钱夹中定义的默认用户名和口令。在 10g 中,一个钱夹可以用于多个观察器,但必须使用相同的 SYS 口令。Oracle 数据库 11 g 观察器可使用特定的凭证,允许同一钱夹在多个观察器中使用不同的 SYS 口令。
创建存储钱夹的目录。
mkdir -p /u01/app/oracle/admin/wallet
mkstore -wrl /u01/app/oracle/admin/wallet -createEntry oracle.security.client.default_username SYS
mkstore -wrl /u01/app/oracle/admin/wallet -createEntry oracle.security.client.default_password <sys password>
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/admin/wallet)
)
)
SQLNET.WALLET_OVERRIDE = TRUE
确定观察器状态文件(fsfo.dat 文件)的存储位置
mkdir -p /u01/app/oracle/admin/db1/observer
观察器启动命令
nohup dgmgrl /@db1 "start observer file='/u01/app/oracle/admin/db1/observer/fsfo.dat'" /
>> /u01/app/oracle/admin/db1/observer/dgmgrl.log &
有助于了解观察器的信息
- 所有与观察器相关联的连接(包括初始连接)必须使用专用服务器连接。使用 Shared Server (MTS) 或连接池可能导致无法预料的行为。
- 为实现可靠的启动,初始连接应始终连接到主数据库。运行中的观察器在角色转换后将自动跟随主数据库,但如果初始连接连接到故障数据库或者包含过期或损坏的 Broker 配置文件的数据库,新(重新)启动的观察器将不会启动。
- 启动可能会失败,原因为“cORA-16647: could not start more than one observer”。如果之前的观察器进程未注销即终止并且新观察器未使用之前的 fsfo.dat 文件,那么即使没有观察器在实际运行也会发生该错误。如果出现此情形,运行“stop observer”并重试。
- 至少配置两台主机来运行观察器是一个比较好的办法,这样,其中一台主机可以在另一台发生故障时进行替换。
故障切换脚本
DB_ROLE_CHANGE 系统事件
包括多个备用数据库的 FSFO 配置
备用节点
在故障切换期间,备用节点默认“跟随”主数据库,根据需要从新主数据库进行闪回和重应用重做。(是的,备用节点同样需要闪回数据库)。
在故障切换后,备用节点将不会自动成为新的故障切换目标。只有通过操作将故障切换目标更改为一个备用节点,新的主数据库只有在之前主数据库恢复为备用数据库后才能拥有一个故障切换目标。如果 Broker 配置更改为使备用节点成为新的故障切换目标(适用于故障数据库将停机一段时间的情况),观察器将不会自动恢复之前的主数据库,因为它将不再是 FSFO 配置的一部分。恢复需通过其他方式完成(手动或脚本 Broker 脚本命令)。
转换限制
- 禁用 FSFO
- 将故障切换目标更改为转换到的备用数据库
- 启用 FSFO
- 转换
或者
- 禁用 FSFO
- 转换
- 将故障切换目标更改为所希望的备用数据库
- 启用 FSFO
本文出自:http://blogold.chinaunix.net/u1/37322/showart_2301178.html
最后
以上就是笨笨篮球为你收集整理的Oracle Data Guard 快速启动故障切换指南的全部内容,希望文章能够帮你解决Oracle Data Guard 快速启动故障切换指南所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复