注册
主备集群故障模拟
专栏/技术分享/ 文章详情 /

主备集群故障模拟

lhpaaaa 2025/08/22 90 0 0
摘要

1.环境信息

image.png

2.主库故障

正常守护进程状态 WSTATUS 为 OPEN,实例状态 ISTATUS 为 OPEN,归档类型 RTYPE 为REALTIME,归档状态 RSTAT 为VALID。
image.png

2.1故障操作

手动停止主库守护进程,主库服务,模拟主库故障情况。
在实际过程中,因为配置守护进程文件dmwatcher.ini里面设置了INST_AUTO_RESTART=1(实例自动重启),当检测到数据库实例挂掉的时候,会立刻重启。
所以我们先停掉守护进程。

cd $DM_HOME/bin
./DmWatcherServiceDW1 stop
-- 查看数据库和守护进程(确认关闭)  
ps -ef|grep dmdba

--kill -9一定要问过领导才可以使用
停掉数据库服务
cd $DM_HOME/bin
--先停止守护进程,再停止数据库服务,否则守护进程会自动拉起数据库服务。
./DmServiceDW1 stop
-- 查看数据库和守护进程(确认关闭)  
ps -ef|grep dmdba

image.png

2.2监控工具

停掉守护进程后,WSTATUS=error,监视器接收不到任何的主库的守护信息
停掉数据库服务
image.png
将主数据库的服务停止后,监视器开始切换升级备库为主库,备库在将所有Redo日志重演结束后,就可以切换为主库对外提供数据库服务。
image.png
在监视器里面用show查看
image.png

2.3数据库日志

2.3.1实例日志(dm)

备库的实例日志显示(dm_DW1_xxx.log)
image.png
日志中code=-6007, errno=104 + lost connect to site(0) + 所有链路同时失效的组合是主库虚拟机关机的确凿证据。

2.3.2守护进程日志(dmwatcher)

守护进程日志也显示了error=104,表明所有连接被同时重置。
image.png

2.4数据库排查

如果设置了读写分离集群(主库写,备库读的情况下),那么此时写是写入备库的。
image.png
用disql进去备库
可以发现备库已经变成了主库,在备库这里添加一条数据用于验证当主库恢复之后是否数据同步。
image.png
在实际过程中,因为配置守护进程文件dmwatcher.ini里面设置了INST_AUTO_RESTART=1(实例自动重启),当检测到数据库实例挂掉的时候,会立刻重启。

2.5分析总结

监视器接收不到主库的守护进程信息,会自动给备库进行升级成为主库,我们可以查看主库的守护进程日志和实例日志等看看是不是数据库服务或者守护进程出现了问题。

2.6故障处理

主库故障后,备库切换为主库;当原主库恢复后,默认会以 “备库” 身份重新加入集群
重新启动主库的数据库服务,启动守护进程

./DmServiceDW1 start
./DmWatcherServiceDW1 start

开始对DW1进行状态切换,将原来是primary状态切换为standby,原来的主库就变成了备库
image.png
image.png
检查数据同步是否正常
前面在DW2(即切换后的主库)添加的数据,在重新加入主库的数据库可以查到
image.png
设置了读写分离,变为了备库就不允许插入数据了
image.png

3.备库故障

3.1故障操作

手动停止备库守护进程,主库服务,模拟备库故障情况。
在实际过程中,因为配置守护进程文件dmwatcher.ini里面设置了INST_AUTO_RESTART=1(实例自动重启),当检测到数据库实例挂掉的时候,会立刻重启。
所以我们先停掉守护进程。

cd $DM_HOME/bin
./DmWatcherServiceDW2 stop
./DmServiceDW2 stop
-- 查看数据库和守护进程(确认关闭)  
ps -ef|grep dmdba

3.2监控工具

停掉守护进程后,WSTATUS=error,监视器接收不到任何的备库的守护信息
image.png
在监视器用show命令可以看到数据库状态报错
image.png
用tip命令查看系统当前运行状态
image.png

3.3数据库排查

在DM管理工具查看归档状态,显示为INVALID
select * from SYS.VARCH_STATUS ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20250818225909Z6B60ZBFF2D2TSM9KQ) 查看最后推送归档日志的时间 SELECT arch_dest,LAST_END_TIME,LAST_SEND_CODE,LAST_SEND_DESC from SYS.VARCH_SEND_INFO where arch_dest=‘DW2’;

