包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相

本文主要是介绍包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提问:作为DBA运维的你是否遇到过这些烦恼

1、数据库从库复制链路如何正确配置表过滤信息?

2、数据库从库的GTID在变化,实际却没有数据写入,究竟是什么原因?

心中有章,遇事不慌

作为DBA的你,遇到问题无从下手,除了在问题面前徘徊,还能如何选择?如果你一次或多次遇到该问题还是

无法解决,又很懊恼,该如何排忧呢?关注公众号,关注《包拯断案》专栏,让小编为你排忧解难~

#包拯秘籍#

一整套故障排错及应对策略送给你,让你像包拯一样断案如神:

#首先

遇到此类问题后,我们要做到心中有章(章程),遇事不慌。一定要冷静,仔细了解故障现象

(与研发/用户仔细沟通其反馈的问题,了解故障现象、操作流程、数据库架构等信息)

#其次

我们要根据故障现象进行初步分析。心中要想:是什么原因导致数据库从库里没有数据写入?

例如:是复制链路的状态出现问题了,还是配置的表过滤信息出错了?

#然后

针对上述思考,我们需要逐步验证并排除,确定问题排查方向。

#接着

确定了问题方向,进行具体分析。通过现象得出部分结论,通过部分结论继续排查并论证。

#最后

针对问题有了具体分析后,再进行线下复现,最终梳理故障报告。

真刀实战,我们能赢

说了这么多理论,想必实战更让你心动。那我们就拿一个真实案例进行分析——某运营商业务系统部署了

一套多源复制的数据库架构,DBA发现:从库主机异常重启、启动复制后,GTID在变化但是并没有数据写入,

究竟是什么原因?

01故障发生场景

在项目现场兢兢业业进行数据库部署的你,突然收到告警:一套部署多源复制的数据库架构中,

数据库从库所在主机发生异常重启后,手动拉起复制链路,一段时间后客户反馈从库数据没变化,

数据最近更新的时间是主机重启前。经查看,发现复制链路状态正常且配置的表过滤信息都显示正常,

从库GTID在变化,但就是没有数据写入从库,DBA心中疑惑不已,立马着手排查。

02故障排查分析

1)收到告警后,DBA登录数据库后台检查主从复制状态,发现复制状态正常
在这里插入图片描述

2)检查从库每个复制通道中配置的表过滤信息,配置也显示正常
在这里插入图片描述

3)检查从库errorlog,发现日志里没有显示异常信息

4)检查从库relaylog,发现relaylog中的事务不是空事务

5)检查从库binlog,解析后发现从库binlog日志中所有事务都是空事务,只包含了begin和commit操作。
在这里插入图片描述

由此怀疑,是应用relaylog时配置的表过滤没有生效导致的。由于无法在本地复现该问题,DBA无法确定具体

原因,因此求助研发团队。经研发团队查看代码并调试后发现,问题出在配置文件中的replicate-wild-do-table

参数设置上,此前DBA将表过滤配置持久化到配置文件上了,因该参数获取的表名存在问题,导致数据未能正

确应用到从库中。为解决这个问题,DBA在对replicate-wild-do-table参数进行正确设置后,数据同步恢复正常。

03问题复现

通过研发同事代码调试,发现配置文件中持久化的参数有问题。例如参数设置为

【replicate-wild-do-table=tongdao2:test2.t1,test2.t2】。

GreatDB启动时,每一行作为一个条件,此时对于tongdao2而言,配置replicate-wild-do-table的

结果是:db=test2,table_name=t1,test2.t2,这样写会将 t1,test2.t2 当作一个表,不满足条件。

因此,同步过程中,table_name=t1,test2.t2 找不到,导致所有事务全部转化为空事务,

也就查询不到数据了。

源代码如下:
在这里插入图片描述

解析参数时,只查找了冒号为channel和table的分隔符,没在table之间去检查逗号的逻辑。

04故障解决方案

(1)将replicate-wild-do-table持久化到配置文件时:

采用多源复制时,为避免上述问题,可采用如下配置:同一通道下每张表单独配置一行,

例如:test2.t1,test2.t2 表;

例如:
replicate-wild-do-table=tongdao1:test1.t1
replicate-wild-do-table=tongdao2:test2.t1
replicate-wild-do-table=tongdao2:test2.t2

(2)不将replicate-wild-do-table持久化到配置文件时:

如果不将此参数持久化到配置文件,应在实例重启后重新执行 CHANGE REPLICATION FILTER命令

配置表过滤条件,确保配置及时生效,例如:

greatdb> CHANGE REPLICATION FILTER
Replicate_Wild_Do_Table=(‘test2.t1’,‘test2.t2’) for channel ‘tongdao2’;

复盘总结

1.故障主要原因

此次故障导致的主要原因是 replicate-wild-do-table 参数未正确配置,导致表过滤条件不生效,

将应用的所有事务转化为空事务。

2.重视故障测试

在一套新的业务系统后完成数据库架构搭建后,应进行故障测试,包括模拟数据库从库异常重启、

复制链路重建等情况,以验证配置的稳定性和可靠性,提前规避相关故障发生。

这篇关于包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143939

相关文章

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到