Oracle DG备库不随OS启动自动拉起是设计使然,需通过systemd等OS级机制在数据库MOUNT后显式启动DMON进程,并确保ORACLE_HOME、ORACLE_SID、Broker配置文件路径正确。
Oracle DG备库没随OS启动自动拉起,DMON进程缺失怎么办
dg备库默认不随操作系统重启自动启动,这是设计使然——oracle不信任外部环境自动恢复的可靠性。常见现象是服务器重启后,dgmgrl连不上,ps -ef | grep dmon查不到进程,select database_role from v$database返回physical standby但实际没在应用日志。
根本原因:Data Guard Broker的DG Broker配置本身不控制OS级服务启停;它只管理数据库内部的DMON后台进程和角色切换逻辑。必须靠OS层机制补上这一环。
- 确保
ORACLE_HOME和ORACLE_SID在启动脚本中显式设置,不能依赖.bash_profile(系统服务不读用户profile) - 数据库必须处于
MOUNT状态才能被Broker接管,所以启动脚本里得先sqlplus / as sysdba执行STARTUP MOUNT,不能只用STARTUP - Broker配置文件
dr1<sid>.dat</sid>和dr2<sid>.dat</sid>必须在$ORACLE_HOME/dbs/下可读,否则DMON启动失败且无明确报错
Linux systemd服务如何安全触发DG备库Mount+Broker激活
用systemd比老式/etc/init.d/oracle更可控,关键是避免竞态:数据库实例启动完成前就去启DG Broker,会因V$DATAGUARD_CONFIG未就绪而静默失败。
推荐写一个带依赖检查的service unit,核心逻辑不是“启动DB”,而是“等DB可连、再启Broker”:
ExecStart=/bin/bash -c 'until sqlplus -s / as sysdba <<EOF WHENEVER SQLERROR EXIT FAILURE SELECT 1 FROM V$INSTANCE WHERE STATUS = \"MOUNTED\" OR STATUS = \"OPEN\"; EXIT EOF do sleep 5; done; dgmgrl / "START OBSERVER"'
-
START OBSERVER不是必须项,但加了它能让Broker更快感知主库状态变化,尤其网络抖动后 - 不要在
ExecStartPre里直接startup mount——systemd不会等SQL*Plus退出才执行下一步,容易断在半途 - 务必设
Restart=on-failure和RestartSec=30,因为DMON可能因归档路径不可写或LOG_ARCHIVE_DEST_2指向失效主库而意外退出
DG Broker配置里哪些参数决定重启后能否自动应用日志
Broker本身不保存“是否自动恢复”的开关,真正起作用的是数据库内部的RECOVER MANAGED STANDBY DATABASE状态是否被持久化。这个状态由Broker下发命令触发,但不会自动重放。
关键配置点全在SHOW CONFIGURATION VERBOSE输出里:
-
Protection Mode设为MAXIMUM PERFORMANCE或MAXIMUM AVAILABILITY——MAXIMUM PROTECTION模式下若主库不可达,备库会强制shutdown abort,无法自动恢复 -
Fast-Start Failover必须DISABLED或已配好Observer,否则重启后FSFO引擎可能卡在WAITING FOR REDO,阻塞日志应用 -
LogXptMode值要是ASYNC或SYNC,不能是ARCH——后者意味着只传归档不传在线日志,Broker无法驱动实时应用
重启后SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY全是NOT APPLYING怎么查
这不是Broker没启动,而是日志应用没被显式开启。Broker配置完不等于自动开始应用,必须有一次手动或脚本触发的RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT。
常见漏点:
- 启动脚本里只做了
STARTUP MOUNT,忘了后续发RECOVER命令——Broker不会帮你补这一步 -
STANDBY_FILE_MANAGEMENT设成了MANUAL,遇到主库新增表空间时MRP0进程直接挂起,状态卡在APPLYING_LOG但实际不动 - 主库的
LOG_ARCHIVE_DEST_2里VALID_FOR没包含(ONLINE_LOGFILES,PRIMARY_ROLE),导致备库收不到新日志流,MRP0持续空转
最易被忽略的是:Broker配置变更(比如改过LogXptMode)后,必须在备库执行ENABLE DATABASE <db_name></db_name>,否则新配置不生效——这个动作不会自动发生在重启后。










