从 SQL 命令行到 DGMGRL:配置 · 手动/自动切换 · FSFO 与观察者 · 运维命令全流程实操
环境信息
项目 | 配置 |
数据库版本 | Oracle 19.3 |
实例类型 | Single Instance CDB |
主库 / 备库 | 主库 192.168.1.81 ( standbydb ) |
保护模式 | 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 主备库打补丁先后顺序
- 先停止观察者:STOP OBSERVER ;
- 禁用 FSFO:DISABLE FAST_START FAILOVER(主备必须连通);
- 开始打补丁(先给备库打,然后角色切换,切换主库后再给主库打补丁);
- 启用 FSFO:ENABLE FAST_START FAILOVER ;
- 启用观察者: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 #数据库运维