image.png

3.4分析总结

监视器接收不到备库的守护进程信息,主库会进行尝试连接备库,向监视器确认是否备库异常。

3.5故障处理及建议

监视器
查看到备库已恢复
检查数据同步是否正常
在主库添加的数据,在重新加入备库的数据库可以查到
image.png
image.png
image.png

4.主库心跳网络故障

4.1故障模拟

关闭主库的心跳网络

ifdown ens33
--验证
ip link show ens33

image.png

4.2监控工具

监视器接收不到主库的守护进程信息,自动切换备库为主库
image.png
用show命令可以查看到
image.png

4.3数据库日志

在备库的守护进程日志可以看到提示连接不到数据库服务
image.png
备库的实例日志输出
image.png

4.4操作系统系统资源

通过在备库ping或者telnet测试心跳网络

-- 在备库节点执行
ping 192.168.100.111
-- 端口连通性测试
telnet 192.168.100.111 7336  # MAL端口
telnet 192.168.100.111 7436  # 守护进程端口

4.5分析总结

当主库的心跳网络发生故障时,监视器无法接收到主库的守护进程信息,无法判断主库是否正常,回自动将备库切换为主库。

4.6故障处理

--恢复网络
ifup ens33
--验证
ip link show ens33

监视器
DW1的守护进程恢复,监视器可以接收到信息
image.png
主库恢复后重新加入集群回变为备库
image.png

5.备库心跳网络故障

5.1故障模拟

关闭备库的心跳网络

ifdown ens33
--验证
ip link show ens33

image.png

5.2监控工具

监视器接收不到备库守护进程信息,状态也为error
image.png

5.3数据库日志

在主库的守护进程日志可以看到接收不到守护进程信息
image.png

5.4操作系统系统资源

通过在主库ping或者telnet测试心跳网络

-- 在主库节点执行
ping 192.168.100.113
-- 端口连通性测试
telnet 192.168.100.113 7336  # MAL端口
telnet 192.168.100.113 7436  # 守护进程端口

5.5分析总结

当备库的心跳网络发生故障时,监视器无法接收到主库的守护进程信息,无法判断备库是否正常,监视器对备库守护进程状态判定为error。
5.6故障处理

--恢复网络
ifup ens33
--验证
ip link show ens33

监视器
DW2的守护进程恢复,监视器可以接收到信息,主库重新推送归档日志给备库,备库重演归档日志。
image.png
image.png

6.主库关机

6.1模拟故障操作

关闭主库的虚拟机

# 用root用户 立即关机
shutdown -h now

6.2监控工具

正常情况下:
image.png
故障后:
监视器接收不到主库的守护进程消息
image.png
切换备库(DW2)为新的主库
image.png
show:可以看到DW2已经成为新的主库,DW1显示为error状态,
image.png
tip:查看系统当前运行状态
image.png

6.3数据库日志

6.3.1实例日志(dm)

备库的实例日志显示(dm_DW1_xxx.log)
image.png
日志中code=-6007, errno=104 + lost connect to site(0) + 所有链路同时失效的组合是主库虚拟机关机的确凿证据。

6.3.2守护进程日志(dmwatcher)

守护进程日志也显示了error=104,表明所有连接被同时重置。
image.png

6.4操作系统系统资源

6.4.1测试网络连通性

ping 192.168.100.111 
telnet 192.168.100.111 5236  # 数据库端口
telnet 192.168.100.111 7336  # MAL端口
telnet 192.168.100.111 7436  # 守护进程端口

在备库上尝试连接主库网络,发现都不通

6.4.2远程连接主库

用shell连接主库发现连接不上。

6.5分析总结

监控工具显示接收不到主库的守护进程信息,实例日志和守护进程日志都表明MAL通信接收失败,归档日志推送失败,通过ping和telnet的方式还有ssh远程连接的方式都连接不上主库,这些都表明主库可能关机了。

6.6故障处理

重启主库主机,到监视器里面观察是否正常加入集群,最后再将原来的主库切换回主库。
重启主库主机后,监视器重新接收到守护进程的信息,DW1重新加入集群,并且原来的主库降级为了备库。
image.png
image.png
手动切换回原来的配置(DW1为主库,DW2为备库)

