最近再次碰到之前遇到的断言失败的bug,错误信息如下:

InnoDB: Failing assertion: trx->isolation_level == TRX_ISO_READ_UNCOMMITTED

这是一个已知的bug(bug#62037),在MySQL5.5.22版本中被fix掉,在lauchpad上可以看到具体是如何修复的

如何重现

重现case,使用gdb的non-stop模式很容易重现:

启动gdb,使用non-stop

set target-async 1

set pagination off

set non-stop on

断点:

row0upd.c:2033   (Percona Server5.5.18)

case:

session 1:

CREATE TABLE `t1` (   `a` int(11) DEFAULT NULL,   `b` text,   `c` text ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

insert into t1 values (1,repeat(‘b’, 7000), repeat(‘c’, 100));

update t1 set c = concat(c, repeat(‘c’, 2000));

这时候会因为更新列c而导致b列的数据被外部存储(b的列长最大),停在断点

session 2:执行查询

select * from t1 where a = 1;

该bug主要包含两个问题:

问题一:运行时断言失败
主要原因是:
1.更新记录时,undo中只记录了那些被更新的列,而由于其他列更新,导致某个列需要外部存储时,这个列的值不会写入undo。
也就是说,在从函数btr_cur_pessimistic_update中返回后,记录上某个未被更新的列,可能存储的是无效的指针
例如上述场景b列被选出来外部存储,因为它的长度最大,因此b列的数据被修改成一个尚未生效的值全为0的指针;
在悲观更新返回后,由于先mtr commit,再更新外部存储数据,这导致block及索引上的排他锁都被释放掉;这时候其他连接的查询是可以看到这条记录的。
2.虽然MVCC保证查询可以看到修改过的列,但1提到的未修改但被选作外部存储的列没有做undo,因此查询看到的是指针,导致触发断言失败,实例crash
解决:
官方的解决办法是在悲观更新和更新完外部存储列后,才进行mtr commit,这可以保证中间不会有其他查询看到未完成的更新(被阻塞住)
问题二:断言失败crash后,无法crash recovery
原因:
如果在完成悲观更新和写入外部存储列的过程中crash,记录更新可能完成了,但外部存储列是失败的,在crash recovery后,记录依然维持在不一致的状态。这样只要一访问该记录,就会报和问题一一样的断言crash错误
解决:

将上述逻辑修改为:

1.对原记录进行修改,mtr不提交(用btr_mtr代表该mtr)
2.扩展新的外部存储页(不能使用btr_mtr之前释放掉的page,暂时没搞明白为什么…),对新的外部存储页的写入(包括初始化)使用另外一个mtr(称为blob_mtr),对记录上指针的更新使用btr_mtr
3.commit blob_mtr
4.commit btr_mtr
这样在crash recovery的时候,就会先恢复blob页,再恢复记录上的操作;最差的情况就是丢失更新,ibd中存在一个有部分数据的无效blob页,但记录本身仍然能保持一致的状态

另外在插入记录时也可能触发该bug,例如,当一条记录被标记删除,但未被purge掉时,如果再次插入该聚集索引记录,被标记删除的记录就会被更新成现在的记录,这时候触发bug的逻辑就和上述Update的逻辑类似了。

InnoDB: Failing assertion: trx-isolation_level == TRX_ISO_READ_UNCOMMITTED相关推荐

  1. mysql assertion_Mysql异常崩溃,提示 Failing assertion: extern_len = part_len

    以前的Blog被新浪封了,以后就写在这里了. 今天一个测试环境的Mysql忽然挂掉,其实Mysql是已经死掉了,但是ps仍能看到.Mysql的版本为5.0.38. 在Mysqld的Log里输出如下信息 ...

  2. mysql change index_MySQL · 引擎特性 · Innodb change buffer介绍

    前言 在前面几期月报我们介绍了undo log.redo log以及InnoDB如何崩溃恢复来实现数据ACID的相关知识.本期我们介绍另外一种重要的数据变更日志,也就是InnoDB change bu ...

  3. mysql error 1_mysql 启动错误(InnoDB: Operating system error number 1

    环境:mysq 5.6.35.centos 7.3 问题描述: 今天下午开发过来说开发库无法连接了,登录服务器后发现mysql进程down了 启动mysql: /bin/sh /usr/local/m ...

  4. jira mysql 启动 失败_重启机器导致mysql启动失败

    一.问题 二.常见解决方案 网上的解决方法大致为 ①空间不足(df -h 查看) ②权限不足(/var/lib文件夹)chown -R mysql:mysql /vdb1/lib/ ③修改my.cnf ...

  5. mysql got signal 6_UTC - mysqld got signal 6

    昨天上午mysql又碰到一个奇怪的问题.数据库异常终止.重启成功后过就马上崩溃,不能正常运行. 查看mysql错误日志如下: InnoDB: Doing recovery: scanned up to ...

  6. openstack 重启mysql_突然断电导致mariadb数据库无法启动(openstack 命令无法使用)...

    openstack是通过rdo openstack-allinone一键部署的单机模式. 因为突然断掉导致在物理机启动后无法挂载/srv/loopback-device/swiftloopback设备 ...

  7. docker容器运行mysql持久化_OS x下使用Docker 持久化Mysql 数据出现问题

    初学Docker ,请见谅. 系统: OS X 10.11.1 (15B42) 运行docker工具:Docker Quickstart Terminal virtualbox 5.0.8 docke ...

  8. mysql 报表统计sql使用实例_mysql 案例~mysql元数据的sql统计

    一 简介:今天我们来收集下提取元数据的sql 二 前沿: information_schema  引擎 memory 元数据收集表 三 sql语句: 1#没有使用索引的表统计 SELECT t.TAB ...

  9. mysql表出现crash 修复_MySQL表索引损坏致Crash及修复过程实例

    --------------(大量相同的报错)---------------- 2017-08-31T11:11:04.291424Z 32394522 [ERROR] InnoDB: Record ...

最新文章

  1. 第六周项目一-分数类的雏形(2)
  2. Java其他API介绍
  3. 上传漏洞新姿势(限Linux)
  4. ubuntu用不了root用户:~$ su - root Password: su: Authentication failure怎么办?
  5. C++最全输入方式总结(cin、get、getchar、getline)
  6. Dijkstra算法求最短路径(java)
  7. Yii2.0 ActiveForm Input Fields
  8. Qt工作笔记-在界面上输出变量、类、this指针的地址
  9. 利用函数重载编写函数max_彻底理清重载函数匹配
  10. python集合常用方法_Python 集合常用方法总结
  11. 一张图看懂VnTrader的数据流
  12. 用python绘制用例图源代码_Python设计模式 - UML - 用例图
  13. C语言-基础例题55道
  14. 车牌的归属地(省份和地级市) js
  15. 制作一个简单的通讯录
  16. LeetCode-618. 学生地理信息报告(困难)行转列
  17. Binarized Neural Network : BNN二值神经网络代码实例
  18. 训练一个图像分类器demo in PyTorch【学习笔记】
  19. 批量下载人像图片的技巧,POCO相册图片如何下载的方法
  20. 对抗样本论文学习:Deep Neural Networks are Easily Fooled

热门文章

  1. 超详细解析 | 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR
  2. 不想CRUD干到老,就来看看这篇OOM排查的实战案例!
  3. RabbitMQ 简介以及使用场景
  4. 医学顶刊BMJ打脸谷歌:AI取代医生检测乳腺癌还远着呢
  5. 清华博士接亲被要求现场写代码,新娘:提醒他吃饭的手艺不能忘!
  6. 【资源】Faster R-CNN原理及代码讲解电子书
  7. 计算机视觉 | 图像描述与注意力机制
  8. Linux内核网络栈1.2.13-af_inet.c概述
  9. Tornado自定义分布式session框架
  10. bs4库的prettify()方法|粉饰的意思。就是多了换行!