[转帖]MySQL数据库8.0.29-8.0.31版本使用 INSTANT 算法新增字段bug
https://www.cnblogs.com/harda/p/17528512.html
请各分支()数据库运营人员集中排查隐患,及时整改。
隐患概述 | MySQL数据库8.0.29及以后版本使用 INSTANT 算法新增字段后期变更回滚可能导致数据库宕机的隐患 |
隐患案例 | 2023年1月6日XX公司ERP类资产管理系统某MySQL数据库(8.0.30),业务在对一个表做Update SQL的事务并手动执行事务回滚时,触发了一个未知bug导致数据库主节点宕机,数据库主从高可用切换后,依然命中这个bug,继续导致数据库新主节点宕机,对业务造成重大影响,该数据库承载的ERP类资产管理系统业务全部中断。 |
隐患说明 | 一、隐患锚点: MySQL 8.0 有一个新特性,使得对表DDL操作可以及时生效,即online ddl instant算法,该算法在8.0.12上成为alter table add column的默认算法。但这个新特性存在一定潜在隐患,原因是 MySQL 官方 8.0.29 版本开始为了更多 DDL 支持使用 instant 算法引入了一种设计缺陷,此缺陷会导致数据库数据块损坏。目前官方暂时未披露,我们对此 Bug 已向官方反馈了 bug report,包含了模拟步骤。 二、隐患场景: 在MySQL 8.0.27版本的数据库上新建了一个表,并在这个表上做了增加字段的操作,默认采用的是instant算法。因为安全漏洞需要及时修复的原因,数据库升级到了8.0.30,对该表已经存在的1行记录进行“更新操作(update)和回滚操作(rollback)”的事务处理,MySQL数据库就宕机了,且通过常规操作无法启动该数据库。小结为:对曾经使用instant算法做过add column操作的表进行“update 和rollback”事务,可能会触发数据库宕机。 三、隐患机理: 一个执行 Update SQL 的事务回滚时,由于原记录头信息中的 REC_INFO_VERSION_FLAG 标志位错误,导致计算出来的原记录长度过大,有一定几率MySQL 认为数据页的剩余空间不能容纳这条记录,就会触发断言bug导致 MySQL 宕机。 原记录头信息中的 REC_INFO_VERSION_FLAG 标志位错误,导致计算出来的原记录长度过大,这个是触发bug导致MySQL宕机的必要非充分条件,若MySQL 认为数据页的剩余空间能容纳这条记录,则不会触发bug断言和导致 MySQL 宕机。 隐患机理理解,见下文附件: 隐患机理理解.txt 隐患机理分析,见下文附件: MySQL Crash分析.docx |
防范建议 | 1.针对锚点: 对于MySQL 8.0.x版本的数据库,规范使用online ddl算法。在修改数据库表结构的DDL语句中,建议使用如下语句,明确指示DDL语句生效算法:"ALTER TABLE tbl_name xxx , ALGORITHM=INPLACE, LOCK=NONE;"避免使用(ALGORITHM=INSTANT,或者ALGORITHM=DEFAULT(包含省略这个语句))。 2.针对场景: 规避update和rollback同时使用。对曾经使用instant算法做过add colum表进行update 操作或者事务时,避免进行rollback操作或者事务。 3.针对机理: 业务开发过程中,对新插入的一行记录,把该记录所有INSTANT 字段值都设置为非默认值,确保REC_INFO_VERSION_FLAG 标志位值就是正确的。使用 INSTANT 算法新增的字段,默认保持设置为 NULL,INSERT 语句插入记录时,需要把所有 INSTANT 字段值都设置为非默认值,这样一来,插入记录的 REC_INFO_VERSION_FLAG 标志位值就是正确的。这种方法需要修改业务代码。 4.针对历史: 重整表空间,使得采用instant算法新增的字段和初始建表时的其他字段无差别。使用 INSTANT 算法新增字段之后,在业务低峰期,通过以下 SQL 整理表空间,把 INSTANT 字段转换为非 INSTANT 字段:“alter table tablename engine = InnoDB;”。 5、针对Bug: 该Bug在2023年1月17日发布的MySQL8.0.32上已修复,可以适时升级至该版本(备注,该版本可能无法使用extrabackup工具进行数据库备份,近4个月内建议慎重选择)。 |
操作说明 | 1、排查版本: Select version(); 结果:8.0.29及以上版本均受影响,需要排查锚点和历史情况。 2、排查锚点和历史情况: 在8.0.12-8.0.28版本使用下列语句查找: Select Name from INFORMATION_SCHEMA.INNODB_TABLES where INSTANT_COLS > 0 ; 在8.0.29及以后版本使用下列语句查找: Select Name from INFORMATION_SCHEMA.INNODB_TABLES where TOTAL_ROW_VERSIONS > 0 Union Select Name from INFORMATION_SCHEMA.INNODB_TABLES where INSTANT_COLS > 0; 结果:查询出来的表名表示这些表曾经使用instant算法快速加列或者删列。可按照防范建议第4点进行处理 |
排查要求 | 建议排查范围:IT公司&省公司 |
整改完成时限:2023年02月28日 | |
其他排查要求:无 |
[转帖]MySQL数据库8.0.29-8.0.31版本使用 INSTANT 算法新增字段bug的更多相关文章
- [转帖]mysql数据库主从配置
mysql数据库主从配置 https://www.toutiao.com/i6680489302947791371/ 多做实验 其实挺简单的 很多东西 要提高自信 去折腾. 架构与我 2019-04- ...
- VBA连接MySQL数据库以及ODBC的配置(ODBC版本和MySQL版本如果不匹配会出现驱动和应用程序的错误)
db_connected = False '获取数据库连接设置dsn_name = Trim(Worksheets("加载策略").Cells(2, 5).Value) ---- ...
- mybatis用mysql数据库自增主键,插入一条记录返回新增记录的自增主键ID
今天在敲代码的时候遇到一个问题,就是往数据库里插入一条记录后需要返回这个新增记录的ID(自增主键), 公司框架用的是mybatis的通用Mapper接口,里面的插入方法貌似是不能把新纪录的ID回填到对 ...
- 编译Qt5.0连接MySql5.5数据库的驱动(5.0版本的编译,我记得5.2开始自带了)
第一步 1.准备好Mysql数据库安装文件,Qt5.0完整的离线安装包,以及Qt5.0的完整的源代码.安装好程序,假设Mysql的安装路径为:C:\MySQL5.5,Qt5.0的安装路径:C:\Qt\ ...
- Tornado WEB服务器框架 Epoll-- 【Mysql数据库】
5.1 数据库 与Django框架相比,Tornado没有自带ORM,对于数据库需要自己去适配.我们使用MySQL数据库. 在Tornado3.0版本以前提供tornado.database模块用来操 ...
- MySQL升级5.7.29
采用卸载后升级的方式 参考:https://blog.csdn.net/liu_dong_mei_mei/article/details/104010567 1.卸载原有的MySQL: 之前是wind ...
- MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
文/何登成 导读: 来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...
- MySQL数据库分布式事务XA优缺点与改进方案
1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...
- Docker安装Mysql数据库容器(zz)
zz自:http://blog.csdn.net/chengxuyuanyonghu/article/details/54380032 1.下载mysql的镜像: sudo docker pull m ...
- phpMyAdmin访问远程MySQL数据库的方法
本地phpmyadmin远程连接服务器端MySQL 首先要确定你的mysql远程连接已开启,如果没有开启按照下面的二个方法操作: 方法一:改表法 因为在linux环境下,默认是关闭3306端口远程连接 ...
随机推荐
- 技本功|Hive优化之建表配置参数调优(一)
简介: Hive是大数据领域常用的组件之一,主要用于大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中是经常涉及的一个点,因此掌握一些Hive调优是必不可少的一项技能.影响Hive效率的主 ...
- echo详解
linux下echo命令详解 linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法 echo命令的功能是在显示器上 ...
- P9344 去年天气旧亭台 代码
不带滚动数组代码: #include <iostream> #include <cstdio> #include <cstring> #define int lon ...
- Salesforce LWC学习(四十六) record-picker组件浅谈
本篇参考: https://developer.salesforce.com/docs/platform/lwc/guide/reference-graphql.html https://develo ...
- 完蛋,我被挖矿木马包围了|使用 TLS 连接 Docker
事故还原 近日,白泽在使用 docker 的时候,开放了防火墙的端口,以 SSH 方式访问远程服务器的 docker 守护进程(无需使用密钥即可建立连接),随后竟遭到了挖矿木马的攻击,好一顿折腾之后, ...
- 【华为云技术分享】解密如何使用昇腾AI计算解决方案构建业务引擎
摘要:昇腾AI计算解决方案以极致算力,端边云融合.全栈创新,开放生态的硬核实力.用户可以使用标准的Matrix接口实现业务引擎,对外释放昇腾AI加速能力. 从卷积神经网络中的矩阵乘法(GEMM)说起 ...
- 低代码开发不靠谱?看低代码开发在物联网APP开发中的应用
摘要:云编排式物联APP开发平台可通过云端可视化编排开发,边端远程自动化部署,云边协同管理运维的方式,实现物联网APP快速开发,海量边端应用管理. 0 引言 当前,物联网技术正在推动人类社会从&quo ...
- CoralCache:一个提高微服务可用性的中间件
摘要:当数据库出问题时能降级从本地缓存的数据中查询数据,CoralCache就是这样一个提高微服务可用性的中间件. 背景 有些场景下,微服务依赖数据库中一些配置项或者数量很少的数据,但当数据库本身有问 ...
- 华为AppCube通过中国信通院“低代码开发平台通用能力要求”评估!
摘要:华为AppCube应用魔方顺利通过信通院评估,被认证为具备 "低代码开发平台通用能力"的企业服务平台. 本文分享自华为云社区<华为AppCube通过中国信通院" ...
- iOS打包IPA教程
转载:xcode打包导出ipa 众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果 IPA,作为刚接触ios开发的同学,只是学习ios app开发内测,并没有上架appstore需 ...