Data Guard 是 Oracle 备用数据库解决方案的名称,用于灾难恢复和高可用性。本文提供了一个使用 Data Guard Broker 设置和管理 Data Guard 的示例。
目录
TL;DR
如果您已经了解 Data Guard 并希望使用 VirtualBox 和 Vagrant 快速设置演示环境,您可以按照我的 GitHub 存储库中的说明进行操作。
- Oracle Linux 7 (OL7) 上的 Oracle Database 21c Data Guard
- Oracle Linux 8 (OL8) 上的 Oracle Database 21c Data Guard
假设
- 您有两台装有操作系统和 Oracle 的服务器(物理或虚拟机)。在本例中,我使用了 Oracle Linux 8 和 Oracle Database 21c。
- 主服务器 (ol8-21-dg1.locadomain) 有一个正在运行的实例。
- 备用服务器 (ol8-21-dg2.locadomain) 仅安装软件。
- 没有任何阻止机器之间通过侦听器端口进行的通信。如果您使用默认的 1521 端口,节点 1 应该能够在 1521 上与节点 2 通信,节点 2 应该能够在 1521 上与节点 1 进行通信。检查网络和本地防火墙是否阻止了通信。
主服务器设置
日志记录
检查主数据库是否处于归档日志模式。
select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
SQL>
如果是noarchivelog 模式,则切换到archivelog 模式。
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
通过发出以下命令启用强制日志记录。
alter database force logging;
-- Make sure at least one logfile is present.
alter system switch logfile;
在主数据库上创建备用重做日志(在切换的情况下)。备用重做日志应该至少与最大的在线重做日志一样大,并且与在线重做日志相比,每个线程应该有一个额外的组。就我而言,必须在两台服务器上创建以下备用重做日志。
-- If Oracle Managed Files (OMF) is used.
alter database add standby logfile thread 1 group 10 size 50m;
alter database add standby logfile thread 1 group 11 size 50m;
alter database add standby logfile thread 1 group 12 size 50m;
alter database add standby logfile thread 1 group 13 size 50m;
-- If Oracle Managed Files (OMF) is not used.
alter database add standby logfile thread 1 group 10 ('/u01/oradata/cdb1/standby_redo01.log') size 50m;
alter database add standby logfile thread 1 group 11 ('/u01/oradata/cdb1/standby_redo02.log') size 50m;
alter database add standby logfile thread 1 group 12 ('/u01/oradata/cdb1/standby_redo03.log') size 50m;
alter database add standby logfile thread 1 group 13 ('/u01/oradata/cdb1/standby_redo04.log') size 50m;
如果你想使用闪回数据库,现在就在主数据库上启用它,这样它也会在备用数据库上启用。正如您将在下面看到的,它非常有用。
alter database flashback on;
初始化参数
检查DB_NAME和DB_UNIQUE_NAME参数的设置。在这种情况下,它们都在主数据库上设置为“cdb1”。
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string cdb1
SQL> show parameter db_unique_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string cdb1
SQL>
该DB_NAME备用数据库的将是相同的首要的,但它必须有一个不同的DB_UNIQUE_NAME值。对于此示例,备用数据库将具有值“cdb1_stby”。
确保STANDBY_FILE_MANAGEMENT参数已设置。
alter system set standby_file_management=auto;
服务设置
两台服务器上的“$ORACLE_HOME/network/admin/tnsnames.ora”文件中都需要主数据库和备用数据库的条目。您可以使用网络配置实用程序 (netca) 或手动创建这些。在此设置过程中使用了以下条目。注意在条目中使用SID, 而不是SERVICE_NAME。这很重要,因为代理将需要在数据库关闭时连接到数据库,因此服务将不存在。
cdb1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol8-21-dg1)(PORT = 1521))
)
(CONNECT_DATA =
(SID = cdb1)
)
)
cdb1_stby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol8-21-dg2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = cdb1)
)
)
主服务器上的“$ORACLE_HOME/network/admin/listener.ora”文件包含以下配置。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol8-21-dg1)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = cdb1_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/21.0.0/db_1)
(SID_NAME = cdb1)
(ENVS="TNS_ADMIN=/u01/app/oracle/product/21.0.0/db_1/network/admin")
)
)
ADR_BASE_LISTENER = /u01/app/oracle
备用服务器上的“$ORACLE_HOME/network/admin/listener.ora”文件包含如下配置。由于代理在关闭时需要连接到数据库,我们不能依赖侦听器的自动注册,因此数据库的显式条目。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol8-21-dg2)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = cdb1_stby_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/21.0.0/db_1)
(SID_NAME = cdb1)
(ENVS="TNS_ADMIN=/u01/app/oracle/product/21.0.0/db_1/network/admin")
)
)
ADR_BASE_LISTENER = /u01/app/oracle
一旦 listener.ora 更改就位,请在两台服务器上重新启动侦听器。
lsnrctl stop
lsnrctl start
备用服务器设置
准备复制
为备库创建一个名为“/tmp/initcdb1_stby.ora”的参数文件,内容如下。
*.db_name='cdb1'
在备用服务器上创建必要的目录。
mkdir -p /u01/app/oracle/oradata/cdb1/pdbseed
mkdir -p /u01/app/oracle/oradata/cdb1/pdb1
mkdir -p /u01/app/oracle/fast_recovery_area/cdb1
mkdir -p /u01/app/oracle/admin/cdb1/adump
创建一个密码文件,SYS 密码与主数据库的密码相匹配。
$ orapwd file=/u01/app/oracle/product/21.0.0/db_1/dbs/orapwcdb1 password=Password1 entries=10
使用 DUPLICATE 创建备用
通过使用临时“init.ora”文件启动备用服务器上的辅助实例。
$ export ORACLE_SID=cdb1
$ sqlplus / as sysdba
SQL> STARTUP NOMOUNT PFILE='/tmp/initcdb1_stby.ora';
连接到 RMAN,为 TARGET 和 AUXILIARY 实例指定一个完整的连接字符串。不要尝试使用操作系统身份验证。
$ rman TARGET sys/Password1@cdb1 AUXILIARY sys/Password1@cdb1_stby
现在发出以下 DUPLICATE 命令。
duplicate target database
for standby
from active database
dorecover
spfile
set db_unique_name='cdb1_stby' COMMENT 'Is standby'
nofilenamecheck;
如果您需要转换文件位置或更改任何初始化参数,您可以在DUPLICATE使用SET命令期间执行此操作。
duplicate target database
for standby
from active database
dorecover
spfile
set db_unique_name='cdb1_stby' COMMENT 'Is standby'
set db_file_name_convert='/original/directory/path1/','/new/directory/path1/','/original/directory/path2/','/new/directory/path2/'
set log_file_name_convert='/original/directory/path1/','/new/directory/path1/','/original/directory/path2/','/new/directory/path2/'
set job_queue_processes='0'
nofilenamecheck;
各条款的简要说明如下所示。
FOR STANDBY:这告诉DUPLICATE命令将用于备用数据库,因此它不会强制更改 DBID。FROM ACTIVE DATABASE:DUPLICATE将直接从源数据文件创建,无需额外的备份步骤。DORECOVER:DUPLICATE将包括恢复步骤,使待机状态恢复到当前时间点。SPFILE: 允许我们在从源服务器复制 spfile 时重置其中的值。NOFILENAMECHECK:不检查目标文件位置。
命令完成后,我们就可以开始使用代理了。
启用代理
此时我们有一个主数据库和一个备用数据库,所以现在我们需要开始使用 Data Guard Broker 来管理它们。连接到两个数据库(主数据库和备用数据库)并发出以下命令。
alter system set dg_broker_start=true;
在主服务器上,发出以下命令以向代理注册主服务器。
$ dgmgrl sys/Password1@cdb1
DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 15 11:07:59 2021
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdb1"
Connected as SYSDBA.
DGMGRL> create configuration my_dg_config as primary database is cdb1 connect identifier is cdb1;
Configuration "my_dg_config" created with primary database "cdb1"
DGMGRL>
现在添加备用数据库。
DGMGRL> add database cdb1_stby as connect identifier is cdb1_stby maintained as physical;
Database "cdb1_stby" added
DGMGRL>
现在我们启用新配置。
DGMGRL> enable configuration;
Enabled.
DGMGRL>
以下命令显示如何从代理检查数据库的配置和状态。
DGMGRL> show configuration;
Configuration - my_dg_config
Protection Mode: MaxPerformance
Members:
cdb1 - Primary database
Warning: ORA-16905: The member was not enabled yet.
cdb1_stby - Physical standby database
Warning: ORA-16905: The member was not enabled yet.
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 26 seconds ago)
DGMGRL> show database cdb1;
Database - cdb1
Role: PRIMARY
Intended State: TRANSPORT-ON
Redo Rate: 35.36 KByte/s in 60 seconds (computed 1 second ago)
Instance(s):
cdb1
Database Status:
SUCCESS
DGMGRL> show database cdb1_stby;
Database - cdb1_stby
Role: PHYSICAL STANDBY
Intended State: APPLY-ON
Transport Lag: 0 seconds (computed 9 seconds ago)
Apply Lag: 0 seconds (computed 9 seconds ago)
Average Apply Rate: 8.00 KByte/s
Real Time Query: OFF
Instance(s):
cdb1
Database Status:
SUCCESS
DGMGRL>
停止/启动托管恢复
可以使用 SQL*Plus 中的以下命令在备用数据库上停止和启动托管恢复。
-- Stop managed recovery.
alter database recover managed standby database cancel;
-- Start managed recovery.
alter database recover managed standby database disconnect;
数据库切换
数据库可以处于两种互斥模式(主或备用)中的一种。这些角色可以在运行时更改而不会丢失数据或重置重做日志。此过程称为切换,可以使用以下命令执行。连接到主数据库 (cdb1) 并切换到备用数据库 (cdb1_stby)。
$ dgmgrl sys/Password1@cdb1
DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 15 11:16:30 2021
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdb1"
Connected as SYSDBA.
DGMGRL> switchover to cdb1_stby;
2021-08-15T11:16:59.114+00:00
Performing switchover NOW, please wait...
2021-08-15T11:16:59.936+00:00
Operation requires a connection to database "cdb1_stby"
Connecting ...
Connected to "cdb1_stby"
Connected as SYSDBA.
2021-08-15T11:17:00.201+00:00
Continuing with the switchover...
2021-08-15T11:17:11.815+00:00
New primary database "cdb1_stby" is opening...
2021-08-15T11:17:11.815+00:00
Operation requires start up of instance "cdb1" on database "cdb1"
Starting instance "cdb1"...
Connected to an idle instance.
ORACLE instance started.
Connected to "cdb1"
Database mounted.
Connected to "cdb1"
2021-08-15T11:17:34.492+00:00
Switchover succeeded, new primary is "cdb1_stby"
2021-08-15T11:17:34.515+00:00
Switchover processing complete, broker ready.
DGMGRL>
让我们切换回原来的主要部分。连接到新的主数据库 (cdb1_stby) 并切换到新的备用数据库 (cdb1)。
$ dgmgrl sys/Password1@cdb1_stby
DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 15 11:18:40 2021
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdb1_stby"
Connected as SYSDBA.
DGMGRL> switchover to cdb1;
2021-08-15T11:18:50.935+00:00
Performing switchover NOW, please wait...
2021-08-15T11:18:51.757+00:00
Operation requires a connection to database "cdb1"
Connecting ...
Connected to "cdb1"
Connected as SYSDBA.
2021-08-15T11:18:52.036+00:00
Continuing with the switchover...
2021-08-15T11:19:00.533+00:00
New primary database "cdb1" is opening...
2021-08-15T11:19:00.533+00:00
Operation requires start up of instance "cdb1" on database "cdb1_stby"
Starting instance "cdb1"...
Connected to an idle instance.
ORACLE instance started.
Connected to "cdb1_stby"
Database mounted.
Connected to "cdb1_stby"
2021-08-15T11:19:19.789+00:00
Switchover succeeded, new primary is "cdb1"
2021-08-15T11:19:19.810+00:00
Switchover processing complete, broker ready.
DGMGRL>
数据库故障转移
如果主数据库不可用,可以使用以下语句将备用数据库激活为主数据库。连接到备用数据库 (cdb1_stby) 并进行故障转移。
$ dgmgrl sys/Password1@cdb1_stby
DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 15 11:24:36 2021
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdb1_stby"
Connected as SYSDBA.
DGMGRL> failover to cdb1_stby;
2021-08-15T11:24:46.851+00:00
Performing failover NOW, please wait...
2021-08-15T11:25:08.354+00:00
Failover succeeded, new primary is "cdb1_stby".
2021-08-15T11:25:08.354+00:00
Failover processing complete, broker ready.
DGMGRL>
由于备用数据库现在是主数据库,因此应立即备份。
现在可以将原始主数据库配置为备用数据库。如果在主数据库上启用了闪回数据库,则可以使用以下命令相对轻松地完成此操作。
DGMGRL> reinstate database cdb1;
2021-08-15T11:26:01.868+00:00
Reinstating database "cdb1", please wait...
2021-08-15T11:26:10.779+00:00
Operation requires shut down of instance "cdb1" on database "cdb1"
Shutting down instance "cdb1"...
Connected to "cdb1"
ORACLE instance shut down.
2021-08-15T11:26:12.293+00:00
Operation requires start up of instance "cdb1" on database "cdb1"
Starting instance "cdb1"...
Connected to an idle instance.
ORACLE instance started.
Connected to "cdb1"
Database mounted.
Connected to "cdb1"
2021-08-15T11:26:25.950+00:00
Continuing to reinstate database "cdb1" ...
2021-08-15T11:26:47.061+00:00
Reinstatement of database "cdb1" succeeded
2021-08-15T11:26:47.061+00:00
Reinstate processing complete, broker ready.
DGMGRL>
如果未启用闪回数据库,则必须手动重新创建 cdb1 作为备用数据库。基本过程与您之前所做的相反。
# 1) Cleanup the old instance.
sqlplus / as sysdba <<EOF
shutdown immediate;
exit;
EOF
rm -Rf /u01/app/oracle/oradata/cdb1/*
rm -Rf /u01/app/oracle/fast_recovery_area/cdb1
rm -Rf /u01/app/oracle/fast_recovery_area/cdb1_stby
rm -Rf /u01/app/oracle/admin/cdb1
mkdir -p /u01/app/oracle/fast_recovery_area/cdb1
mkdir -p /u01/app/oracle/admin/cdb1/adump
mkdir -p /u01/app/oracle/oradata/cdb1/pdbseed
mkdir -p /u01/app/oracle/oradata/cdb1/pdb1
rm $ORACLE_HOME/dbs/spfilecdb1.ora
export ORACLE_SID=cdb1
sqlplus / as sysdba <<EOF
startup nomount pfile='/tmp/initcdb1_stby.ora';
exit;
EOF
# 2) Connect to RMAN.
$ rman target sys/Password1@cdb1_stby auxiliary sys/Password1@cdb1
# 3) Duplicate the database.
duplicate target database
for standby
from active database
dorecover
spfile
set db_unique_name='cdb1' COMMENT 'Is standby'
nofilenamecheck;
# 4) Connect to DGMDRL on the current primary.
$ dgmgrl sys/Password1@cdb1_stby
# 5) Enable the new standby.
DGMGRL> enable database cdb1;
闪回数据库
上一节已经提到过,但值得再次关注闪回数据库。尽管切换/切回对主数据库和备用数据库都是安全的,但故障转移会使原始主数据库无法转换为备用数据库。如果未启用闪回数据库,则必须废弃原始主数据库并将其重新创建为备用数据库。
另一种方法是在主数据库(以及备用数据库,如果需要)上启用闪回数据库,以便在发生故障转移时,主数据库可以闪回到故障转移之前的时间并快速转换为备用数据库,如上所示。
只读备用和活动数据卫士
一旦配置了备用数据库,就可以以只读模式打开它以允许查询访问。这通常用于将报告卸载到备用服务器,从而释放主服务器上的资源。当以只读模式打开时,归档日志传送继续,但托管恢复停止,因此备用数据库变得越来越过时,直到恢复托管恢复。
要将备用数据库切换为只读模式,请执行以下操作。
shutdown immediate;
startup mount;
alter database open read only;
要恢复托管恢复,请执行以下操作。
shutdown immediate;
startup mount;
alter database recover managed standby database disconnect from session;
在 11g 中,Oracle 引入了 Active Data Guard 特性。这允许备用数据库以只读模式打开,但仍应用重做信息。这意味着备用数据库可用于查询,但仍是最新的。此功能存在许可问题,但以下命令显示了如何启用主动数据保护。
shutdown immediate;
startup mount;
alter database open read only;
alter database recover managed standby database disconnect from session;
由于托管恢复继续使用活动数据保护,因此在这种情况下无需从只读模式切换回托管恢复。
快照备用
在 11g 中引入的快照备用允许以读写模式打开备用数据库。当切换回待机模式时,在读写模式下所做的所有更改都将丢失。这是使用闪回数据库实现的,但备用数据库不需要显式启用闪回数据库来利用此功能,认为它的工作原理相同。
连接到主 (cdb1) 数据库并将备用数据库 (cdb1_stby) 转换为快照备用数据库。
$ dgmgrl sys/Password1@cdb1
DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 15 11:29:39 2021
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdb1"
Connected as SYSDBA.
DGMGRL> convert database cdb1_stby to snapshot standby;
2021-08-15T11:29:56.599+00:00
Converting database "cdb1_stby" to a Snapshot Standby database, please wait...
2021-08-15T11:30:02.308+00:00
Database "cdb1_stby" converted successfully
2021-08-15T11:30:02.308+00:00
DGMGRL>
完成快照备用数据库后,将其转换回备用数据库。
$ dgmgrl sys/Password1@cdb1
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Feb 26 22:53:36 2018
Version 19.2.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> convert database cdb1_stby to physical standby;
DGMGRL for Linux: Release 21.0.0.0.0 - Production on Sun Aug 15 11:31:00 2021
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected to "cdb1"
Connected as SYSDBA.
DGMGRL> convert database cdb1_stby to physical standby;
2021-08-15T11:31:10.844+00:00
Converting database "cdb1_stby" to a Physical Standby database, please wait...
2021-08-15T11:31:10.912+00:00
Operation requires shut down of instance "cdb1" on database "cdb1_stby"
Shutting down instance "cdb1"...
Connected to "cdb1_stby"
Database closed.
Database dismounted.
ORACLE instance shut down.
2021-08-15T11:31:18.433+00:00
Operation requires start up of instance "cdb1" on database "cdb1_stby"
Starting instance "cdb1"...
Connected to an idle instance.
ORACLE instance started.
Connected to "cdb1_stby"
Database mounted.
Connected to "cdb1_stby"
2021-08-15T11:31:27.139+00:00
Continuing to convert database "cdb1_stby" ...
2021-08-15T11:31:45.774+00:00
Database "cdb1_stby" converted successfully
2021-08-15T11:31:45.774+00:00
DGMGRL>
备用数据库再次处于托管恢复状态,并且恢复归档日志传送。请注意,闪回数据库仍未启用。
DGMGRL> show configuration;
Configuration - my_dg_config
Protection Mode: MaxPerformance
Members:
cdb1 - Primary database
cdb1_stby - Physical standby database
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 34 seconds ago)
DGMGRL>
有关更多信息,请参阅:
希望这可以帮助你。
文章来源:https://oracle-base.com/articles/21c/data-guard-setup-using-broker-21c




