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

DG Broker 管理 Oracle 19c DG

从 SQL 命令行到 DGMGRL:配置 · 手动/自动切换 · FSFO 与观察者 · 运维命令全流程实操

环境信息

项目

配置

数据库版本

Oracle 19.3

实例类型

Single Instance CDB

主库 / 备库

主库 192.168.1.81 ( standbydb )
备库 192.168.1.80 ( primarydb )

保护模式

MaxPerformance

主备模式

一主一备 2 node (主库和备库已创建完成)

现有模式

由 SQL 命令行方式切换 DG 改为由 DGMGRL 命令行工具来管理 DG

DG Broker 是管理 Oracle 19c DG 的工具,主要用于创建、配置、监控、捕获诊断信息、生成报告。它主要使用 DGMGRL 命令行工具或 EMCC 来配置和管理 DG,本文重点讲述 DGMGRL 命令行工具配置和维护 DG 的方法。

导读

一、DGMGRL 命令行配置 DG Broker

二、角色切换(手动)

三、角色切换(自动)

四、observer-only 模式(切换演练)

五、运维常用命令

六、实战注意点

一、DGMGRL 命令行配置 DG Broker

1.1 修改数据库参数

主库和备库

# 主库和备库
-- 启用 Dg Broker
SQL> ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=BOTH;
SQL> show parameter dg_broker_start

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_start boolean TRUE

-- 清空本地归档参数和远程传输参数
ALTER SYSTEM RESET log_archive_dest_2 scope=both;
ALTER SYSTEM RESET log_archive_dest_1 scope=both;

说明 ›如果是 RAC,两个配置文件都要设置到同一磁盘组路径下,必须在(DG_BROKER_START=FALSE)改动。

ALTER SYSTEM SET DG_BROKER_CONFIG_FILE1='+DG/DIRECTORY/DR1.DAT' SCOPE=BOTH;
ALTER SYSTEM SET DG_BROKER_CONFIG_FILE2='+DG/DIRECTORY/DR2.DAT' SCOPE=BOTH;

说明 › 以上操作完成后,重启主库和备库。

1.2 配置静态监听和 Tnsname.ora

主库

[oracle@standby ~]$ cd /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/
[oracle@standby admin]$ cat listener.ora
# 添加
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = standbydb)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = standbydb)
)
(SID_DESC =
(GLOBAL_DBNAME = standbydb_DGMGRL) --添加
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = standbydb)
)
)

[oracle@standby admin]$ cat tnsnames.ora
# 添加
primarydb_DGMGRL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.80)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = primarydb_DGMGRL)
)
)

standbydb_DGMGRL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.81)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = standbydb_DGMGRL)
)
)

备库

[oracle@primary admin]$ cat listener.ora
# 添加
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = primarydb)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = primarydb)
)
(SID_DESC =
(GLOBAL_DBNAME = primarydb_DGMGRL) --添加
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = primarydb)
)
)

[oracle@primary admin]$ cat tnsnames.ora
# 添加
primarydb_DGMGRL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.80)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = primarydb_DGMGRL)
)
)

standbydb_DGMGRL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.81)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = standbydb_DGMGRL)
)
)

重启监听(主库、备库)

[oracle@primary admin]$ lsnrctl reload && lsnrctl stop && lsnrctl start

1.3 配置 DG Broker

[root@standby ~]# su - oracle
[oracle@standby ~]$ dgmgrl

DGMGRL> connect sys/oracle@192.168.1.81/standbydb as sysdba
Connected to "STANDBYDB"
Connected as SYSDBA.

# 创建配置
GMGRL> CREATE CONFIGURATION 'dg_config' AS
PRIMARY DATABASE IS 'standbydb'
CONNECT IDENTIFIER IS 'standbydb_DGMGRL';
Configuration "dg_config" created with primary database "standbydb"

# 添加备库
DGMGRL> ADD DATABASE 'primarydb' AS
CONNECT IDENTIFIER IS 'primarydb_DGMGRL'
MAINTAINED AS PHYSICAL;
Database "primarydb" added

# 启用
DGMGRL> enable configuration
Enabled.
DGMGRL> enable database standbydb
Enabled.
DGMGRL> enable database primarydb
Enabled.

# 查看
DGMGRL> show configuration

Configuration - dg_config

Protection Mode: MaxPerformance
Members:
standbydb - Primary database
primarydb - Physical standby database

