达梦数据守护集群_组分裂的数据恢复(一)
目录
1、概述
1.1 实验目的
1.2 组分裂介绍
1.3 实验环境
2、故障模拟
2.1完全备份
2.2插入第1批测试数据
2.3 制造组分裂故障
2.4 故障描述
3、故障恢复方案
3.1 关闭1号库
3.2恢复方案
3.3删除dmwatcher.ctl
3.4 验证
3.5主备库恢复到原来的位置
3.6测试结论
1、概述
1.1 实验目的
本实验目的是验证达梦数据守护集群发生组分裂后数据的恢复方法,解答如下问题:
1)是否可以使用发生故障前的备份集?
2)恢复方法:使用完全恢复还是恢复到指定时点?
3)如果恢复到指定时点,数据能否追平?
1.2 组分裂介绍
同一守护进程组中,不同数据库实例的数据出现不一致,并且无法通过重演 Redo 日志重新同步数据的情况,我们称为组分裂。引发组分裂的主要原因包括:
1. 即时归档中,主库在将 Redo 日志写入本地联机 Redo 日志文件之后,发送 Redo日志到备库之前出现故障,导致主备库数据不一致,为了继续提供服务,执行备库强制接管。此时,当故障主库重启后,就会引发组分裂。
2. 故障备库重新完成数据同步之前,主库硬件故障,并且长时间无法恢复;在用户接受丢失部分数据情况下,为了尽快恢复数据库服务,执行备库强制接管,将备库切换为主库。此时,如果故障主库重启,也会造成组分裂。
检测到组分裂后,守护进程会修改控制文件为分裂状态,强制退出被分裂的库,被分裂出去的数据库需要通过备份还原等技术手段重新恢复
1.3 实验环境
操作系统:CentOS7.6
达梦数据库版本:DM8_20240712
达梦守护集群版本:V4.0
集群主库(1号库):192.168.220.101
集群备库(2号库):192.168.220.102
集群确认监视器:192.168.220.109
2、故障模拟
2.1完全备份
模拟故障前先生成一份备份
1)查看集群
2)保存打底数据
create table tb_testdw
(c1 varchar2(100));insert into tb_testdw values('打底数据');
commit;
3)全量备份
BACKUP database BACKUPSET '/dm8/backup/fullback_202410191350';
4)查看LSN :66218
2.2插入第1批测试数据
insert into tb_testdw values('第1批数据');
commit;
查看LSN:66223
可以在监视器中查看:show
2.3 制造组分裂故障
1)备库网络故障(2号库)
ifdown ens33
2)主库写入新业务数据(1号库)
insert into tb_testdw values('第2批数据');
commit;
3)主库网络故障(1号库)
ifdown ens33
4)备库网络恢复(2号库)
ifup ens33
5)备库强制接管(2号库)
本案例中强制接管后,第2步产生的业务数据“第2批数据”会丢失
login
takeover force DM8DW.DM8DW02 #插入新数据
insert into tb_testdw values('第3批数据');
commit;
insert into tb_testdw values('第4批数据');
commit;
6)原主库网络恢复(1号库)
ifup ens33
注意,这里是组分裂,不是脑裂。根据定义,脑裂是多个主库同时对外服务,本例中虽然有2个primary,但是只有1个是open状态,另一个是mount状态。其次,一旦发生脑裂,守护进程会通知所有主库下线,等待用户干预,也就是说,脑裂被认定后,数据库服务会中断。本例中的DM8DW02是OPEN状态,服务没有中断。
本例中被分裂出来的库只有DM8DW01。
查看1号库的dmwatcher.ctl
cat dmwatcher.ctl
7)查看openinfo信息
#监视器查看open信息
show open info DM8DW01
show open info DM8DW02
2.4 故障描述
原备库(2号库)成为了新的主库。原主库(1号库)与2号库数据不一致,导致加入集群失败,被分裂出来。现在要通过备份还原技术恢复1号库,使其能够重新加入集群。
3、故障恢复方案
本次实验尝试使用故障发生前的备份集还原恢复1号库。
3.1 关闭1号库
DmServiceDM8DW01 stop
disql SYSDBA/SYSDBA:6236
shutdown immediate
3.2恢复方案
我们先看1号库的几个LSN。
分裂时的LSN:66371
openinfo最大同步LSN:66257
插入第1批数据后的LSN:66223
备份集LSN:66218
首先,recover这一步不能使用归档做完全恢复,原因是如果用归档做完全恢复,LSN仍然是66371,数据仍然不一致。可以考虑将数据恢复到LSN=66257或LSN<66257。
本例中,我们将数据recover到LSN=66218,这样可以测试下2号库成为主库前的数据是否能同步。
恢复还原
cd /dm8/dmdbms/bin
./dmrman
restore database '/dm8/datadm/DM8DW/dm.ini' from backupset '/dm8/backup/fullback_202410191350';
recover database '/dm8/datadm/DM8DW/dm.ini' with archivedir '/dm8/archdm' UNTIL LSN 66218;
recover database '/dm8/datadm/DM8DW/dm.ini' update db_magic;
修改模式
DmServiceDM8DW01 start
cd /picc/dmdbms/bin
./disql SYSDBA/SYSDBA:6236
sp_set_para_value(1,'ALTER_MODE_STATUS',1);
alter database standby;
sp_set_para_value(1,'ALTER_MODE_STATUS',0);
3.3删除dmwatcher.ctl
删除dmwatcher.ctl
cd /dm8/datadm/DM8DW/
mv dmwatcher.ctl dmwatcher_2024101902.ctl
3.4 验证
DmWatcherServiceDM8DW01 start
查看集群状态
1号库成功加入集群,成为备库
登录新备库(1号库),查询
select * from tb_testdw;
我们看到,2号库成为主库前/后的数据全部同步成功。
3.5主备库恢复到原来的位置
login
swichover
3.6测试结论
1)可以使用发生故障前的备份集恢复分裂出来的库
2)可以通过OPENINFO信息确定恢复到哪个LSN,这里的LSN小一点也没有关系。
3)故障库重新加入集群后,集群会根据LSN自动同步所有缺失的数据
本文结束
参考文档《DM8数据守护与读写分离集群V4.0》
20241019