MySQL 8.0.29 instant DDL 数据腐化问题分析

MySQL - 数据定义语言(DDL)中的数据腐化问题分析 在MySQL中,数据定义语言(DDL)操作可以对数据库结构进行修改,包括创建、修改和删除表、索引、约束等。然而,如果DDL操作不正确地执行或在不当的时机执行,就可能导致数据腐化的问题。本文将探讨MySQL中DDL操作可能导致的数据腐化问题,并提供相关的源代码示例。总结起来,DDL操作在MySQL中是对数据库结构进行修改的重要手段,但需要注意其可能导致的数据腐化问题。在上述示例中,事务B会被事务A持有的锁阻塞,直到事务A完成DDL操作为止。在上述示例中,事务B尝试向已被事务A删除的orders表中插入数据。 阅读详情
  • 前言
  • Instant add or drop column的主线逻辑
  • 表定义的列顺序与row 存储列顺序阐述
  • 引入row版本的必要性
  • 数据腐化问题
  • 原因分析
  • Bug重现与解析
  • MySQL8.0.30修复方案

前言

DDL 相对于数据库的 DML 之类的其他操作,相对来说是比较耗时、相对重型的操作; 因此对业务的影比较严重。MySQL 从5.6版本开始一直在持续改进其DDL性能:引入了 online DDL,inplace DDL,instant DDL 等实用性极强的功能, DDL 目前对业务的影响持续降低。

MySQL 8.0.29 引入了 instant add/drop column 功能,支持在任意位置添加 column, drop column 也不需要表数据的任何形式的移动, 只需要修改表的元数据就可以完成 add/drop column,所以 instant add/drop column 的操作是轻型操作,速度快,资源需求量少。

ALTER table drop column a, ALGORITHM=INSTANT;

8.0.29 引入了新的alter 算法 INSTANT。

但是这个新功能目前很不稳定,导致的问题比较多; 而且通常都比较严重: 数据损坏,或者数据库无法启动等。

本文是分析其中的一个问题: 对表进行 instant drop 后,进行 update ,之后数据库停机,而后数据库无法启动。

为分析这个问题, 我们会从 instant add/drop column 在 Innodb 的实现原理与细节方面来阐述这个数据腐化bug的具体原因。

Instant add or drop column的主线逻辑

因为这个功能的WorkLog无法从官方获取,所以无法得到准确的设计出发点,通过阅读相关代码,得出要实现这个功能,必须要处理以下关键点:

  • 因为要支持在任意位置添加/删除列,同时不会更改表数据文件,所以表的逻辑定义与row的实际存储形式需要映射关系,不再是所见即所得的一一对应的关系。即为了实现这样功能:

    • 表中列的定义顺序与表中行数据(row)的存储顺序是不同的。
    • 同时对同一个table可以做多次instant DDL, 所以需要引入版本机制,在表的数据文件中,不同row对应的表定义可能是不同的,需要在row中记住表定义的version。

以上可以认为是该功能的设计原则与实现的主线逻辑。

表定义的列顺序与row 存储列顺序阐述

在引入这个功能之前, create table 时列定义的顺序与列在 InnoDB 中存储的顺序是一致的。(这里我们不用考虑 InnoDB 添加系统隐藏列)

Instant add/drop column 要实现的亮点功能是在表定义的任意位置添加或者减少 column,同时做这样的操作的时候,能够做到不需要重构表数据。

我们称 column 在表定义中出现的顺序为逻辑顺序;

而 column 在行数据的存储顺序为物理顺序。

要做到修改表定义,而不重构表数据,就必须将逻辑顺序与物理顺序解耦: 不能再像MySQL 8.0.29之前的版本那样,逻辑顺序与物理顺序是完全一致的;而从8.0.29开始通过表的元数据保存了逻辑顺序与物理顺序的映射关系。这种映射关系的构建与维护构成了 instant add/drop column 的基础.

如下图简单阐述了逻辑/物理顺序的关系。

image-20230612135907422

引入row版本的必要性

