正常运行状态:
守护系统正常运行时,同一个守护进程组中,只有一个主库,其他的都是备库。
主库处于Open状态,主库守护进程也处于Open状态,本地没有守护进程控制文件,其内存值是Valid有效状态。
所有备库也处于Open状态,所有备库守护进程处于Open状态,本地没有守护进程控制文件,其内存值是Valid有效状态。
主库到所有备库的归档也都处于Valid有效状态。
MPP主备系统中,所有主库的dmmpp.ctl都处于一致状态。
数据守护的启动
Normal模式的库默认以Open状态启动,也可以通过增加启动参数Mount将数据库启动到Mount状态。而Primary/Standby模式的库启动后,自动进入Mount状态,因此,数据守护系统启动时,所有数据库实例处于Mount状态。所有守护进程处于Startup状态。如果实例还未启动到Mount状态(比如还处于After redo状态),守护进程不会通知实例Open。,如果通过监视器没有观察到主库或备库Open,可以借助监视器的Check Open命令查找原因,根据命令返回的原因考虑是否进行人工干预,比如需要通过监视器命令强制Open主库或备库。
强制Open数据库
假设需要强制Open数据库A,只需要启动一个监视器,登录后输入Open databaseA即可完成强制启动。
如果数据库A是Standby模式,强制Open的执行流程如下:
- 通知A的守护进程切换为Open Force状态
- 通知A执行Open操作
- 通知守护进程切换Open状态
如果数据库A是Primary模式,强制Open的执行流程如下: - 通知A的守护进程切换为Open Force状态
- 修改A到所有归档目标的实时归档/即时归档状态为无效
- 通知A执行Open操作
- 通知守护进程切换Open状态
强制Open主库前,会设置主库到所有归档目标的实时归档/即时归档为Invalid状态。
强制Open主库命令,会修改主库守护进程INST_RECOVER_TIME内存值为3秒(默认60秒),确保主库Open后,尽快启动故障恢复流程,同步主库数据完成后,重新将归档设置为Valid状态。
如果在故障恢复流程完成之前,主库故障,将无法执行备库接管;备库强制接管会引发守护进程组分
关闭数据守护系统
Stop Group命令内部流程如下:
- 通知守护进程切换为Shutdown状态
- 通知主库退出
- 通知其他备库退出
如果使用手动方式关闭数据守护系统,请严格按照以下顺序执行:
- 如果启动了确认监视器,先关闭确认监视器(防止自动接管)
- 关闭备库守护进程(防止重启实例)
- 关闭主库守护进程(防止重启实例)
- Shutdown主库
- Shutdown备库
如果是只关闭主库,并且不想引发备库自动接管,有以下两种方法:
方法一:
1.通过Detach database命令将所有备库分离
2.通过Stop database命令退出主库
方法二:严格按照以下顺序执行:
- 通过Stop dmwatcher命令关闭所有守护进程监控
- 手动正常退出主库
如果是只关闭备库,并且不想引发主库发送日志失败进入Suspend状态,请严格按照以下顺序执行: - 通过Detachdatabase命令将备库分离出数据守护系统
- 正常退出备库(手动退出或者通过Stop database命令退出)
关闭整个数据守护系统时,先关闭主库再关闭备库,顺序一定不能错。对于本地守护类型的库,在关闭数据守护系统时,不受此顺序限制。
因为主库Shutdown过程中,需要Purge所有已提交事务,会修改数据,并产生Redo日志。如果先Shutdown备库,会导致主库发送归档日志失败,并且由于主库已经处于Shutdown状态,会导致主库异常关闭。
主备库切换
主库维护,滚动升级等场景,可以执行Switchover命令,实现主备库切换。如果存在多个备库,需要先执行Choose Switchover命令,选出守护进程组中可以切换的备库。
假定选出的可切换备库是B,Switchover切换流程如下:
- 通知主备库守护进程,切换为Switchover状态
- 通知主库(A) Mount
- 实时或MPP主备环境下,通知备库(B) APPLY KEEP_RLOG_PKG
- 通知备库(B) Mount
- 通知(A) 切换为Standby模式
- MPP主备环境下,通知(A)修改MPP_INI内存值为0
- 通知(B) 切换为Primary模式
- 通知(B) 修改所有归档目标的归档状态为无效
- MPP主备需要通知各组活动主库更新dmmpp.ctl文件,参考后文说明
- 通知新的备库(A) Open
- 通知新的主库(B) Open
- 通知主备库守护进程切换为Open状态
- 清理所有守护进程上记录的监视器命令执行信息
主库故障、备库接管
当出现硬件故障(掉电、存储损坏等)原因导致主库无法启动,或者是主库内部网卡故障导致主库短期不能恢复正常的情况下,可使用备库接管功能,将备库切换为主库继续对外服务。
故障自动切换模式下,确认监视器会自动选择符合条件的备库进行接管。
故障手动切换模式下,可以先在监视器上执行Choose Takeover命令,选出守护进程组中可以接管的备库。
为了避免备库接管后,造成守护进程组分裂,执行Takeover必须满足下列条件:
- 主库是Primary模式、Open状态时,发生故障
- 主库守护进程故障,故障前是Startup/Open/Recovery状态;或者主库守护进程正常
- 主库故障前到接管备库的归档状态为Valid
- 接管备库是Standby模式、Open状态
- 接管备库的守护进程控制文件状态为Valid(内存值)
- 故障主库和接管备库的Open记录项内容相同
假设主库A故障时,在故障自动切换模式下确认监视器自动选出待接管备库B并通知备库B自动接管,或者在故障手动切换模式下,通过监视器上的Choose Takeover命令,选出待接管备库B,在监视器上输入Takeover命令通知备库B执行接管,这两种方式的接管执行流程是一样的。
以备库B为例,接管的执行流程包括:
- 监视器通知守护进程(B)切换为Takeover状态
- 实时主备或MPP主备环境下,通知备库(B)APPLY KEEP_PKG
- 通知备库(B) Mount
- 通知(B) 切换为Primary模式
- 通知(B) 修改到所有归档目标的归档状态为Invalid
- MPP主备需要通知活动主库更新dmmpp.ctl文件(步骤参考6.5主备库切换)
- 通知新的主库(B) Open
- 通知守护
例如,主库C故障,备库B接管。执行Takeover命令后,会修改守护进程(B)的INST_RECOVER_TIME内存值为3秒(默认60秒),确保尽快启动B->C的故障恢复流程,同步主库数据完成后,重新将B->C的归档设置为Valid状态。在故障恢复流程完成之前,主库(B)故障,备库(C)无法接管;强制备库(C)接管会引发守护进程组分裂。
备库强制接管
有些情况下,备库接管会失败,但主库不能启动或者及时恢复对外服务的情况下,可以使用Takeover Force命令,进行备库强制接管。强制接管具有一定的风险,可能导致备库和故障主库数据不一致,而造成部分数据的丢失,出现数据库分裂的情况,所以应该慎重使用。
例如主库和守护进程故障时,监视器未启动,用户启动监视器后,由于监视器并未收到故障主库任何信息,因此不满足Takeover条件,执行Takeover会报错。如果用户可确认主库故障时主备数据是一致的(如故障时主库未执行操作,主备库归档有效的,并且两者的LSN一致)、或者丢失小部分数据的影响可忽略、或者丢失小部分数据的影响小于主库持续宕机造成的影响,则可以考虑执行takeover force强制接管。
强制接管,先通过Choose Takeover Force选出符合强制接管条件的备库,再执行Takeover Force命令。备库强制接管时,如果接管备库是处于Mount状态/Standby模式的库,则会自动Open备库,其他执行流程与备库接管一致。
主库故障重启(备库接管前重启)
主库故障后立即重启,此时主库的守护进程变成Startup状态,重新进入守护进程的启动流程,将数据一致的备库归档设置为有效状态,其余备库归档设置成无效状态,并重新Open主库。Open成功后继续作为主库,当检测到归档状态无效的备库正常时会启动Recovery处理流程,重新同步主备库数据。
监视器使用
命令 含义
list 查看守护进程的配置信息
show global info 查看所有实例组的信息
tip 查看系统当前运行状态
login 登录监视器
logout 退出登录
choose switchover GDW1 主机正常:查看可切换为主机的实例列表
switchover GDW1.实例名 主机正常:使用指定组的指定实例,切换为主机
choose takeover GDW1 主机故障:查看可切换为主机的实例列表
takeover GDW1.实例名 主机故障:使用指定组的指定实例,切换为主机
choose takeover force GDW1 强制切换:查看可切换为主机的实例列表
takeover force GDW1.实例名 强制切换:使用指定组的指定实例,切换为主机
主机故障后,在备机执行SELECT SF_DW_CHECK_TAKEOVER();【1:可接管 0:不可接管】
详细手册可参考达梦官方网站,或登录社区进行交流学习
https://eco.dameng.com