首页 > 数据库 >MySQL数据库8.0.29-8.0.31版本使用 INSTANT 算法新增字段bug

MySQL数据库8.0.29-8.0.31版本使用 INSTANT 算法新增字段bug

时间:2023-07-05 15:01:30浏览次数:56  
标签:8.0 INSTANT 数据库 29 隐患 算法 MySQL

xxx下发MySQL数据库共性隐患排查通知,要求统一排查MySQL数据库8.0.29及以后版本使用 INSTANT 算法新增字段后期变更回滚可能导致数据库宕机的隐患,排查方法及整改方法详见下表和附件。

请各分支()数据库运营人员集中排查隐患,及时整改。
 

隐患概述 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日
其他排查要求:无

标签:8.0,INSTANT,数据库,29,隐患,算法,MySQL
From: https://www.cnblogs.com/harda/p/17528512.html

相关文章

  • 6.29 celery分布式异步任务框架
    1.celery:分步式异步任务框架 /1 异步任务/2 延迟任务/3 定时任务/4 celery架构消息中间件(broker):消息队列:可以使用redis,rabbitmq任务执行单元(worker):执行单元执行提交的任务任务执行结果存储(banckend):可以使用mysql,redis/5安装celery模块:cmd中......
  • 【安全学习之路】Day29
    ......
  • 【8.0】前端基础之JavaScript引入
    【8.0】前端基础之JavaScript引入【一】什么是JavaScriptjs也是一门编程语言,他可以写后端代码JavaScript想一统天下,前后端都写于是node.js支持JS代码跑在后端服务器上但是并不能完美的实现JavaScript和Java一毛钱关系都没有,纯粹是为了蹭Java的热度【二】JavaScrip......
  • 洛谷CF29B题解
    CF29B交通信号灯传送门题目很好理解,这里就不多说了,思路都在代码里#include<bits/stdc++.h>usingnamespacestd;doublel,d,v,g,r;intmain(){ cout<<fixed<<setprecision(8);//重置输出方式(保留8位小数) cin>>l>>d>>v>>g>>r; if(l<=d)cout<<......
  • [LOJ 6029]「雅礼集训 2017 Day1」市场 题解
    这道题恶心之处在于区间向下取整。这里给出两种思路:区间覆盖做法如果最大值和最小值向下取整后相等,则对此区间进行区间覆盖。我考场写的是这个,但是码错了,加上习惯不好,\(100\to64\),再加上烦了弱智错误,\(64\to9\),不给出代码。差值相等做法注意到相邻两数的向下取整的差值不......
  • 29.初始化和赋值的区别
    在C++中,初始化和赋值是两个不同的概念。  需要注意的是,对于某些类型的变量,初始化和赋值的效果是一样的。例如,对于基本类型的变量,使用等号进行初始化和赋值的效果是一样的。但是对于一些复杂类型的变量,如类对象,初始化和赋值的效果是不同的。在这种情况下,初始化会调用类的构造函......
  • Codeforces 293B Distinct Paths
    发现\(n,m\)的数据范围是假的,因为每一步一个颜色最多也就\(k\le10\)种颜色,所以当\(n+m-1>k\)时一定无解。接下来发现这个数据范围挺小的,考虑状压,设\(f_{x,y}\)为走到\((x,y)\)点所用的颜色的集合,其可以由\(f_{x-1,y},f_{x,y-1}\)推来。然后就可以......
  • 冲刺国赛模拟 29
    牛子老师问我为什么\[\lim_{x\to\infty}\sqrt{\frac{x^3}{x-1}}-x=\frac12\]wolframalpha告诉我直接Laurent级数展开发现没有正项。于是你如果加个\(a\)直接泰勒展开事实上会发现是个无穷项。这个东西和拉马努金的那个“所有自然数加和是\(-\dfrac1{12}\)”的结论好......
  • 29. Spring boot 文件上传(多文件上传)【从零开始学Spring Boot】
    文件上传主要分以下几个步骤:(1)新建mavenjavaproject;(2)在pom.xml加入相应依赖;(3)新建一个表单页面(这里使用thymeleaf);(4)编写controller;(5)测试;(6)对上传的文件做一些限制;(7)多文件上传实现(1)新建mavenjavaproject新建一个名称为spring-boot-fileuploadmavenjava项目;(2)在pom.xml......
  • OGG-02912 Patch 17030189 is required on your Oracle mining database for trail fo
    Therewillbeascript"prvtlmpg.plb"undergghomedirectory[oracle@OGGR2-1ogg]$ls-lrtprvtlmpg.plb-rw-r-----1oracleoinstall9487May272015prvtlmpg.plb[oracle@OGGR2-1ogg]$pwd/ogg[oracle@OGGR2-1ogg]$Logintothedatabaseand......