Fast-Start Failover: Disabled

Configuration Status:
SUCCESS (status updated 54 seconds ago)

进入 dgmgrl 并以 sysdba 连接主库 standbydb

创建配置 dg_config、添加备库 primarydb 并启用

show configuration:Configuration Status 为 SUCCESS

二、角色切换(手动)

2.1 Switchover:主库切换备库

DGMGRL> switchover to primarydb

switchover 执行过程,最终 Switchover succeeded, new primary is "primarydb"

DGMGRL> show database primarydb

切换后 primarydb 的 Role 已变为 PRIMARY / TRANSPORT-ON

2.2 Failover

模拟主库故障,备库升为主库,旧主库恢复后变成新备库后执行 REINSTATE 操作。

停止主库

SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PRIMARY

SQL> shutdown abort
ORACLE instance shut down.

备库升主库

SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PHYSICAL STANDBY

DGMGRL> failover to standbydb ;
Performing failover NOW, please wait...
Failover succeeded, new primary is "standbydb"

SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PRIMARY

旧主库执行 reinstate 操作

重要 ›执行 reinstate 前,主库和备库必须开启闪回,否则 reinstate 无法成功恢复。

SQL> startup
ORACLE instance started.

Total System Global Area 1996488360 bytes
Fixed Size 9137832 bytes
Variable Size 587202560 bytes
Database Buffers 1325400064 bytes
Redo Buffers 74747904 bytes
Database mounted.
ORA-16649: possible failover to another database prevents this database from
being opened

旧主库 startup 时抛出 ORA-16649,需要执行 reinstate 才能重新纳入配置

DGMGRL> reinstate database primarydb
Reinstating database "primarydb", please wait...
Reinstatement of database "primarydb" succeeded

reinstate 成功,旧主库重新回到配置中

SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PHYSICAL STANDBY

三、角色切换(自动)

主备自动切换需要开启 fast-start failover(快速故障转移)和启用观察者模式。

触发条件

  • 主库同时失去与 observer 和目标备库的连接;
  • 实例故障(单实例主库故障,或 RAC 主库所有实例都故障);
  • shutdown abort(正常 shutdown:NORMAL / IMMEDIATE / TRANSACTIONAL 不会触发 FSFO);
  • 需要配置 wallet 认证。

3.1 配置 wallet(备机)

[root@standby ~]# su - oracle
[oracle@standby ~]$ mkdir -p /u01/app/oracle/admin/dgb_wallet
[oracle@standby ~]$ chown -R oracle:install /u01/app/oracle/admin/dgb_wallet
[oracle@standby ~]$ orapki wallet create -wallet /u01/app/oracle/admin/dgb_wallet -pwd oracle123.COM -auto_login --oracle123.COM 代表设置密码

编辑 Observer 主机上的 $ORACLE_HOME/network/admin/sqlnet.ora 文件并添加以下内容:

[oracle@standby admin]$ cat sqlnet.ora
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/admin/dgb_wallet)
)
)
SQLNET.WALLET_OVERRIDE = TRUE

说明 ›创建登录凭证,按照提示输入密码,standbydb_DGMGRL 和 primarydb_DGMGRL 必须要与 DGconnectidentifier 中标识符一致。

-- 通过以下命令查看连接标识符
DGMGRL> show database primarydb DGconnectidentifier
DGConnectIdentifier = 'primarydb_DGMGRL'
DGMGRL> show database standbydb DGconnectidentifier
DGConnectIdentifier = 'standbydb_DGMGRL'

[oracle@standby ~]$ mkstore -wrl /u01/app/oracle/admin/dgb_wallet -createCredential standbydb_DGMGRL sysdg
[oracle@standby ~]$ mkstore -wrl /u01/app/oracle/admin/dgb_wallet -createCredential primarydb_DGMGRL sysdg

3.2 启用 FSFO 和观察者模式

DGMGRL> enable fast_start failover -- 启用 FSFO
Enabled in Potential Data Loss Mode.

DGMGRL> START OBSERVER standby IN BACKGROUND FILE IS /u01/app/oracle/fsfo.dat LOGFILE IS /u01/app/oracle/observer.log CONNECT IDENTIFIER IS standbydb_DGMGRL TRACE_LEVEL IS USER; -- 启用观察者(in background 代表后台方式运行)

Connected to "STANDBYDB"
Submitted command "START OBSERVER" using connect identifier "standbydb_dgmgrl"

