首页 > 数据库 >MySQL大事务堵塞写入

MySQL大事务堵塞写入

时间:2024-07-29 16:19:01浏览次数:13  
标签:binlog 事务 堵塞 文件 MySQL 写入 提交 mysql

这是2022年发生的一起线上事故,现在有空记录一下。

线上使用的是5.6版本的,大部分业务的逻辑都是先delete 全表,再insert,所以大事务一直是个问题,但是未发生过阻塞业务的情况。

现象

MySQL服务器的负载在一分钟内急剧上升,后又迅速恢复正常。查看binlog文件发现当时有个3G的binlog文件生成,因此判断是大事务写入,并且MySQL这个时候需要生成新的binlog文件导致的。

复现

把日志切分的大小改成10M

查看代码


mysql> show variables like '%max_binlog_size%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| max_binlog_size | 10485760 |
+-----------------+----------+
1 row in set (0.00 sec)

开启大事务

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from bkpm001;
Query OK, 1674248 rows affected (7 min 29.94 sec)

再开一个连接做写入,commit之后立即去写入数据

trx1:

mysql> commit;
Query OK, 0 rows affected (15.55 sec)

trx2:

mysql> insert into yonghu values (null,2,2,2,2,2);
Query OK, 1 row affected (14.68 sec)

事务2被阻塞,事务1提交之后,事务2也提交。

探究

查看mysql链接对应os线程的调用栈

读取文件句柄为23的文件,在写入文件句柄为25的文件,每次写入8192字节(8k)

23句柄是事务生成的binlog临时文件,使用之后会清空,25句柄是对应当前的binlog文件,在提交的时候需要将临时文件拷贝到binlog文件,并且binglog是临界资源,在拷贝过程当中阻塞其他事务写入binlog导致无法提交

write从开始到结束花费了6s时间

解决

解铃还须系铃人,大事务最好的解决办法就是大事化小,但是领导说,业务没时间改,要数据库出方案。

这里(http://hzhcontrols.com/new-312960.html)描述了这个8192是event的大小,官网描述的event大小与实验的结果一致,所以要优化可以调整event的大小,提高每次从临时文件读取写入binlog的大小。

binlog_order_commits=off

大事务的Event会在提交时刻一次性的写入到binary log。如果COMMIT队列中包含了大事务,那么必然堵塞本队列中的其它事务提交,后续的提交操作也不能完成。

各个 session 自行进入 InnoDB commit 阶段,这样不会保证 binlog 和事务 commit 的顺序一致。小事务不必等到大事务提交在提交

设置大一点的binlog文件。从原来的500M改为了1G。

更换更好的io性能磁盘,这里线上的硬盘从原来的机械盘(什么年代了数据库的硬盘还用机械盘)全部换为SSD 。

标签:binlog,事务,堵塞,文件,MySQL,写入,提交,mysql
From: https://www.cnblogs.com/shen-ren-qiang/p/18330351

相关文章

  • 记录一次mysql数据库修复过程
    1.场景最近在使用小皮面板进行靶场搭建的时候,发现数据库一直无法启动,而在虚拟机里是可以启动了,这就很奇怪了。意识到我的本地已经安装了mysql,可能产生了冲突,但是当我兴冲冲启动本地mysql的时候服务却无法启动了。尝试启动了几次mysql重新删除添加服务后发现问题没有得到解决。......
  • MySQL文件my.ini配置
    [mysql]#设置mysql客户端默认字符集default-character-set=utf8[mysqld]#设置3306端口port=3306#设置mysql的安装目录basedir=E:\\mysql-5.7.38-winx64#设置mysql数据库的数据的存放目录datadir=E:\\mysql-5.7.38-winx64\\data#允许最大连接数max_connectio......
  • 树莓派4b的Mysql数据库操作
    卸载树莓派中的MySQL。停止MySQL服务:sudosystemctlstopmysql卸载MySQL服务器和客户端:sudoapt-getremove--purgemysql-servermysql-clientmysql-common删除MySQL数据库和配置文件:sudorm-rf/etc/mysql/var/lib/mysql自动删除未使用的依赖:s......
  • Mysql表结构同步存储过程(适用于模版表)
    Mysql表结构同步流水模版表新增字段需要同步到所有区域年份的流水表CREATEDEFINER=`root`@`%`PROCEDURE`SyncTableStructure`(INsourceTableVARCHAR(255),INtargetTableVARCHAR(255))BEGINDECLAREdoneINTDEFAULT0;DECLAREcolumnNameVARCHAR(255);......
  • mysql操作线上数据时建议用事务
    事务管理是数据库操作中的一个重要概念,特别是当涉及到需要保证数据完整性和一致性的场景。事务是一系列操作,它们作为一个整体被执行,这意味着事务中的所有操作要么全部成功,要么全部失败。在关系型数据库中,事务通常遵循ACID原则,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isol......
  • 从零搭建MySQL主从复制-一主二从
    从零搭建MySQL主从复制-一主二从文章目录从零搭建MySQL主从复制-一主二从1.服务器准备2.Docker安装2.1、安装需要的软件包2.2、设置docker下载镜像2.3、更新yum软件包索引2.4、安装dockerce2.5、启动docker2.6、版本验证2.7、设置开机启动3.MySQL主从部署3.1部署MySQL......
  • CentOS安装MySQL
    参考文章【CentOS安装mysql简单教程】https://blog.csdn.net/qq_50523945/article/details/131069683【运维系列:centos7yum安装使用时提示cannotfindavalidbaseurlforrepo:base/7/x86_64的解决方法(亲测有效☆)】https://blog.csdn.net/weixin_54626591/article/detai......
  • MySQL基础篇(一)
    1.事物的四大特性事务是逻辑上的一组操作,要么都执行,要么都不执行原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不......
  • chsap连接Mysql
    前置操作打开MySql服务 添加引用MySql.Data.dll 数据库查询数据读取一条数据,直接运行就能看到打印台输出。1usingMysql.Data.MyAqlClient;2staticvoidMain(string[]args)3{4stringconnStr="Database=test007;DataSource=127.0.0.1;port=3306;User......
  • 获取 CPU信息,并通过注册表写入
    获取MAC地址输入getmac如下所示: 获取CPUID输入wmiccpugetprocessorid如下所示: 获取产品UUID输入wmiccsproductgetUUID如下所示: 创建reg文件,并输入自己想要修改的内容,具体步骤参考使用注册表文件(REG)添加、修改或删除Windows注册表项和值-最初的幸福ever......