暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译文]使用 Oracle Database 21c 中的 Data Guard Broker 进行 Data Guard 物理备用设置

原创 小小亮 2021-08-16
1529

Data Guard 是 Oracle 备用数据库解决方案的名称,用于灾难恢复和高可用性。本文提供了一个使用 Data Guard Broker 设置和管理 Data Guard 的示例。

目录

TL;DR

如果您已经了解 Data Guard 并希望使用 VirtualBox 和 Vagrant 快速设置演示环境,您可以按照我的 GitHub 存储库中的说明进行操作。

假设

  • 您有两台装有操作系统和 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_NAMEDB_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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论