对于同一张表,Instant add/drop DDL可以执行多次;每一次执行后,逻辑/物理顺序的映射关系就发生变化;同时 instant add/drop DDL 并不需要做表数据的重构操作;因此可以得出经过多次 instant add/drop DDL,InnoDB存储的行数据与表定义存在多种逻辑/物理顺序映射关系:比如说,在 ibd 文件中,前十行数据对应原始的表定义,接下来的十行可能对应着 instant add column 后的数据,再接下来的十行,可能对应着 instant drop column 后的数据。

为了管理这种形式的逻辑/物理,在 InnoDB 中,为每一行实际存储的数据引入了版本号的概念:每个版本号对应着一个逻辑/物理映射关系。

为存储这个版本信息,InnoDB 中,row 的信息头记录的格式有稍微的变化:

图片

如上图所示,在row的extra中存储了其对应的版本号, 同时在 row header 中有标志位指示出了是否存在版本号信息。

根据版本号获取相应的映射关系,就可以正确的解析行数据。

目前版本号最大支持到64, instant add/drop column 到达这个限制后报错;其后如果还需要 instant add/drop column DDL 操作,可能需要做一次能够触发 table rebuild 操作才可以。

数据腐化问题

由 instant add/drop column 引入了多个数据腐化问题,其中一个问题可以从:

