1 达梦实时主备系统即DG
由主库,实时备库,守护进程和监视器组成。
主要功能:
实时数据同步:主备库通过实时归档完成数据同步,实时归档要求主库将RLOG_BUF发送到备库后,再将RLOG_BUF写入本地联机REDO日志文件。但要注意的是,备库确认收到主库发送的REDO日志,并不保证备库已经完成重演这些redo日志,因此主备库之间的数据同步存在一定的时间差。
2 关键特性
2.1 主备库切换
主备库正常运行过程中,可以通过监视器的swithover命令,一键完成主备库角色转换。主备库切换功能可以确保在软、硬件升级,或系统维护时,提供不间断的数据库服务。
2.2 自动故障处理
备库故障,不影响主库正常提供数据库服务,守护进程自动通知主库修改实时归档为INVALID状态,将实时备库失效。
2.3 自动数据同步
备库故障恢复后,守护进程自动通知主库发送归档REDO日志,重新进行主备库数据同步,并在历史数据同步后,修改主库的实时归档状态为valid,恢复实时备库功能。
备库接管后,原主库故障恢复,守护进程自动修改原主库的模式为standby,并重新作为备库加入主备系统。
2.4 备库接管
主库发生故障后,可以通过监视器的takeover命令,将备库切换为主库,继续对外提供服务。如果配置为自动切换模式,确认监视器可以自动检测主库故障,并通知备库接管,这个过程不需要人工干预。
2.5 备库强制接管
如果执行takeover 命令不成功,但主库可能由于硬件损坏等原因无法马上恢复,为了及时恢复数据库服务,DM提供了takeover force命令,强制将备库切换为主库。但需要由用户确认主库故障前,主库与接管备库的数据是一致的。也就是takeover force命令可能引发守护进程组分裂,而takeover命令是在确保不会产生组分裂情况下才允许执行。
3 守护进程
dmwatcher是DM数据守护系统不可或缺的核心部件,是数据库实例和监视器之间信息流转的桥梁。 数据库实例向本地守护进程发送信息, 接收本地守护进程的消息和命令;监视器(dmmonitor)接收守护进程的消息,并向守护进程发送命令;数据库实例与监视器之间没有直接的消息交互;守护进程解析并执行监视器发起的各种命令(Switchover/Takeover/Open force 等) ,并在必要时通知数据库实例执行相应的操作。
3.1 主要功能
守护进程是管理数据守护系统的核心部件,监视器(dmmonitor)负责发起命令,守护进程负责解析、处理命令。守护进程提供了数据库监控、故障检测、故障处理、故障恢复等各种功能。
4 OGUID
数据守护唯一标识码,配置数据守护时,需要由用户指定 OGUID 值。其中数据库的
OGUID 在 MOUNT 状态下由系统函数 SP_SET_OGUID 设置, 守护进程和监视器的 OGUID 值。在配置文件中设定。同一守护进程组中的所有数据库、守护进程和监视器,都必须配置相同的 OGUID 值,取值范围为 0~2147483647。OGUID 的查询方式:
select oguid from v$instance;
配置了相同 OGUID 的两个或多个守护进程,构成一个守护进程组。为方便管理,对每
个守护进程组进行命名,守护进程组中的所有守护进程和监视器,必须配置相同的组名。
5 组分裂
同一守护进程组中, 不同数据库实例的数据出现不一致, 并且无法通过重演 Redo 日志,重新同步数据的情况,我们称为组分裂。引发组分裂的主要原因包括:
- 即时归档中,主库在将 Redo 日志写入本地联机 Redo 日志文件之后,发送 Redo日志到备库之前出现故障, 导致主备库数据不一致, 为了继续提供服务, 执行备库强制接管。此时,当故障主库重启后,就会引发组分裂。
- 故障备库重新完成数据同步之前,主库硬件故障,并且长时间无法恢复;
- 在用户接受丢失部分数据情况下, 为了尽快恢复数据库服务, 执行备库强制接管, 将备库切换为主库。此时,如果故障主库重启,也会造成组分裂。
检测到组分裂后, 守护进程会修改控制文件为分裂状态, 被分裂出去的数据库需要通过备份还原等技术手段重新恢复,或者按照分裂库修复步骤重新将数据恢复到一致状态。
6 脑裂
脑裂是同一个守护进程组中, 同时出现两个或者多个活动主库, 并且这些主库都接收用户请求,提供完整数据库服务。一旦发生脑裂,将无法保证数据一致性,对数据安全造成严重后果。
为预防脑裂做了大量工作,例如故障自动切换模式数据守护,必须配置确认监视器。确认监视器启动故障切换之前,会进行严格的条件检查,避免脑裂发生。守护进程一旦检测到脑裂发生,会马上强制退出主库,等待用户干预,避免数据差异进一步扩大。
造成脑裂的主要原因有两个:网络不稳定或错误的人工干预。为了避免出现脑裂,我们
建议:
- 设置 dm.ini 参数 ALTER_MODE_STATUS=0,限制用户进行直接通过 SQL 修改数据库模式和状态。
- 提供稳定、可靠的网络环境。
- 配置自动切换数据守护时, 将确认监视器部署在独立的第三方机器上,不要与某一个数据库实例部署在一起,避免由于网络问题触发自动故障切换,导致脑裂发生。
- 通过人工干预,将备库切换为主库之前,一定要确认主库已经发生故障,避免主库活动情况下,备库强制接管,人为造成脑裂。