#直接在监视器出输入这些内容
login
用户名:SYSDBA
密码:Dameng123
switchover GRP_DW.DW1   #DW1:数据库实例名称
y


image.png
image.png
image.png

7.备库关机

7.1模拟故障操作

关闭备库的虚拟机
# 用root用户 立即关机
shutdown -h now

7.2监控工具

正常情况下:
image.png
故障后:
主库守护进程(DW1)经历了一系列状态切换
image.png
监视器接收不到备库的守护进程消息
image.png
show:可以看到DW1主库还是正常状态,备库守护进程状态为error,实例状态也是关闭,归档状态为invalid。
image.png
tip:查看系统当前运行状态
image.png

7.3数据库日志

7.3.1实例日志(dm)

主库的实例日志显示
image.png
日志中code=-6007, errno=104 + lost connect to site(0) + 所有链路同时失效的组合是主库虚拟机关机的确凿证据。
7.3.2守护进程日志(dmwatcher)
守护进程日志也显示DW2的守护进程有问题,尝试连接DW2连接不成功,归档状态变为 INVALID。

image.png

7.4操作系统系统资源

7.4.1测试网络连通性

ping 192.168.100.113 
telnet 192.168.100.113 5236  # 数据库端口
telnet 192.168.100.113 7336  # MAL端口
telnet 192.168.100.113 7436  # 守护进程端口

在主库上尝试连接备库网络,发现都不通

7.4.2远程连接主库

用shell连接主库发现连接不上。

7.5数据库状态检查

查看集群状态
select * from SYS.V$ARCH_STATUS;
备库的 ARCH_STATUS = INVALID

7.6分析总结

监控工具显示接收不到备库的守护进程信息,实例日志和守护进程日志都表明MAL通信接收失败,归档日志推送失败,通过ping和telnet的方式还有ssh远程连接的方式都连接不上备库,还有利用sql语句查看集群状态,看到备库的归档状态为invalid,这些都表明备库可能关机了。

7.7故障处理

重启备库主机,到监视器里面观察是否正常加入集群。
image.png

8.归档断档,备库如何重建

8.1故障模拟(归档文件丢失)

关闭监视器,关闭掉备库,在主库创建事务,产生新的归档日志,然后删掉归档日志,造成归档日志丢失的情况。
image.png
image.png
8.2查看故障状态
在监视器可以看到,备库的RSTAT=INVALID归档状态异常,CLSN和FLSN跟主库的不一样
image.png
备库查看发现没有主库插入的数据
image.png
主库现在的LSN
image.png
以上都表明已经归档断档了

8.3备库恢复操作

在保证主库可以正常运作的情况下,利用热备来恢复备库的数据,使得主备之间数据一致。

8.3.1开启归档

#进入disql
./disql SYSDBA/'"Dameng123"'
select arch_mode from v$database;  -- 需返回'Y'(归档已开启)
---------------------若归档没有开启-----------------
alter database mount;
alter database archivelog;
alter database add archivelog 'DEST=/dmdata/arch, TYPE=local, FILE_SIZE=1024, SPACE_LIMIT=2048';
alter database open;

注意,集群一般在dmarch.ini(归档配置文件)已经配置好了归档信息了。

开启归档,确保热备份时能同步备份期间产生的 Redo 日志。
8.3.2执行主库全量联机备份
主库在disql下执行热备

./disql SYSDBA/'"Dameng123"'
#全库备份到/home/dmdba/bakfull
BACKUP DATABASE FULL BACKUPSET '/home/dmdba/bakfull';

全备已经包含了断档的数据了,不需要额外再归档。
将备份的文件发送给备库
scp -r /home/dmdba/bakfull 192.168.155.113:/home/dmdba/bakfull/

image.png
image.png

8.3.3备库脱机还原与恢复
关闭备库的守护进程和实例

使用 DMRMAN 工具还原主库全量备份

./dmrman
#将主库全量数据还原到备库,重建数据文件。
restore database '/dmdata/data/dmdb/dm.ini' from backupset '/home/dmdba/bakfull/bakfull';
#将数据库恢复到备份集对应的时间点状态,确保数据一致性。
recover database '/dmdata/data/dmdb/dm.ini' from backupset '/home/dmdba/bakfull/bakfull';
执行命令更新备库标识(避免与主库冲突)
recover database '/dmdata/data/dmdb/dm.ini' update db_magic;

