本文讲解在Oracle Database 19c中使用Data Guard Broker进行Data Guard物理备用库配置。
检查主数据库是否处于归档日志模式。
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;
-- 确保至少存在一个日志文件。
ALTER SYSTEM SWITCH LOGFILE;
在主数据库上创建备用重做日志(在切换的情况下)。备用重做日志应该至少和最大的联机重做日志一样大,并且与联机重做日志相比,每个线程应该有一个额外的组。在我的例子中,必须在两台服务器上创建以下备用重做日志。
-- 如果使用Oracle Managed Files(OMF)。
ALTER DATABASE ADD STANDBY LOGFILE SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE SIZE 50M;
-- 如果未使用Oracle Managed Files(OMF)。
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/cdb1/standby_redo01.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/cdb1/standby_redo02.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/cdb1/standby_redo03.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE ('/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_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 = ol7-19-dg1)(PORT = 1521))
)
(CONNECT_DATA =
(SID = cdb1)
)
)
cdb1_stby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol7-19-dg2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = cdb1)
)
)
主服务器上的 “$ORACLE_HOME/network/admin/listener.ora” 文件包含以下配置。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol7-19-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/19.0.0/db_1)
(SID_NAME = cdb1)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
备用服务器上的 “$ORACLE_HOME/network/admin/listener.ora” 文件包含以下配置。由于代理在关闭时需要连接到数据库,因此我们不能依赖于监听器的自动注册,因此数据库的显式条目。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol7-19-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/19.0.0/db_1)
(SID_NAME = cdb1)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
完成 listener.ora 修改后,请使用以下命令在两台服务器上重新启动监听器。
lsnrctl stop
lsnrctl start
为备用数据库创建名为 “/tmp/initcdb1” 的参数文件,内容如下:
*.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/19.0.0/db_1/dbs/orapwcdb1 password=Password1 entries=10
使用临时 “init.ora” 文件启动备用服务器上的辅助实例。
$ export ORACLE_SID=cdb1
$ sqlplus / as sysdba
SQL> STARTUP NOMOUNT PFILE='/tmp/initcdb1_stby.ora';
连接到 RMAN,为 TARGET 和 AUXILIARY 实例指定完整的连接字符串。请勿尝试使用 OS 身份验证。
$ 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:不检查目标文件位置。
以上命令完成后,我们就可以开始使用 Broker 了。
此时我们有一个主数据库和一个备用数据库,所以现在我们需要开始使用 Data Guard Broker 来管理它们。连接到两个数据库(主数据库和备用数据库)并发出以下命令:
ALTER SYSTEM SET dg_broker_start=true;
在主服务器上,发出以下命令以向代理注册主服务器:
$ dgmgrl sys/Password1@cdb1
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Feb 26 22:39:33 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> 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>
以下命令显示如何从 broker 检查数据库的配置和状态:
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 26 seconds ago)
DGMGRL> SHOW DATABASE cdb1;
Database - cdb1
Role: PRIMARY
Intended State: TRANSPORT-ON
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 1 second ago)
Apply Lag: 0 seconds (computed 1 second ago)
Average Apply Rate: 5.00 KByte/s
Real Time Query: OFF
Instance(s):
cdb1
Database Status:
SUCCESS
DGMGRL>
数据库可以是两种互斥模式之一(主用或备用)。可以在运行时更改这些角色,而不会丢失数据或重置日志。此过程称为“切换”,可以使用以下命令执行。连接到主数据库(cdb1)并切换到备用数据库(cdb1_stby)。
$ dgmgrl sys/Password1@cdb1
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Feb 26 22:39:33 2018Version 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> SWITCHOVER TO cdb1_stby;
Performing switchover NOW, please wait...
Operation requires a connection to instance "cdb1" on database "cdb1_stby"
Connecting to instance "cdb1"...
Connected as SYSDBA.
New primary database "cdb1_stby" is opening...
Operation requires start up of instance "cdb1" on database "cdb1"Starting instance "cdb1"...ORACLE instance started.Database mounted.Switchover succeeded, new primary is "cdb1_stby"
DGMGRL>
让我们切换回原来的主数据库。连接到新主服务器(cdb1_stby)并切换到新的备用数据库(cdb1)。
$ dgmgrl sys/Password1@cdb1_stby
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Feb 26 22:53:36 2018Version 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> SWITCHOVER TO cdb1;
Performing switchover NOW, please wait...
Operation requires a connection to instance "cdb1" on database "cdb1"
Connecting to instance "cdb1"...
Connected as SYSDBA.
New primary database "cdb1" is opening...
Operation requires start up of instance "cdb1" on database "cdb1_stby"Starting instance "cdb1"...ORACLE instance started.Database mounted.Switchover succeeded, new primary is "cdb1"
DGMGRL>
如果主数据库不可用,则可以使用以下语句将备用数据库激活为主数据库。连接到备用数据库(cdb1_stby)并进行故障转移。
$ dgmgrl sys/Password1@cdb1_stby
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Feb 26 22:53:36 2018Version 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> FAILOVER TO cdb1_stby;
Performing failover NOW, please wait...
Failover succeeded, new primary is "cdb1_stby"
DGMGRL>
由于备用数据库现在是主数据库,因此应立即进行数据库备份。
现在可以将原始主数据库配置为备用数据库。如果在主数据库上启用了闪回数据库,则可以使用以下命令相对轻松地完成此操作。
DGMGRL> REINSTATE DATABASE cdb1;
Reinstating database "cdb1", please wait...
Operation requires shut down of instance "cdb1" on database "cdb1"
Shutting down instance "cdb1"...
ORACLE instance shut down.
Operation requires start up of instance "cdb1" on database "cdb1"Starting instance "cdb1"...ORACLE instance started.Database mounted.
Continuing to reinstate database "cdb1" ...
Reinstatement of database "cdb1" succeeded
DGMGRL>
如果未启用闪回数据库,则必须手动将 cdb1 重新创建为备用数据库。基本过程与您之前所做的相反。如下命令:
# 1) 清理旧实例。
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/cdb1mkdir -p /u01/app/oracle/fast_recovery_area/cdb1mkdir -p /u01/app/oracle/admin/cdb1/adumpmkdir -p /u01/app/oracle/oradata/cdb1/pdbseedmkdir -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) 连接到 RMAN.
$ rman TARGET sys/Password1@cdb1_stby AUXILIARY sys/Password1@cdb1
# 3) 复制数据库。
DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER
SPFILE
SET db_unique_name='cdb1' COMMENT 'Is standby'
NOFILENAMECHECK;
# 4) 连接到当前主节点上的 DGMDRL。
$ dgmgrl sys/Password1@cdb1_stby
# 5) 启用新备用数据库。
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 引入了活动数据保护功能。这允许备用数据库以只读模式打开,但仍应用重做信息。这意味着一个备用系统可以用于查询,但仍然是最新的。此功能存在许可问题,但以下命令显示如何启用活动数据保护。
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
由于托管恢复继续使用 Active Data Guard,因此在这种情况下无需从只读模式切换回托管恢复。
在 11g 中引入,快照备用允许备用数据库以读写模式打开。当切换回备用模式时,在读写模式下所做的所有更改都将丢失。这是使用闪回数据库实现的,可以正常工作,备用数据库不需要显式启用闪回数据库来利用此功能。
连接到主(cdb1)数据库并将备用数据库(cdb1_stby)转换为快照备用数据库。
$ dgmgrl sys/Password1@cdb1
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Feb 26 22:53:36 2018Version 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 SNAPSHOT STANDBY;
Converting database "cdb1_stby" to a Snapshot Standby database, please wait...
Database "cdb1_stby" converted successfully
DGMGRL>
完成快照备用后,将其转换回备用数据库。
$ dgmgrl sys/Password1@cdb1
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Feb 26 22:53:36 2018Version 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;
Converting database "cdb1_stby" to a Physical Standby database, please wait...
Operation requires shut down of instance "cdb1" on database "cdb1_stby"
Shutting down instance "cdb1"...
Database closed.
Database dismounted.
ORACLE instance shut down.
Operation requires start up of instance "cdb1" on database "cdb1_stby"Starting instance "cdb1"...ORACLE instance started.Database mounted.
Continuing to convert database "cdb1_stby" ...Database "cdb1_stby" converted successfully
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 38 seconds ago)
DGMGRL>