技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因
发布时间 - 2025-07-10 00:00:00 点击率:次作者:郭斌斌
爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
一、背景
客户反馈在生产环境中,MySQL 5.7 使用 xtrabackup 和 Binlog 进行基于时间点的恢复操作时,卡在 Binlog 的回放阶段,时间漫长,令人怀疑这种操作的合理性。因此,本文进行了 Binlog 回灌验证操作。
二、复现前提 MySQL 版本:5.7.22
Binlog 格式:Row
准备删除 800 多万记录的 Binlog
三、复现准备 3.1 创建表、构造数据
mysql> create table t1(id int primary key,name varchar(10));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t1 values(1,repeat('a',10));
Query OK, 1 row affected (0.01 sec)
mysql> insert into t1 select (select count(1) from t1)+id,name from t1;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
………………
mysql> insert into t1 select (select count(1) from t1)+id,name from t1;
Query OK, 4194304 rows affected (57.75 sec)
Records: 4194304 Duplicates: 0 Warnings: 03.2 准备删除 800 多万记录的 Binlog 文件
MySQL Binlog mysql-bin.000003 用于回灌测试
3.3 由于 Binlog 的回灌和造数是在同一个实例上,之前为了构建删除 800 多万记录的 Binlog,已经将数据删除,因此在进行 binlog 回灌前,需要使用之前造数的方法,重新造数
3.4 在同一个实例上先进行了删除操作,又重新构建新的数据。导致删除操作的 GTID 比重新造数操作的 GTID 小,为保证可以正常回灌,可以执行 reset master
四、复现测试 4.1 解析 MySQL Binlog mysql-bin.000003
4.2 导入解析文件
4.3 查看 processlist,发现导入线程一直处于 Sleep 状态,现象与客户描述一致。
4.4 随即中断导入操作,重新发起导入同时使用 strace 记录操作的行为。
4.5 通过观测产生的 strace.log,发现两个 read 的时间间隔不固定,少的也需要140ms左右,而读取的大小却只有4k(4096),读取效率偏低。
五、分析
通过 Google 搜索“MySQL
Mem Load Slow”,发现这是一个已知的 BUG,MySQL 5.7 Client 在读取较大事务(涉及多行操作)时,由于内存分配效率低,导致消耗大量时间,已在 MySQL 8.0.13 中修复。
六、复测 6.1 使用 MySQL 8.0.18 客户端进行 Binlog 解析文件的回灌,提示 MySQL Server has gone away
6.2 导数报错时数据库未触发重启,查看 error 日志,有如下报错:
6.3 调大 max_allowed_packet 配置后重新测试
6.4 观测 strace 日志,每次读取 Binlog 大小为16M,远高于原来的4k
6.5 观测线程状态
6.6 观察执行耗时,MySQL 8.0.18 客户端导数时间变短,效率提升明显。
七、结论 目前官方在 MySQL 8.0.13 版本中,已解决“使用 MySQL Client 进行批量导数时,内存分配效率低”的问题。因此,MySQL 8.0.18 客户端在进行回灌 Binlog 解析后的文件时,读取文件效率明显高于 5.7.22 的客户端,提升了 Binlog 回放的效率。
参考链接 https://www./link/251b4805008712ec04e69c6569bfb189
https://www./link/b16a9e8de58c95b427b29472b1eca130
# mysql
# php
# html
# Error
# 线程
# 数据库
# dba
# https
# bug
# 新造
# 客户端
# 报错
# 进行了
# 复测
# 是在
# 这是一个
# 请联系
# 已在
# 重启
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在阿里云购买域名并搭建网站?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Laravel如何处理和验证JSON类型的数据库字段
如何用VPS主机快速搭建个人网站?
C#如何调用原生C++ COM对象详解
新三国志曹操传主线渭水交兵攻略
JS经典正则表达式笔试题汇总
Laravel如何配置任务调度?(Cron Job示例)
Laravel Fortify是什么,和Jetstream有什么关系
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
微信小程序 canvas开发实例及注意事项
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
googleplay官方入口在哪里_Google Play官方商店快速入口指南
公司网站制作价格怎么算,公司办个官网需要多少钱?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何将凡科建站内容保存为本地文件?
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Laravel怎么实现验证码(Captcha)功能
Android Socket接口实现即时通讯实例代码
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
简历在线制作网站免费版,如何创建个人简历?
Laravel如何实现用户注册和登录?(Auth脚手架指南)
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel怎么实现模型属性的自动加密
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
C++时间戳转换成日期时间的步骤和示例代码
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Laravel怎么上传文件_Laravel图片上传及存储配置
原生JS获取元素集合的子元素宽度实例
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Android使用GridView实现日历的简单功能
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
JavaScript如何实现路由_前端路由原理是什么
如何快速配置高效服务器建站软件?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
三星、SK海力士获美批准:可向中国出口芯片制造设备
如何在建站宝盒中设置产品搜索功能?

