关于MySQL的commit非规律性失败案例的深入分析

案例描述:

  一个普通的事务提交,在应用里面会提示commit超时,失败。

一、理论知识

1、关于commit原理,事务提交过程

  1、寻找修改的数据页:

    1、如果该数据页在内存中,则直接是内存读;

    2、如果该数据页内存中没有,物理读,就从磁盘调入内存;

  2、磁盘中的undo页调入内存;

  3、先将原来的数据存入undo,然后修改数据(数据页成脏页);

  4、修改数据的信息生成redo数据存入log_buffer(内存buffer_pool的一个空间,默认16M)中;

mysql> show variables like ‘%log_buffer%‘;
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.01 sec)

  5、log_buffer通过log线程(后台线程,非常勤快),持续不断的将redo信息写入disk的innodb_log_file中;

mysql> show variables like ‘innodb_log_file%‘;
+---------------------------+----------+
| Variable_name             | Value    |
+---------------------------+----------+
| innodb_log_file_size      | 50331648 |
| innodb_log_files_in_group | 2        |
+---------------------------+----------+
2 rows in set (0.01 sec)

  6、事务提交,刻意触发log线程,将剩余的log_buffer中的redo数据信息写入磁盘中,数据量已剩不多,写完提交成功。

注意:

  1、修改记录前,一定要先写日志;

    “日志先行”,这是数据库最基本的原则。

  2、事务提交过程中,一定要保证日志先落盘,才能算事务提交完成。

  3、意外掉电,内存脏页丢失,但是磁盘的innodb_log_file中存放了redo日志信息,待重启服务器,MySQL通过读取磁盘的log_files数据,自动将数据的修改重新跑一边。

Q:为什么mysql commit速度总是很快,尽管事务修改的数据量可能很大?

A:

  因为事务提交,并不是对磁盘数据进行修改,而是将修改数据的redo信息通过后台log线程写入磁盘的redo logfile中,完成mysql commit,无论事务修改的数据量有多大,这个过程速度是很快的。

  而内存中的脏块,也就是修改后的数据页,正常情况下是由后台相关write线程周期性的将脏页数据刷入磁盘中,保证innodb buffer pool有足够的干净块、可用块。

2、关于rollback原理,回滚过程

  1、MySQL读取内存中undo页信息

  2、通过undo信息找到脏页,反着对数据进行修改

  3、do、undo的时间相同,且都会产成redo信息

  4、事务提交

MySQL回滚处理机制:

  如果线程中断,事务没有提交,undo会将记录此信息,待另一会话进程连上,查看该块数据信息,MySQL自动回滚进行数据页修改,然后被读取。也就是说为了避免系统因为rollback被hang住,通过直接杀死进程的方式,中断事务,等待后来者要读取该数据信息时进行回滚,再返回结果。

Q:rollback为什么有时候很慢,rollback的风险和风险避免方式?

A:

  rollback的时间取决于回滚前事务修改数据的时间,处理量大回滚时间长,处理量小回滚时间短。

  1、rollback风险:容易导致系统被hang住;

  2、风险避免方式:直接杀死会话进程或是mysql进程。

3、存储写入性能分析

Q:mysql commit,存储为什么写速度能够保持在0ms,极少出现1ms情况?

A:

  对于存储来说,写性能相当高:假设存储cache总有空闲空间的情况下,事务提交,将log buffer中剩余的很少的redo数据写入存储cache,即为完成mysql commit,这个过程是相当快的(能够保持在0ms,极少出现1ms情况),后续redo数据由cache写入磁盘的过程是后台进行。

4、存储级别的灾备(同城灾备)

  1、灾备同步过程:commit

    1、redo、binlog写入本地存储cache;

    2、通过网络同步binlog写入远端同步的服务器的存储cache中;

    3、响应本地数据库;

    4、事务提交成功;

  2、风险:

    网络出现问题(信号断续,缆线断了),导致写hang住,commit超时失败。

  3、解决:

    通过超时设置,网络中断超过限制,自动将同步改为灾备异步,尽可能少的影响业务commit超时失败。

二、分析与处理

  存储写性能比较差,很多时段会达到5ms,甚至于10ms以上

    备注:灾备同步已经停止的情况下。

1、存储中BBU问题,出现监控BBU的bug;

  解决:重启BBU,不行就更新BBU。

2、cache被占满

  1、海量数据写入,commit数据占满cache;

  2、硬盘I/O异常,异常SQL导致的海量物理读;

  解决:索引优化。

3、存储性能差

  解决:找老板掏钱,更换优质设备。

时间: 2024-10-11 12:09:56

关于MySQL的commit非规律性失败案例的深入分析的相关文章

Mysql学习之--Mysql启动失败案例

