如何配置DG备库的自动启动机制_Broker与OS服务结合的重启策略

3次阅读

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_HOMEORACLE_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-failureRestartSec=30,因为DMON可能因归档路径不可写或LOG_ARCHIVE_DEST_2指向失效主库而意外退出

DG Broker配置里哪些参数决定重启后能否自动应用日志

Broker本身不保存“是否自动恢复”的开关,真正起作用的是数据库内部的RECOVER MANAGED STANDBY DATABASE状态是否被持久化。这个状态由Broker下发命令触发,但不会自动重放。

关键配置点全在SHOW CONFIGURATION VERBOSE输出里:

  • Protection Mode设为MAXIMUM PERforMANCEMAXIMUM AVAILABILITY——MAXIMUM PROTECTION模式下若主库不可达,备库会强制shutdown abort,无法自动恢复
  • Fast-Start Failover必须DISABLED或已配好Observer,否则重启后FSFO引擎可能卡在WAITING FOR REDO,阻塞日志应用
  • LogXptMode值要是ASYNCSYNC,不能是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_2VALID_FOR没包含(ONLINE_LOGFILES,PRIMARY_ROLE),导致备库收不到新日志流,MRP0持续空转

最易被忽略的是:Broker配置变更(比如改过LogXptMode)后,必须在备库执行ENABLE DATABASE <db_name></db_name>,否则新配置不生效——这个动作不会自动发生在重启后。

text=ZqhQzanResources