一、脑裂
1、脑裂的介绍
脑裂是同一个守护进程组中同时出现两个或者多个活动主库,并且这些主库都接收用户 请求,提供完整数据库服务。一旦发生脑裂,将无法保证数据一致性,对数据安全造成严重 后果。
DM 数据守护系统为预防脑裂做了大量工作,例如故障自动切换模式的数据守护必须配置确认监视器。确认监视器启动故障切换之前,会进行严格的条件检查,避免脑裂发生。守护进程一旦检测到脑裂发生,会马上强制退出主库,等待用户干预,避免数据差异进一步扩大。
2、产生脑裂的原因
造成脑裂的主要原因有两个:网络不稳定或错误的人工干预。
3、避免产生脑裂的建议
为了避免出现脑裂,我们建议:
(1) 设置 dm.ini 参数 ALTER_MODE_STATUS=0,限制用户进行直接通过 SQL 修改 数据库模式、状态以及 OGUID。
(2) 提供稳定、可靠的网络环境。
(3) 配置自动切换数据守护时,将确认监视器部署在独立的第三方机器上,不要与某一 个数据库实例部署在一起,避免由于网络问题触发自动故障切换,导致脑裂发生。
(4) 通过人工干预,将备库切换为主库之前,一定要确认主库已经发生故障,避免主库 活动情况下,备库强制接管,人为造成脑裂。
二、修复脑裂的读写分离集群
1、脑裂的现象
(1)监视器
(2)RWW_01
(3)RWW_02
观察监视器可以看到 ‘‘WCTLSTAT’’ 这列是 ‘‘Split’’ 的状态,’‘WCTLSTAT’’ 这列记录的是守护进程控制文件状态,包括 Valid/Split/Invalid 三种状态;并且还能够观察到RWW_01与RWW_02两个实例都为主库;
2修复集群
(1)关掉进程
先将监视器进程停掉,再将集群各节点的dmserver和dmwatcher进程停掉
(2)删掉分裂库生成的守护进程控制文件
守护进程在检测到本地库分裂时,自动创建 dmwatcher.ctl 文件,保存在本地库的 SYSTEM_PATH 路径下,并且文件中记录的状态一定是 Split 分裂状态。
如果 dmwatcher 加载到 dmwatcher.ctl 文件,则认为对应的库一定是分裂状态。如果需要对分裂库进行重建,则需要手动将 dmwatcher.ctl 文件删除,否则守护进程仍然会认定本地库为分裂库。
(3)备份RWW_02
[root@localhost bin]# ./dmrman
dmrman V8
RMAN> backup database '/opt/dmdbms/data/DAMENG/dm.ini' backupset '/opt/dmdbms/data/RWW_02_BAK';
(4)恢复RWW_01
将RWW_02的备份拷贝到RWW_01上
[dmdba@localhost bin]$ ./dmrman
dmrman V8
RMAN> restore database '/opt/dmdbms/data/DAMENG/dm.ini' from backupset '/opt/dmdbms/data/RWW_02_BAK';
RMAN> recover database '/opt/dmdbms/data/DAMENG/dm.ini' from backupset '/opt/dmdbms/data/RWW_02_BAK';
RMAN> recover database '/opt/dmdbms/data/DAMENG/dm.ini' update db_magic;
(5)配置RWW_01
1. 以mount模式前台启动RWW_01
[dmdba@localhost bin]$ ./dmserver /opt/dmdbms/data/DAMENG/dm.ini mount
2.修改数据库模式
[dmdba@localhost bin]$ ./disql
SQL> alter database standby;
3.退出前台启动
EXIT
(6)启动进程
将集群各节点的dmserver和dmwatcher进程启动
(7)通过监视器观察集群状态
前台启动监视器
通过观察监视器,可以观察到此时集群已恢复正常状态
(8)启动监视器