[PS-8292] MySQL 8.0.29 fails to perform crash recovery - Percona JIRA(https://jira.percona.com/browse/PS-8292) 查看。

这个问题简单来说:在对表进行 instant drop 后,进行update操作,之后MySQL server 重启,在启动阶段恢复之前的 update 操作会引发 assert 崩溃(debug版本的情况下)。

从代码上看,这个bug可能会造成数据的静默错误(数据完全错乱而且不报任何错误),而不仅仅是崩溃这一种现象。

通过对core文件的简单分析,造成该问题的大概原因如下:

在通过redo做恢复的时候,字段的逻辑顺序与物理存储顺序之间的映射关系不对(错位)导致的。在恢复期间可能会找不到对应的字段,或者更新了错误的字段。

原因分析

从原始的问题看,这个是发生在 InnoDB 启动恢复阶段。这一阶段离不开 redo log的参与。前面介绍 instant add/drop 设计要点的时候,那些列出的要点,可以认为是在在 DDL 期间的工作以及编码的基本逻辑;那么在完成 instant DDL 时候, 在 DML 的时候也需要将必要的信息写入 redo log 才能做到 recovery。

  • 为支持 instant add/drop column,redo log 记录的格式发生了变化,因为代码bug,导致在解析 redo log 做恢复的时候,得到的字段信息错误,导致数据腐化。
  • 问题表现出来可能是: 恢复始终无法执行,数据库无法启动;还可能是恢复到错误的数据,数据库能够启动。

因为 redo log 的种类较多,信息也比较繁杂,这里我们只关注问题本身中出现的 update 相关的 redo log ,进而较多的关注 update redo log 与该问题相关的字段信息。

下图简要的阐述了 update redo log 相关内容:

图片

到这里,可以看到 在MySQL 8.0.29中,update redo log 引入了 instant column 的物理逻辑顺序。

下面从 InnoDB 的恢复流程跟踪问题发生的原因,其中主要需要关注的是恢复过程中的表(索引)定义。

  • 应用 redo log 是在数据库启动阶段最开始就执行,此时数据字典无法打开,获取不到待恢复表的定义信息
  • 但是此时需要表的定义信息去解析 redo log 中的相关数据
  • 此时就会根据redo log中记录的长度信息,以及记录长度的顺序构建临时的表定义,此时仅仅是为了恢复,并不需要精确的表定义,此时只需要知道field的长度和位置即可。
  • 同时如果 redo log 中如果有instant DDL 的信息,那么也会用这些信息去修改临时构建的表定义:这是问题发生的初始错误的地方。
  • 恢复过程中,构建出的临时表实际上表中列的逻辑顺序,这是符合正常运行的需求的。
  • 但是实际上8.0.29中字段长度的记录顺序是按字段(列)的物理存储顺序写入的。
  • 如果带有 instant DDL 的信息,那么修改表定义时就会按物理顺序去修改逻辑顺序的表定义,这样会修改到非预期的字段,导致错误发生!

Bug重现与解析

CREATE TABLE `tb1` (
  `col1` VARCHAR(10) NOT NULL,
  `col2` char(13),
  `col3` varchar(11),
  PRIMARY KEY (`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO tb1  VALUES ('4000','50','100');
--echo # the FIRST INSTANT ALTER
ALTER TABLE tb1 DROP COLUMN col2, LOCK=DEFAULT;
INSERT INTO tb1  VALUES( '4545', '52' );
UPDATE tb1 SET col3 = '46' WHERE col1 = '4545';
--echo # crash and restart 1
--source include/kill_and_restart_mysqld.inc
CHECK TABLE tb1;
DROP TABLE tb1;

以上MySQL MTR 测例可以重现 InnoDB 启动恢复期间始终 core 的问题。我们从这个例子出发,结合上面解释的 instant drop DDL 代码行为看看问题是如何一步步发生的。

  1. 首先说明一下,在测例运行期间逻辑顺序与物理顺序的变化。 如下图所示稍微展示了 table 的逻辑定于与 InnoDB row 存储的以下细节。这里注意的是 被 dropped column 仍然会以隐藏列的形式存在于表定于中:因为 drop 之前存在的 row 还是需要这样信息解析字段。

图片

  1. 结合 redo log 的恢复过程看看问题发生的第一现场。这里针对这个测例摘取相关 redo log 的部分信息:

    图片

    2.1 按照字段长度列表(8.0.29中是物理顺序写入的列表)创建的专门用于恢复的表,类似于: create table dummy_table (d1:10, d2:13, d3:11)

    2.2 按照 instant 字段信息修改 dummy 表:按照 physical pos=1 去修改后,结果类似于:create table dummy_table (d1:10, d2:13[dropped], d3:11)

    2.3 期望的正确的表应该类似于:create table dummy_table(d1:10, d3:11, d2:13[dropped]);

    2.4 Redo log中的Field_no=1, 去恢复时期望用到的是 #2.3 的表,但是过程中创建的是#2.2中错误的表,这样当Field_no=1去恢复数据时,会错误的发现对应的field(column)已经dropped, 导致core!

MySQL8.0.30修复方案

知道了问题发生的原因,修复起来就比较简单了:

  • MySQL 8.0.30的代码修复方案

    • Redo log中字段的长度列表,按照字段的逻辑顺序写入,不再按存储顺序写入。
    • 在 redo log 的 instant column 信息中也包含了字段的逻辑位置。
    • Redo log 的记录本身的版本设置为 1 ,与8.0.29的版本为 0 ,做出差别。
    • 8.0.30的修复代码本身也是不能正确解析8.0.29产生的 redo log ,只是根据版本号检测出8.0.29 redo log,进而报错防止数据进一步恶化。实际上8.0.29的 redo log ,在 instant DDL 后,是不可能正确解析的,因为没有逻辑/物理的映射关系。
  • 修复的逻辑比较简单:

    • Redo log中字段的长度列表,按照字段的逻辑顺序写入:

      保证在恢复阶段构建的临时表是按正确的逻辑定义顺序构建的。

    • 在redo log 的 instant column 信息中也包含字段的逻辑位置:

      保证在更新临时表的字段时,按照逻辑顺序,不会出现错误更新的情况。

下面是MySQL 8.0.30 update redo log 相关字段信息:

图片

从上图可以看出,MySQL 8.0.30 redo log 中已经不存储物理位置相关的信息了,全部是逻辑位置相关的信息;这样就和MySQL 8.0.29 redo log 这种有问题的记录方式是昙花一现了。

附带的这个测例可以重现数据的静默错误(恢复过程没问题, 但是数据实际上错了)

CREATE TABLE `tb2` ( `c1` char(4) NOT NULL, `c2` char(4), `c3` char(4), PRIMARY KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
begin;
INSERT INTO tb2  VALUES ('1000','2000','3000');
commit;
--echo # the FIRST INSTANT ALTER
ALTER TABLE tb2 add COLUMN c4 char(4) after c1, LOCK=DEFAULT;
INSERT INTO tb2 VALUES ('1001','4001', '2001', '3001');
SELECT * FROM tb2;
UPDATE tb2 set c4='4002' WHERE c1='1001';
--echo # crash and restart 1
--source include/kill_and_restart_mysqld.inc
select * from tb2;
CHECK TABLE tb2;

需要把这个测例放到innodb test case suite中。


Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

社区2022年度勋章获奖名单: https://greatsql.cn/thread-184-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流:

image-20221030163217640

突发环境事件怎么模拟?用Python+GIS实现高斯烟团模型(附完整代码) 本文详细介绍了如何利用Python与GIS技术实现高斯烟团模型,用于模拟化工泄漏等突发环境事件的动态扩散过程。通过核心原理讲解、参数快速获取方案、Python代码实现及GIS可视化集成,为环境应急人员提供了一套完整的解决方案。特别适合危险品运输事故等瞬态污染场景的应急决策支持。 阅读详情

相关推荐

RTAB-map:实时高效的SLAM库

Real‐time appearance‐based mapping (RTAB‐Map)是一种基于外观的闭环检测方法,具有良好的内存管理,以满足处理大场景和在线长周期管理要求。RTAB‐Map集成了视觉和激光雷达SLAM方案,并支持目前绝大多数的传感器 是一个强大的、开源的Simultaneous Localization and Mapping(SLAM)库,专为机器人和无人驾驶领域设计。它提供了一套完整的解决方案,用于构建三维地图,并在未知环境中进行实时定位与导航。 github项目地址 RTAB-

weixin_45761399的博客 1万+

Mysql中INSTANT使用

在业务中因为业务表数据量过大,我们的项目一直用的是flyway跑数据库脚本,一次发布过程中想增加几个字段两个字段,脚本跑了一个小时都没有跑完,发现是用户数据量过大,只能暂停发布,以至于后来将数据库数据导表,新增字段,再导回来才解决发布的,后来也一直再查资料,发现了mysql的一个INSTANT算法,解决了数据量过大,新增数据库属性锁表时间过长的问题,以此记录。旧算法: algorithm=INPLACE;新算法: algorithm=INSTANT;使用方式:直接在sql后面追加即可。

weixin_61947390的博客 1480

STC51单片机串口多字节数据接收的优化策略

本文深入探讨了STC51单片机串口多字节数据接收的优化策略。针对数据丢包、粘包等常见痛点,核心思路是采用“缓冲队列+定时器超时”模式,将实时处理转变为“先收纳,后处理”。文章详细讲解了硬件初始化、中断服务程序优化(快速入队与激活超时裁判)以及主循环的非阻塞设计,并进阶介绍了环形缓冲区实现与错误处理,旨在构建稳定可靠的串口通信系统。

weixin_29264201的博客 374

MySQL 8.0 新特性之 DDL 即时加列

8.0 DDL 即时加列以及次数限制

Tony_stark_L的博客 2138

说说通用报表控件

我们已经开发有2款WINCC报表控件,一种是固定模板,一种是自定义模板。但是它们有个共同特点,就是数据都是来自WINCC的归档数据库。使用WINCC归档数据库的好处是不需要自己写脚本保存数据。但是有些情况下,我们需要自己保存数据,或者第三方系统通过数据表的方式给我们提供数据。那这样的话,我们之前的两款控件就不支持了。正好有个客户有类似需要,于是加了一天班写了个通用报表控件。之所以说是通用,是因为它可以插入任何支持.NET控件的组态软件中,比如WINCC、IFIX等。并且它不依赖于组态软件自己...

HwLib_的博客 3551

检索生成(RAG) vs 长文本大模型:实际应用中如何选择?

大模型的上下文理解能力直接影响到 LLMs 在复杂任务和长对话中的表现。本期内容聚焦于两种主流技术:长上下文(Large Context Windows)和检索增强生成(RAG)。这两种技术各有何优势?在实际应用中,我们又该如何权衡选择?文章不仅详细阐述了这两种技术的工作原理,还深入分析了它们在效率、准确性和实施成本等方面的差异。文章特别提到了在执行重复性任务时使用 Context Caching 优化长上下文的优势,然而,缓存策略的效果很大程度上取决于提示词的可预测性。

2401_85782938的博客 1255

MySQL · 引擎特性 · 8.0 Instant Add Column功能解析

介绍Mysql 8.0 Istant 算法

weixin_70037448的博客 1416

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1684

8.0 新特性 - Instant Add Column

MySQL 8.0.12 版本支持 “快速加列” 功能,既添加字段时可以支持 “INSTANT” 快速完成。通过只修改数据字典的方法来实现大表快速加列,避免之前加列操作必须做的数据拷贝,从而大幅缩小大表加列所需的时间,减少对系统的影响。最开始的快速加列只能将列加在表中的末尾,随着该特性的不断完善,在 MySQL 8.0.29 中增加了在表的任何位置添加(或删除)列功能。MySQL 版本 8.0.12 及以上腾讯云内核版本 MySQL 5.7 20190830 及以上。

分享既学习 2018

一个中科大差生的8年程序员工作总结

今年终于从大菊花厂离职了,离职前收入大概60w不到吧,在某乎属于比较差的,今天终于有空写一下自己的职场故事,也算是给自己近8年的程序员工作做个总结复盘。近8年有些事情做对了,也有更多事情做错了,在这里记录一下,希望能够给后人一些帮助吧,也欢迎私信交流。文笔不好,见谅,有些细节记不清了,如果有出入,就当是我编的这个故事吧。 PS:有几个问题先在这里解释一下,评论就不一一回复了 1、关于差生,我本人在科大时确实成绩偏下,差生主要讲这一点,没其他意思。 2、因为买房是我人生中的大事,我认为需要记录和总结一下

陈小房的自我修炼 5万+

【ComfyUI】QwenImageEdit OOTD角色与姿态匹配换装

本文介绍了一个基于Qwen Edit OOTD 2.0的ComfyUI工作流,能够实现角色与姿态匹配的智能穿搭生成。该工作流通过整合模型推理、姿态识别、图像拼接和渲染等节点,完成从角色图、姿态图到成品穿搭图的完整生成流程。核心采用Qwen Image系列模型进行图像理解和编辑,配合ControlNet进行姿态引导。用户只需提供角色图和姿态参考图,系统即可自动完成姿态解析、语义编码、采样生成等步骤,输出与输入姿态一致的穿搭图像。该方案适用于虚拟角色展示、电商试穿等场景,能保持角色特征一致的同时灵活变换姿态,显

Mr数据杨 1586

Mysql-场景篇-2-线上高频访问的Mysql表,如何在线修改表结构影响最小?-2--Mysql8.0的INSTANT DDL实现原理

MySQL 8.0的INSTANT DDL通过仅修改元数据和动态解析历史数据,解决了传统DDL的锁表和性能问题。其核心在于:1、元数据版本管理:兼容不同版本的表结构。2、默认值填充:保障新增列的数据完整性。3、列隐藏与物理位置:逻辑删除列而非物理删除。这种设计使得DDL操作几乎不阻塞业务,且资源消耗极低,特别适合高频写入和大数据量场景。然而,其功能受限于操作类型和存储引擎,需根据实际需求选择是否使用。

weisian的博客 3万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

GreatSQL社区与Amazon、Facebook、Tencent共同被MySQL致谢

发现在 MySQL 8.0.29 中,如果一个 MySQL 表具有在 8.0.29 版本之前添加的 INSTANT ADD 列(从该版本开始不允许),并且在 MySQL 升级到高于 8.0.29 的版本后,对这些表执行 DML 语句将导致服务器意外关闭。GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

GreatSQL2021的博客 213

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

频繁改表的架构根源:业务领域拆分与 NoSQL 存储迁移决策框架

本文是《MySQL 表结构安全变更:DDL 锁表规避与 JSON 柔性扩展实战方案》的姊妹篇。 两篇定位区分:上篇解决"今天这张表怎么安全加字段"(战术执行),本篇回答"明天怎么不再这么频繁加字段"(战略根治)。建议先掌握上篇的具体操作,再通过本篇建立全局架构视野。

一线 Java 开发,专注 Java 核心原理、生产踩坑与架构面试实战。 1104

mysql8.0版本使用instant ddl方式增加列、xbk备份失败记录

【代码】mysql8.0版本使用instant ddl方式增加列、xbk备份失败记录。

m0_66522805的博客 665

一文为你解读MySQL8.0 Instant DDL源码实现

MySQL 8.0.12版本引入了INSTANT(即时)算法,对部分ADD COLUMN操作,不再修改用户原有数据,只需对表元信息进行修改。

华为云官方博客 1633

【漏洞提示】MySQL8.0.29因重大bug官网已下架

前阵子,MySQL官网已经将 MySQL 8.0.29版本下架。据悉下架原因是由于MySQL 8.0.29 存在关于InnoDB解释器的重大Bug。而最新版本 8.0.30及以上的版本已修复此漏洞。

fashion的博客 2432

mysql数据量大增加字段_MySQL 8.0.19亿级数据如何秒速增加字段?

概述今天主要介绍一下MySQL 8.0.19 instant add column的新特性,基于亿级数据秒速增加字段,下面一起来看看吧~一、MySQL DDL 的方法MySQL 在大型表上的 DDL 会带来耗时较久、负载较高、额外空间占用、MDL、主从同步延时等情况。需要特别引起重视,而MySQL 的 DDL 有很多种方法。MySQL 本身自带三种方法,分别是:copy、inplace、insta...

weixin_33564130的博客 4700

mysql8 Instant DDL 中间位置添加列

MySQL 8.0.29版本可以在任何地方添加列,而且是Instant,这个是个好特性

xuejianxinokok的专栏 816

MySQL 8.0 的魔法:即刻列操作——再也不用等待了

在MySQL 8.0.12版本之后我们不用为大表添加列问题担心了,然后MySQL 8.0.28版本之后我们不用为大表删除列而担心了。

fofcn的专栏 1565

【mysql章节一】online DDL

mysql DDL 分为copy(非online方式)和inplace(5.6版本引入)、instant(8.0+版本引入)方式,其中inplace又分为rebuild和non-rebuild。

hezhenwu123的博客 1083

MySQL 8.0中新增的功能(二)

默认情况下,表继承所创建的模式或通用表空间的加密设置。否则,这些设置将用于计算innodb_redo_log_capacity设置(innodb_log_files_in_group * innodb_log_file_size = innodb_redo_log_capacity)。被移除的计数器包括:undo_truncate_sweep_count、undo_truncate_sweep_usec、undo_truncate_flush_count和undo_truncate_flush_usec。

hay23455的博客 1865

MySQL 8.0.xx InnoDB引擎-高效添加表新字段原理剖析

背景 MySQL 5.6是 第一个支持INPLACE DDL的版本。在MySQL 5.6之前,执行DDL的唯一方法是逐行复制行。 INPLACE DDL主要由InnoDB处理,而逐行COPY在服务器层处理。直到8.0(请参阅实验版本),InnoDB甚至通过为INPLACE DDL算法重建表来向表中添加列。 1、对于大型表,可能要花费很长时间,尤其是在复制环境中。 2、磁盘空间需求将增加一倍以上,大小与现有表大致相同。 3、DDL操作占用资源,并且对CPU,内存和IO提出了很高的要求,这从用户事务中争夺资源。

JackieJia的博客 1971

新特性解读 | MySQL8.0 ALTER TABLE … ALGORITHM=INSTANT

作者:张娜爱可生南区DBA组成员,负责MySQL、TiDB日常维护、故障处理。本文来源:原创投稿* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。一、前言MySQL 8.0.29 之前,在线 DDL 操作中即时添加列只能添加在表的最后一列,对于在某个具体列后面快速添加列很不方便,MySQL 8.0.29 扩展了对 ALTER TABLE … ALGORITHM=INS...

杨建荣的学习笔记 770

xtrabackup备份报错Found tables with row versions due to INSTANT ADD DROP columns

备份失败,查看日志报错:2024-04-07T03:00:04.420147+08:00 0 [ERROR] [MY-011825] [Xtrabackup] Found tables with row versions due to INSTANT ADD/DROP columns2024-04-07T03:00:04.420242+08:00 0 [ERROR] [MY-011825] [Xtrabackup] This feature is not stable and will cause back

雅冰石的专栏 1379
上一篇: openEuler22+GreatSQL+dbops玩转MGR
下一篇: 图文结合带你搞懂GreatSQL体系架构
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值