image.png

8.3.4备库重新启动并加入集群

以mount模式启动备库实例,等待守护进程接管。
./dmserver /dmdata/DAMENG/dm.ini mount
image.png

启动备库守护进程
./DmWatcherServiceDW2 start
image.png

8.4验证

①验证备库数据是否跟主库一致,备库可以查看到主库添加的数据
image.png
②监视器
image.png
Show
主备库都是正常状态,也恢复了归档推送,同时他们的CLSN(数据库已经分配的最大 LSN 值)和FLSN(已写入联机日志文件的 LSN 值)都相同。
image.png

9.如何将主备集群拆为单机

一定要先备份相关的配置文件。

9.1关闭监视器

./DmMonitorServicedmdb stop

9.2关闭主备的数据库服务和守护进程

./DmServiceDW1 stop
./DmWatcherServiceDW1 stop

主备库都执行

9.3修改dm.ini

主备库都要修改

MAL_INI = 0            # 关闭MAL通信
ARCH_INI = 0           # 关闭归档(若需保留本地归档可设1)
ALTER_MODE_STATUS = 1  # 允许手动修改模式

9.4修改dmmal.ini

主备库都要修改,以下这些全部注释或删除

# 配置归档模式, 事务一致性模式 还是 高性能模式 实时归档默认为:0 读写分离模式为:1
ARCH_WAIT_APPLY=1
[ARCHIVE_REALTIME1]  
#ARCH_TYPE 归档类型 LOCAL REMOTE REALTIME TIMELY ASYNC
ARCH_TYPE= REALTIME  #实时归档

ARCH_DEST= dw2

9.5修改dmwatcher.ini

dw_type=local #守护进程类型设置为本地守护,意味着守护进程只在本地实例起作用,不再参与全局的主备守护集群管理;
dw_mode=munual  #表示手动模式,即不会自动进行主备切换等操作,符合单机模式下不需要自动切换的需求。

9.6以mount模式启动数据库

在新的终端进入disql

ALTER DATABASE NORMAL;    -- 退出主备模式,转为普通库
ALTER DATABASE OPEN;      -- 切换为OPEN状态

9.7验证

SELECT NAME, STATUS,MODE, MODE FROM V$INSTANCE;

image.png

现在已经变成了单机模式了。

9.8禁止守护进程自启动

systemctl disable DmWatcherServiceDW1; # 禁止守护进程开机自启

10.主库启动不了,备库如何接管

当主库启动不了时(例如主库宕机),超过了dmwatcher.ini配置的DW_ERROR_TIME(接收守护进程消息超时时间),监视器会提示接收不到主库的守护进程,
注意:当监视器为普通监视器时,是无法实现自动切换的。
image.png
在dmmonitor.ini配置文件中MON_DW_CONFIRM= 1则表示监视器为确认监视器,可以自动切换。
备库的实例日志显示(dm_DW1_xxx.log),
image.png
在确认监视器下
监视器接收不到主库DW1的守护进程信息,守护进程状态(WSTATUS)为error,触发自动接管流程
image.png
监视器选择集群里面正常的主机作为新的主库,选择了DW2
image.png
备库(DW2)的守护进程从OPEN状态切换为TAKEOVER(接管)状态,暂停正常业务,
image.png
暂停数据同步,SP_APPLY_KEEP_PKG()重演原主库的redolog日志确保主备数据保持一致
image.png
备库先以MOUNT模式启动(加载配置文件,不开放服务),再通过ALTER DATABASE PRIMARY语句将角色从STANDBY改为PRIMARY(从备库变成了主库),监视器通知新主库(DW2)将原主库(DW1)的归档状态标记为无效(避免向故障主库发送日志)
image.png
最后开放数据库实例,可以提供正常服务,开放守护进程状态,DW2正式接管成功。
image.png
流程图如下:
image.png

11.手动切换主备集群,恢复原主备集群的位置

要想将原来的主库继续作为主库,可以在监视器手动切换

#直接在监视器出输入这些内容
login
用户名:SYSDBA
密码:Dameng123

switchover GRP_DW.DW1   #DW1:数据库实例名称
y

image.png
出现这个【切换成功】的提示,监视信息也显示原来的主库变回主库,说明切换成功!

社区地址:https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服