MGR修改max_binlog_cache_size参数导致异常

简介: MGR修改max_binlog_cache_size参数导致异常

一、问题来源

这是一位朋友的问题,因为前期朋友设置max_binlog_cache_size为8m,后面在线进行了修改了本参数,但是结果导致整个3节点的MGR集群除了primary节点其他两个second节点均掉线。大概的日志如下:

image.png

二、使用binlog cache的大概流程

这也是我以前写过的一个过程。

  • 开启读写事务。
  • 执行‘DML’语句,在‘DML’语句第一次执行的时候会分配内存空间给binlog cache缓冲区。
  • 执行‘DML’语句期间生成的Event不断写入到binlog cache缓冲区。
  • 如果binlog cache缓冲区已经写满了,则将binlog cache缓冲区的数据写入到binlog cache临时文件,同时清空binlog cache缓冲区,这个临时文件名以ML开头。
  • 事务提交,binlog cache缓冲区和binlog cache临时文件数据全部写入到binary log中进行固化,释放binlog cache缓冲区和binlog cache临时文件。但是注意此时binlog cache缓冲区的内存空间留用供下次事务使用,但是binlog cache临时文件被截断为0,保留文件描述符。其实也就是IO_CACHE结构保留,并且保留IO_CACHE中分配的内存空间和临时文件文件描述符。
  • 断开连接,这个过程会释放IO_CACHE同时释放其持有的binlog cache缓冲区内存以及持有的binlog cache临时文件。

三、max_binlog_cache_size参数的作用

这部分也是我以前记录过的。

max_binlog_cache_size:修改需要使用set global进行修改,定义了binlog cache临时文件的最大容量。如果某个事务的Event总量大于了(max_binlog_cache_size+binlog_cache_size)的大小那么将会报错,如下:

ERROR 1197 (HY000): Multi-statement transaction required more than
'max_binlog_cache_size' bytes of storage; increase this mysqld variable
and try again

我们在函数_my_b_write可以看到如下代码:

if (pos_in_file+info->buffer_length > info->end_of_file) //判断binlog cache临时文件的位置加上本次需要写盘的数据大于info->end_of_file的大小则抛错

{
errno=EFBIG;
set_my_errno(EFBIG);
return info->error = -1;
}

其中info->end_of_file的大小正是来自于我们的参数max_binlog_cache_size。

四、分析问题

从second节点的报错来看,是applier线程应用的事务超过了max_binlog_cache_size设置的大小,但是朋友已经修改了其大小,并且主库并没有报这个错误。

我们知道MGR applier线程从启动MGR的那一刻开始就不会停止,类似的master-slave的sql线程也是一样,我们修改参数是通过set global修改的参数,但是实际上在对于MGR的applier线程并不会生效。

但是对于主库来讲,我们修改参数后只要重启应用重新连接那么参数就生效了,这个时候实际上primary session的max_binlog_cache_size和second applier的max_binlog_cache_size并不一致,一旦有主库做一个稍大的事务,如果这个事务的binlog大于以前设置的值,主库虽然能成功,但是备节点就会由于applier线程的max_binlog_cache_size过小而导致备节点脱离整个集群。

对于这一点我们可以通过debug MySQL的sql线程进行验证。

五、验证

这里我们使用master-slave来进行验证,我们对sql线程进行debug。如下,

  • 当前配置

image.png

  • sql线程
    image.png
  • 修改参数
    image.png
  • 主库执行一个事务,从库执行
    我们可以查看sql线程binlog cache的IO CACHE的信息如下:
    image.png

可以看到这个值还是老值。

  • 重启后sql线程后,主库再做一个事务观察

image.png

很明显我们刚才修改的值重启sql线程后才生效。

因此故障原因得到证明。


Enjoy MySQL :)


全文完。



            </div>
相关文章
|
人工智能 机器人 数据库
人工智能|RAG 检索增强生成
1. 理解什么是 RAG 检索增强。 2. 理解 RAG 检索增强应用场景。 3. 了解 RAG 检索增强有哪些相关的使用方法。 4. 在后续的学习过程中,会结合 LangChain 与 assistant 完成 RAG 相关的实战练习。
|
人工智能 文字识别 API
iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类
本系列的前几篇文件,详细了介绍了Vision框架中关于静态图片区域识别的内容。本篇文章,我们将着重介绍静态图片中物体的识别与分类。物体识别和分类也是Machine Learning领域重要的应用。通过大量的图片数据进行训练后,模型可以轻易的分析出图片的属性以及图片中物体的属性。
580 0
|
关系型数据库 MySQL 网络安全
MySQL主从复制详细教程
配置MySQL的主从复制是一个细致的过程,需要仔细遵循上述步骤进行。一旦配置完成并运行正常,主从复制将大大提高数据库的可用性和读写性能。在操作过程中,务必保持谨慎,确保数据的一致性和安全性。
986 0
|
消息中间件 Oracle 关系型数据库
Flink CDC 数据源问题之参数配置如何解决
Flink CDC数据源指的是使用Apache Flink的CDC特性来连接并捕获外部数据库变更数据的数据源;本合集将介绍如何配置和管理Flink CDC数据源,以及解决数据源连接和同步过程中遇到的问题。
265 0
|
C语言 Python
【蓝桥OJ——C语言】顺子日期、特殊时间、乘积尾零
2022 年 2 月 22 日 22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个 0 组成。
|
SQL 前端开发 测试技术
增加购物车商品数量【项目 商城】
增加购物车商品数量【项目 商城】
305 0
|
XML 自然语言处理 Java
阿里云智能语音交互语音合成高频SSML标记语言使用介绍
SSML是一种基于XML的语音合成标记语言。与纯文本的合成相比,使用SSML可以充实合成的内容,为最终合成效果带来更多变化。SSML不仅控制语音合成能读什么,更能控制语音合成可以怎么读,包括控制断句分词方式、发音、速度、停顿、声调和音量等特征,甚至加入背景音乐。本文用来收录一些在使用过程中高频出现的标签
1628 0
|
缓存 JavaScript 算法
初识WebGL 2 | 青训营笔记
上期简单介绍了webgl的基本使用流程,并试着绘制了一个三角形。这期我们再深入了解一下这个图形处理工具。
初识WebGL 2 | 青训营笔记
|
JavaScript 前端开发
JavaScript中的监听句柄
JavaScript中的监听句柄
JavaScript中的监听句柄
|
Java 关系型数据库 MySQL
SpringCloud-01 Rest学习环境搭建笔记
SpringCloud-01 Rest学习环境搭建笔记
SpringCloud-01 Rest学习环境搭建笔记