在本文中,将模拟采取错误的人工干预进行脑裂故障,再进行恢复(方式二),并且对脑裂发生的原因进行分析阐述。
脑裂是同一个守护进程组中同时出现两个或者多个活动主库,并且这些主库都接收用户请求,提供完整数据库服务。一旦发生脑裂,将无法保证数据一致性,对数据安全造成严重后果。造成脑裂的主要原因有两个:网络不稳定或错误的人工干预。
遇到集群脑裂时,有两种方式恢复集群:
方式一,等待主库的故障解决,期间集群处于不可用状态,待主库故障解决后,按正常启动流程将集群拉起,数据会继续同步;
方式二,采取紧急措施,挑选其中一个备库进行强制切主,未完成同步的数据会丢失。
守护进程首先对本地和远程库的 Open 记录(SYSOPENHISTORY)进行比较,再结合数据库的模式、状态以及守护进程认定的 OK/ERROR 状态判断可加入或者分裂,这里仅对守护进程的判断规则进行大概说明,如果发现守护系统中有分裂库,可以从服务器和守护进程的 log 日志中找到具体的分裂原因。
Open 记录的比较结果分为四种:
初始状态
模拟备库(dw1)故障
主库插入数据
使用DM管理工具对"SYSDBA"."TEST"表插入数据1千万条
备库(dw1)恢复
主库(dw2)故障
监视器显示,当前只有备库存活,且主备库的FLSN不一致
备库(dw1)强制接管主库
原主库(dw2)恢复
监视器显示,当前为脑裂状态,WCTLSTAT:SPLIT
查看DW2守护进程日志
此处显示的是强制让DW1接管成为主库的日志信息
DW2恢复服务加入原集群的过程中,守护进程接受对比发现dw1与dw2的数据不一致
显示dw2数据库为PRIMARY,实例状态为MOUNT
本地库和远程库不相等,也没有包含关系。其中一个库处于 Primary&Open 状态,另一个库是 Mount 状态的主库,则另一个库的守护进程会将自己设置为 Split 分裂状态。
备份主库数据(dw1)
登录disql
disql SYSDBA/'"dameng@123"'
SQL>backup database full backupset '/dmdata/dmbak/DB_DAMENG_FULL_01' compressed;
检查备份文件
/home/dmdba/dmdbms/bin/dmrman
RMAN> check backupset '/dmdata/dmbak/DB_DAMENG_FULL_01';
将备份文件传输到dw2服务器上
scp -r /dmdata/dmbak/DB_DAMENG_FULL_01/ dmdba@192.168.10.122:/dmdata/dmbak
还原恢复dw2
还原时,DW2的数据库服务和守护进程要求是关闭状态
使用dmrman对DW2进行恢复还原
/home/dmdba/dmdbms/bin/dmrman
RMAN> restore database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/DB_DAMENG_FULL_01';
RMAN> recover database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/DB_DAMENG_FULL_01';
RMAN> recover database '/dmdata/dmdb/dm.ini' update DB_MAGIC;
移走dw2的dmwatcher.ctl文件
守护进程检测到本地库是分裂时,会在本地库的 SYSTEM_PATH 路径下,自动创建dmwatcher.ctl 文件,记录的状态一定是 Split状态。在对分裂库进行重建时,需要手动将 dmwatcher.ctl 文件删除,否则守护进程仍然会认定本地库为分裂库。
mv /dmdata/dmdb/dmwatcher.ctl /dmdata/dmbak/
启动dw2数据库服务
查看监视器
集群已恢复正常
文章
阅读量
获赞