3.3 查看观察者

说明 ›观察者可以运行在备机,也可以运行在主机,两者会自动选主(Master)。

DGMGRL> show observer

Configuration - dg_config

Primary: standbydb
Active Target: primarydb

Observer "standby" - Master

Host Name: standby
Last Ping to Primary: 1 second ago
Last Ping to Target: 2 seconds ago

3.4 模拟主库故障,观察 FSFO 与观察者自动切换和 reinstate

SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PRIMARY

SQL> shutdown abort
ORACLE instance shut down.

SQL> select database_role from v$database;
select database_role from v$database
*
ERROR at line 1:
ORA-01034: ORACLE not available
Process ID: 0
Session ID: 0 Serial number: 0

SQL> startup
ORACLE instance started.

Total System Global Area 1996488360 bytes
Fixed Size 9137832 bytes
Variable Size 620756992 bytes
Database Buffers 1291845632 bytes
Redo Buffers 74747904 bytes
Database mounted.
ORA-16649: possible failover to another database prevents this database from
being opened

说明 ›观察 DG Broker 日志,有自动切换和 reinstate 操作。旧主库变成新备库后,必须手动拉起,reinstate 才会生效。

tail -f -n 1000 /u01/app/oracle/observer.log

observer.log:观察者检测到主库失联,Fast-Start Failover threshold 触发

observer.log:Initiating Fast-start Failover,standbydb 被提升为新主库

observer.log:自动对旧主库执行 REINSTATE,重新成为 FSFO 目标

四、observer-only 模式(切换演练)

observe-only 代表仅以观察者模式启动,通常在业务上线前使用这种方式进行演练。observe-only 无论主库发生什么操作(满足切换条件),都不会干预自动切换,但会将整个切换过程描述在 DG 日志里面。

DGMGRL> stop observer
Observer stopped.
DGMGRL> disable FAST_START FAILOVER;
Disabled.
DGMGRL> SHOW FAST_START FAILOVER

Fast-Start Failover: Enabled in Observe-Only Mode

SHOW FAST_START FAILOVER:Enabled in Observe-Only Mode 及其参数明细

DGMGRL> START OBSERVER standby IN BACKGROUND FILE IS /u01/app/oracle/fsfo.dat LOGFILE IS /u01/app/oracle/observer.log CONNECT IDENTIFIER IS standbydb_DGMGRL TRACE_LEVEL IS USER;

Connected to "standbydb"
Submitted command "START OBSERVER" using connect identifier "standbydb_dgmgrl"

以 observe-only 方式启动观察者

主库关闭并查看 DG Broker 日志

SQL> shutdown abort
ORACLE instance shut down.

observe-only 模式下主库关闭:日志提示 Fast-Start Failover is not possible because observe-only mode

五、运维常用命令

5.1 修改 Redo 传输模式和保护模式

  • 保护模式升级时,要先修改 Redo 传输模式,然后再改保护模式;
  • 保护模式降级时,要先修改保护模式,然后再修改 Redo 传输模式;
  • 升级或降级前,FSFO 必须先禁用;
  • 不能从 MaxPerformance 直接升到 MaxProtection,必须 MaxPerformance → MaxAvailability → MaxProtection。

修改 Redo 传输模式

DGMGRL> show database primarydb LogXptMode
LogXptMode = 'ASYNC'
DGMGRL> show database standbydb LogXptMode
LogXptMode = 'ASYNC'

DGMGRL> disable fast_start failover -- 禁用 FSFO

DGMGRL> edit database "primarydb" set PROPERTY 'LogXptMode'='SYNC';
Property "LogXptMode" updated

DGMGRL> edit database "standbydb" set property 'LogXptMode'='SYNC';
Property "LogXptMode" updated

也可以用 RedoRoutes 一条命令同时设置源端和目标端:

DGMGRL> edit database "primarydb" SET PROPERTY RedoRoutes = '(LOCAL : standbydb SYNC)';
Property "redoroutes" updated

修改保护模式

DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;
DGMGRL> enable fast_start failover; -- 启用 FSFO
Enabled in Zero Data Loss Mode.

5.2 重置变量默认值

DGMGRL> EDIT CONFIGURATION RESET PROPERTY TraceLevel;
Property "tracelevel" updated
DGMGRL> show configuration verbose "TraceLevel"
TraceLevel = 'USER'

5.3 停开 redo 应用和 redo 传输

