作者:John Smiley
2009 年 3 月发布
本文档将指导您使用物理备用服务器配置 Oracle Data Guard 快速启动故障切换 (FSFO)。FSFO 可以显著提高所有环境的可用性和灾难恢复准备,从基于云的价格低廉的系统一直到全球分布的数据中心。
本指南中的信息基于在跨国公司生产环境中部署 FSFO 的实践经验。 本指南对您的现有环境做出几个假设,并且包括创建物理备用服务器和 Data Guard Broker 配置的示例。要开始本指南,您只需 Oracle 数据库企业版 10.2 版或更高版本、一个数据库和三个主机:两个主机用于数据库,一个小型主机用于 FSFO 观察器。本指南不对操作系统进行讨论;然而,一些示例中可能包含了特定于平台的元素(如路径和文件命名惯例)。
FSFO 构建于众多其他 Oracle 技术和特性(如 Data Guard、闪回数据库和 Data Guard Broker)之上。
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 秒钟。
Broker 是一个 Data Guard 管理实用程序,用于维护有关主数据库及其备用数据库的状态信息。它自动设置与 Data Guard 相关的数据库初始化参数(如实例启动和角色转换)、启动备用数据库的应用服务,并且自动执行与维护 Data Guard 配置相关的许多管理任务。FSFO 是 Broker 的一个特性,用于记录故障切换目标的相关信息,例如,故障发生后到触发故障切换之间的等待时间以及 FSFO 的其他特有属性。
闪回数据库是一个集成在 Oracle 数据库中的持续数据保护 (CDP) 解决方案。它使用名为闪回日志的磁盘数据结构,提供一个将数据库快速恢复到之前时间点或 SCN 的方法。数据库闪回比传统的时间点或基于 SCN 的恢复速度更快、结合更完美(一条简单的 DDL 语句)。FSFO 将闪回数据库用作将故障主数据库恢复为备用数据库流程的一部分。
自动恢复的问题通常因为错误的配置,因此我们来了解一些详细信息。
闪回数据库记录经过更改的数据块的前映像。为了避免记录每个数据块的每次更改的开销,闪回数据库每 30 分钟进行一次“模糊”快照,仅记录前映像块上一次快照后的第一次更改。在同一快照期间中,不再记录对同一数据块的后续更改。
数据库的闪回分成两个阶段:
对于 FSFO 环境,设置 db_flashback_retention_target = 60 或更高值,可以为自动备用恢复提供足够的闪回数据库历史记录。模糊快照的元数据存储在闪回日志本身中。如果没有元数据,Oracle 将无法找到模糊快照,从而无法进行闪回。为了避免计时差异产生的问题,我们建议值设置为不少于 60 分钟,实际上,如果值设置为 30 或 30 以下,肯定会导致闪回数据库故障。
闪回数据库将日志存储在快速恢复区 (FRA) 中,所以 FRA 必须有足够大的空间来存储至少 60 分钟的闪回数据库历史记录。总的存储需求与快照期间更改的不同数据块的数量成比例,例如,一小组数据块上的 1,000,000 次块更改生成的闪回数据库历史记录小于一大组数据块上的 1,000,000 次块更改所生成的闪回数据库历史记录。确定闪存数据库存储需求的一个好方法是,启用闪存数据库并观察其在几次峰值负载时所使用的存储量。通过启用闪回数据库来确定其存储需求也有一定的风险 — 如有必要,在主数据库处于打开状态时可以将其禁用。然而,重新启用闪回数据库将需要回弹,因为数据库必须进行安装且未打开。
观察器是非常典型的主/备用 Data Guard 配置中的第三方。它实际上是一个内置于 DGMGRL CLI(Data Guard Broker 命令行界面)中、占用空间很小的 OCI 客户端,与其他所有客户端一样,可以运行在与数据库服务器不同的硬件平台上。其主要工作是在条件允许时执行故障切换,而不影响 DBA 设置的数据持久性约束条件。只有观察器能启动 FSFO 故障切换。它的另一个工作是在启用该特性的情况下(默认)自动将主数据库恢复为备用数据库。观察器是 Data Guard 故障切换在强健的高可用性解决方案中承担重要角色的关键因素,也是造成 Data Guard 故障切换在 FSFO 出现前后重大差异的关键因素。
注:FSFO 观察器版本必须与数据库版本匹配。 Oracle 数据库 11g 观察器与 10g 数据库不兼容,Oracle 数据库 10g 观察器与 11g 数据库也不兼容。
默认情况下,当且仅当满足以下条件时,观察器才会启动到目标备用数据库的故障切换:
Oracle 数据库 11g 第 1 版引入了用户可配置的故障切换条件,这些条件可以触发观察器立即启动故障切换。
运行状况条件
Broker 可配置为在以下任一条件下启动故障切换。以蓝色显示的条件是默认启用的。
Oracle 错误 (ORA-NNNNN)
您可以指定一个将启动 FSFO 故障切换的 ORA 错误列表。该列表默认为空。
应用程序启动
应用程序可直接使用 DBMS_DG.INITIATE_FS_FAILOVER 过程启动 FSFO 故障切换,并包括一个可选的在观察器日志和主数据库警报日志中显示的消息文本。
本指南首先介绍一个将作为 Data Guard 配置主数据库的数据库。对于本次构建,我们将使用一个物理备用数据库。FSFO 还可以与逻辑备用数据库结合使用,支持 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 连接使用不同的监听器是很好的做法。这样,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)
)
)
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)
需要主数据库处于安装(未打开)状态的步骤集中在以下题为需要主数据库回弹的步骤的部分中。
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
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
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
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#)找到最大 group#
---------- -------------
52428800 3
select max(group#) from v$log; MAX(GROUP#)添加 SRL。与 ORL 不同,创建的 SRL 每组中仅有一个成员。无需像 ORL 中那样创建多个 SRL 来保护重做(主数据库中的 ORL 中已对重做进行保护)。多个 SRL 只会增加不必要的 IO 并将增加提交延时。对于具有多个 RAID 控制器的系统,考虑创建 SRL,以便在在控制器之间平衡分布其 IO。
-----------
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
db1:/u01/app/oracle/product/11.1.0/db_1:Y
db_name = db1
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;
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
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
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' 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
DGConnectIdentifier
,Oracle 数据库 10 g中为 InitialConnectIdentifier
)。 ObserverConnectIdentifier 使您可以指定观察器使用不同的连接标识符。例如,您可以用此参数使观察器使用与客户端应用程序相同的连接标识符监视数据库。
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
enable fast_start failover;
Enabled.
启用 FSFO 后,Broker 需要找到一个观察器,而我们还没有启动,所以,如果您在“show configuration”处验证配置,Broker 将报警(如果没有报警,请等待一分钟,就会发现缺少观察器)。
show configuration Configuration在主数据库上运行 StatusReport 应验证导致错误的原因是缺少观察器。
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
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使用“show fast_start failover”命令查看哪个用户可配置的 FSFO 故障切换条件有效。
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
select (sysdate - oldest_flashback_time)*24*60 as history from v$flashback_database_log;如果没有 30 分钟内的可用历史记录,不要启动故障切换。
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
shutdown abort
观察器日志:
Initiating Fast-Start Failover to database "db1_b"... Performing failover NOW, please wait... Failover succeeded, new primary is "db1_b"通过登录到新主数据库上的 dgmgrl 查看 Broker 配置。您会看到之前的主数据库现在已禁用。
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
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" succeededdgmgrl 状态:
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
mkdir -p /u01/app/oracle/admin/wallet创建一个钱夹并将其默认用户名和口令设置为数据库的 SYSDBA 凭证(通常为 SYS)。
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添加钱夹位置并覆盖到 sqlnet.ora。
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u01/app/oracle/admin/wallet) ) ) SQLNET.WALLET_OVERRIDE = TRUE
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 &