当前位置: 首页 > news >正文

达梦数据守护集群_组分裂的数据恢复(一)

目录

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


http://www.mrgr.cn/news/53969.html

相关文章:

  • java 在同一包下无法跨文件引入自己写的类,也无法导包过去
  • I/O多路转接——select、poll、epoll
  • 微信小程序用开发工具在本地真机调试可以正常访问摄像头,发布了授权后却无法访问摄像头,解决方案
  • 微信小程序-自定义组件
  • Java基础12-特殊文件和日志技术
  • (六) 进程控制
  • 架构设计笔记-22-论文
  • linux centos7系统ARM架构下安装最新版docker 27.3.1及docker-compose v2.3.4
  • “擒牛MACD“,很好用的抓强势波动指标,源码
  • 麒麟v10系统安装docker镜像
  • 联邦学习实验复现—MNISIT IID实验 pytorch
  • AIGC助力小学生编程梦:C++入门不再难!
  • HCIA实验
  • 【Hive】6-Hive函数、运算符使用
  • 2410C++,本次写级数代码的注意事项
  • 自动生成大量c文件,大量函数的Python脚本
  • python【类和面向对象】
  • 基于卡尔曼滤波算法处理感知车道线系数
  • 用实例来理解Java中的类和对象
  • stable diffusion 大模型及lora等下载安装使用教程及项目目录说明
  • ⌈ 传知代码 ⌋ 视频质量评价SimpleVQA
  • 代码训练营 day39|0-1背包问题,LeetCode 416
  • 基于语音识别的停车共享小程序(lw+演示+源码+运行)
  • setuptools封装自己python包
  • 图像梯度-Sobel算子、scharrx算子和lapkacian算子
  • 逆向工程入门02.if语句分析