DGMGRL> edit database primarydb set state=TRANSPORT-OFF;
DGMGRL> edit database primarydb set state=TRANSPORT-OFF;
DGMGRL> edit database standbydb SET STATE='APPLY-OFF';
DGMGRL> edit database standbydb SET STATE='APPLY-ON';

5.4 启用、禁用

DGMGRL> DISABLE DATABASE standbydb_Sales'; -- 禁用备库
DGMGRL> DISABLE FAR_SYNC 'FS'; -- 禁用远程同步服务
DGMGRL> DISABLE CONFIGURATION; -- 禁用 DG Broker 配置
DGMGRL> ENABLE CONFIGURATION; -- 启用 DG Broker 配置
DGMGRL> enable database primarydb -- 启用主库
DGMGRL> enable database standbydb -- 启用主库

5.5 移除成员

GMGRL> REMOVE DATABASE 'standbydb';
DGMGRL> REMOVE FAR_SYNC 'FS'; -- 移除远程同步服务
DGMGRL> REMOVE CONFIGURATION; -- FSFO 启用时不允许

5.6 物理备库转快照备库

-- 快照备库(需要 FRA,内部会建 guaranteed restore point(还原点))
DGMGRL> CONVERT DATABASE 'standbydb' to SNAPSHOT STANDBY;
DGMGRL> CONVERT DATABASE 'standbydb' to PHYSICAL STANDBY;

5.7 配置元数据导出 / 导入(降级、重建时很有用)

-- 文件落在 trace 目录,不能指定目录
DGMGRL> EXPORT CONFIGURATION TO 'myconfig.txt';
DGMGRL> IMPORT CONFIGURATION from 'myconfig.txt';

5.8 角色转换

DGMGRL> SWITCHOVER TO 'standbydb';
DGMGRL> SWITCHOVER TO 'standbydb' WAIT 300; -- 等会话排空,仅 RAC+AC 服务有效
DGMGRL> FAILOVER TO 'primarydb';
-- 只在 ORA-752 / ORA-600[3020] / complete 失败时用
DGMGRL> FAILOVER TO 'primarydb' IMMEDIATE;
DGMGRL> REINSTATE DATABASE 'primarydb';

5.9 查看、停止观察者

DGMGRL> SHOW FAST_START FAILOVER; -- 摘要 + 注册的观察者列表(* 标记 master)
DGMGRL> SHOW OBSERVER; -- 本配置所有观察者的明细
-- 手动切换 master(切换期间必须保证没有角色转换,且目标备库不需要 reinstate)
DGMGRL> SET MASTEROBSERVER TO boston-observer;
DGMGRL> STOP OBSERVER; -- 停止观察者,只有一个观察者时可省略名字
DGMGRL> STOP OBSERVER observer_name; -- 多个观察者时必须带名字
DGMGRL> STOP OBSERVER ALL; -- 停所有观察者

六、实战注意点

6.1 主备库打补丁先后顺序

  1. 先停止观察者:STOP OBSERVER ;
  2. 禁用 FSFO:DISABLE FAST_START FAILOVER(主备必须连通);
  3. 开始打补丁(先给备库打,然后角色切换,切换主库后再给主库打补丁);
  4. 启用 FSFO:ENABLE FAST_START FAILOVER ;
  5. 启用观察者:START OBSERVER <in-background> ;

6.2 观察者与主库连接的微调

默认行为:观察者失去与主库连接超过 threshold(默认 30S)就想切换,但如果备库在该 threshold 内还收到过主库消息,备库会拒绝切换(防止脑裂)。

ObserverOverride=TRUE 参数,代表当观察者连不上主库超时就直接切,不管备库是否还跟主库有联系。生产环境慎用 TRUE,因为它可能把 Observer 到主库的网络故障误判为主库故障,导致不必要的切换。

ObserverReconnect=30 让观察者每 30 秒重建一次到主库的连接,用于主动探测网络健康;默认 0(只在连接失败后才重连)意味着观察者可能长时间不知道“新建连接已经不可能了”。

以上就是 DGMGRL 管理 Oracle 19c Data Guard 的完整实操流程。从 Broker 配置、手动/自动切换,到 FSFO 观察者与日常运维命令,希望能帮你把 DG 从“命令行拼参数”变成“一套可托管的配置”。

#Oracle #DataGuard #DGMGRL #FSFO #数据库运维

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

评论