Mysql学习之--Mysql启动失败案例 系统环境: 操作系统:Linux RH6 数据库:  Mysql 5.6 在启动mysql server时,启动失败 [[email protected] mysql]# service mysql start Starting MySQL...The server quit without updating PID file [FAILED]b/mysql/ogg.pid). 查看mysql错误日志: [[email protected] mysql

Mysql主从不同步问题处理案例

在使用Mysql的主从复制架构中,有两个比较头疼的问题: 1.主从数据不同步后如何处理 2.主从同步延迟问题如何解决 本文将根据实际案例来分析下问题1,至于问题2多数文档介绍的办法是启用多线程复制来解决,言归正传,这里的问题1还可以细分成两种情况. 1.Slave_IO_Running和Slave_SQL_Running在YES情况下,主从数据不同步如何处理? 2.Slave_SQL_Running在NO情况下,主从数据不同步如何处理? 出现第一种情况通常原因是手工去修改了从库的数据导致主从数据

浅析mysql交互式连接&非交互式连接

https://www.jb51.net/article/81462.htm https://blog.csdn.net/andypan1314/article/details/77930677 (1)interactive_timeout: 服务器关闭交互式连接前等待活动的秒数(2)wait_timeout: 服务器关闭非交互连接之前等待活动的秒数.两者生效取决于:客户端是交互或者非交互的连接.在交互模式下,interactive_timeout才生效:非交互模式下,wait_timeout生

失败案例

2.亿唐网 缺少定位,融资过多 一旦认准方向之后,集中公司和个人的资源在一个产品上.什么都想做,什么都做不好. 兵贵神速.速度是制胜的关键.在IT行业,永远是快鱼吃慢鱼. 几个出色的人才远胜于几十个毫无激情的庸人. 找人一定要高标准.考虑到机会成本和招人效率,应该只在名校找人. 建立的制度应该是激励创造力的发挥,而不是去限制个人. 产品一定要做到本行业前三名. 视频网站当年的三杰之一,优酷,土豆和酷6.其中优酷的古永锵,和李善友都是搜狐系,土豆王微是文艺青年.一度风风火火.   失败的教训:路线

(/var/lib/mysql/NeoKylin-CNVL.cs1cloud.internal.pid).   [失败]

启动mysql数据库失败 [[email protected] opt]# service mysql start Starting MySQL.....The server quit withoutupdating PID file (/var/lib/mysql/NeoKylin-CNVL.cs1cloud.internal.pid).                         [失败] 解决方法: 将ervice mysql start启动方式改为/etc/init.d/mysqls

程序员加入创业公司失败案例

今天看到一篇文章<万众传业,程序员的血泪史>里面讲了几个很典型的加入创业公司失败案例,值得每一个想找创业公司你程序员思考,现将故事转载如下. 故事一.少听『商业精英』讲故事,听多了中毒 首先你必须承认,创始人 CEO 都是特别能说的家伙.一个有判断能力的明智的程序员,首先需要具备的品质就是要保持冷静,不要轻易被人打鸡血. 下面是一朋友(因为隐私原因,他让我不提名字,我就直接 copy 故事了)的创业经历和总结反思,写得非常受用,我之前也转到过程序员客栈技术圈. 我的上一家公司 CEO 是个新加

源代码防泄密的失败案例(文档加密软件)

使用文档加密软件加密保护源代码,实现源代码防泄密.目前实践效果很差,以下失败案例可供查证: 比亚迪.宇龙通讯.酷派.国人通讯等(都是同一家公司做的,名字就不说了,问用户就知道了,北京的.) 1)卡.慢.蓝屏.损坏数据: 2)存在漏洞.安全性不高: 3)技术上争议不断:

Citrix XenDesktop VDA升级失败案例分析

今天处理了一个关于Citrix XenDesktop VDA升级失败的案例,这里跟大家分享一下. [背景] 用户需要将现有的XenDesktop5.6的环境升级到XenDesktop7.5,Citrix支持这种场景的支持,用户在更新VDA的是否发现升级失败. [问题描述] 具体错误信息可以参考以下截图: 具体的错误信息: rror Id: XDMI:1414B9D7 Exception:     Citrix.MetaInstaller.MetaInstallerException Instal

mysql SQLyog导入csv数据失败怎么办?

分享下mysql使用SQLyog导入csv数据失败的解决方法 给mysql导入数据,选中某个表选择导入--导入使用本地csv数据即可,单有的时候不知道什么问题导入不成功!!! 给mysql导入数据,使用的软件是SQLyog,相信直接导大家也都会,选中某个表选择导入--导入使用本地csv数据即可,单有的时候不知道什么问题导入不成功,可以使用命令,以此记录,以后用到便于查: (我的是windows系统)LOAD DATA LOCAL INFILE 'C:\\Users\\zl\\Desktop\\z