MySQL 执行 Online DDL 操作报错空间不足?

闯祸了,生产环境执行了DDL操作《死磕MySQL系列 十四》 由于业务随着时间不停的改变,起初的表结构设计已经满足不了如今的需求,这时你是不是想那就加字段呗!加字段也是个艺术活,接下来由本文的主人咔咔给你吹。 试想一下这个场景 事务A在执行一个非常大的查询 事务B毫不犹豫的执行了DDL操作 接下来会发生什么,你如果已经知道答案的话恭喜你又掌握了一个MySQL中重要的知识点。 事务A执行查询时会持有MDL锁,而事务B同样也需要MDL锁,但事务A在进行大查询,所以导致事务B后的所有操作都会被堵塞。 这时你应该知道了在MySQL中所有对表的增删改查都需要申请MDL读锁。 接 阅读详情

在 MySQL 中执行 Online DDL 之前,需要保证在三个方面的空间充足。

作者:徐文梁,爱可生 DBA 成员,一个执着于技术的数据库工程师,主要负责数据库日常运维工作。擅长 MySQL,Redis 及其他常见数据库也有涉猎;喜欢垂钓,看书,看风景,结交新朋友。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 1400 字,预计阅读需要 4 分钟。

问题背景

客户反馈对某张表执行 alter table table_name engine=innodb; 时报错空间不足。

通过登录数据库查看客户的 tmpdir 设置的路径,发现是 /tmp。该目录磁盘空间本身较小,调整 tmpdir 的路径与数据目录相同,重新执行 ALTER 操作执行成功。

问题到此结束了,但是故事并没有结束。通过查看官网信息,我们可以从这个小小的报错中深挖更多信息。

信息解读

从官网的论述中,我们可以了解到,在进行 Online DDL 操作时,需要保证以下三个方面的空间充足,否则可能会导致空间不足报错。

临时日志文件

当进行 Online DDL 操作创建索引或者更改表时,临时日志文件会记录期间的并发 DML 操作,临时日志文件最大值由 innodb_online_alter_log_max_size 参数控制,如果 Online DDL 操作耗时较长(如果表数据量较大这是很有可能的),并且期间并发 DML 对表中的记录修改较多,则可能导致临时日志文件大小超过 innodb_online_alter_log_max_size 值,从而引发 DB_ONLINE_LOG_TOO_BIG 错误,并回滚未提交的并发 DML 操作。

临时排序文件

对于会重建表的 Online DDL 操作,在创建索引期间,会将临时排序文件写入到 MySQL 的临时目录。仅考虑 UNIX 系统,对应的参数为 _tmpdir_,如果 /tmp 目录比较小,请设置该参数为其他目录,否则可能会因为无法容纳排序文件而导致 Online DDL 失败。

中间表文件

对于会重建表的 Online DDL 操作,会在与原始表相同的目录中创建一个临时中间表文件,中间表文件可能需要与原始表大小相等的空间。中间表文件名以 #sql-ib 前缀开头,仅在 Online DDL 操作期间短暂出现。

前置准备

针对官网的论述,我们可以进行实际测试,这里对临时排序文件和中间表文件场景进行测试,为了故事更好的发展,先做一些准备工作:

1. 创建一个测试库

数据目录对应为 /opt/mysql/data/3310/my_test。

create database my_test;

2. 限制数据目录大小

#创建一个指定大小的磁盘镜像文件,这里为 600M
dd if=/dev/zero of=/root/test.img bs=60M count=10

#挂载设备
losetup /dev/loop0 /root/test.img

#格式化设备
mkfs.ext3 /dev/loop0

#挂载为文件夹,则限制其文件夹空间大小为 600M
mount -t ext3 /dev/loop0 /opt/mysql/data/3310/my_test

#修改属组为 MySQL 服务对应用户
chown -R mysql.mysql /opt/mysql/data/3310/my_test

3. 创建一张测试表

CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`score` int(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4. 插入一些数据

注意:数据量不要太小,小于 /opt/mysql/data/3310/my_test 目录的一半,建议 30% 左右。

./mysql_random_data_load -h127.0.0.1 -P3310 -uuniverse_op -p'xxx' --max-threads=8 my_test student 1500000

5. 修改 /tmp 大小

这里 tmpdir 目录为 /tmp,修改 /tmp 大小为一个较小值。

mount -o remount,size=1M tmpfs /tmp

6. 修改其他参数

修改 tmp_table_size 和 max_heap_table_size 值为较小值,这里仅仅为了便于生成磁盘临时文件,生产环境不建议,会严重影响性能。

set sort_buffer_size=128*1024;
set tmp_table_size=128*1024;

场景测试

登录数据库执行如下操作,可以观察到添加索引失败,报错信息如下:

mysql> alter table student add  idx_name index(name);
ERROR 1878 (HY000): Temporary file write failure.

执行如下操作修改 /tmp 目录大小,再次执行 ALTER 操作成功。

[root@localhost ~]# mount -o remount,size=500M tmpfs /tmp
mysql> alter table student add index(name);
Query OK, 0 rows affected (4.92 sec)
Records: 0 Duplicates: 0 Warnings: 0

观察 /opt/mysql/data/3310/my_test 目录已使用空间,如果使用率较低,建议继续插入数据到磁盘空间使用率超过 50%

执行如下操作,会报如下错误:

mysql> alter table student engine=innodb;
ERROR 1114 (HY000): The table 'student' is full

问题总结

好了,最后总结一下。为了我们的 Online DDL 操作顺利进行,需要注意以下几点:

  1. 在进行操作前,记得先检查 innodb_online_alter_log_max_size 值,预估下是否需要修改。

    可以直接修改为一个较大值,但是没有百分百的好事,坏处就是如果业务在 DDL 操作期间并发 DML 修改记录较多,Online DDL 结束时锁定表以应用记录的 DML 时间会增加。所以,选择好时机很重要,在对的时间做对的事,当然是在业务低峰期,或者考虑工具吧(pt-osc 或 ghost)。

  2. 在安装实例时即设置 tmpdir 为合理的值。

    温馨提示,该值不支持动态修改,真出现问题就晚了,毕竟生产上不允许随便重启服务的。

  3. 及时关注磁盘空间。

    不要等到磁盘空间快满了才想着通过 Online DDL 操作进行碎片空间清理。例如 optimize table table_name;,alter table table_name engine=innodb; 等操作。这些操作本身也是需要额外的空间的,等待你的可能是 FAILURE。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
光伏逆变器在环测试解决方案 光伏行业是利用太阳能光辐射将其转化为可用电能的行业。近年来,为应对气候变化和能源安全等挑战,全球对清洁能源的需求不断增长。太阳能作为最具潜力和可再生的能源之一,被视为替代传统化石能源的重要选择,光伏行业因此得到了迅猛发展,并在全球范围内得到了广泛应用。许多国家和地区都将光伏技术作为关键的能源发展方向。尤其是在新兴和发展中国家,光伏发电具有巨大的增长潜力,将成为未来市场竞争的重点。随着规模化生产的推进,光伏组件的制造成本不断降低。 阅读详情

相关推荐

宽带阻抗匹配的工程实现-第一步,端口驻波仿真

其实阻抗匹配我工作以来经常说,也经常做,但是基本上都是直接在印制板上进行调试。现在想先用仿真软件直接设计出来,才发现很多东西嘴上说容易,想做出来太难了。所以准备写一些文章,记录一下碰到的问题。

pp_0604的博客 2375

MySQL Online DDL空间不足问题解析与优化

数据库表结构变更是DBA日常工作中的重要任务,MySQL的Online DDL特性允许在不锁表的情况下执行ALTER操作,大幅提升业务连续性。其核心原理是通过临时文件记录变更期间的DML操作,涉及排序缓冲区、日志缓冲区和临时表空间三大组件。在工程实践中,合理配置tmpdir目录、innodb_online_alter_log_max_size等参数尤为关键,特别是处理大型电商订单表等高并发场景时。本文深入解析空间不足报错的根本原因,并提供从参数调优到使用pt-online-schema-change工具的全

weixin_33423874的博客 322

RK3588S开发板实战:手把手教你调试IMX415摄像头(附常见问题排查)

本文提供了基于RK3588S开发板调试IMX415摄像头的完整实战指南。从硬件连接到软件配置,详细解析了设备树(DTS)设置、驱动加载验证及V4L2工具链使用,并附带了常见问题排查方法,帮助开发者快速解决摄像头调试中的典型问题,实现图像采集与性能调优。

assembly8low的博客 592

MySQL Online DDL详解:从历史演进到原理及使用

在 MySQL 5.6 中,官方开始支持更多的 ALTER TABLE 类型操作来避免数据拷贝,同时支持了在线上 DDL 的过程中不阻塞 DML 操作,真正意义上的实现了 Online DDL。然而并不是所有的 DDL 操作都支持在线操作,后面会附上 MySQL 官方文档对于 DDL 操作的总结。到了 MySQL 5.7,在 5.6 的基础上又增加了一些新的特性,比如:增加了重命名索引支持,支持了数值类型长度的增大和减小,支持了 VARCHAR 类型的在线增大等。

码到三十五 14万+

手把手教你用Cadence Virtuoso设计折叠式共源共栅放大器(0.18μm工艺实战)

本文详细介绍了在0.18μm工艺下使用Cadence Virtuoso设计折叠式共源共栅放大器的完整流程。从工艺参数获取、电路架构分析到具体参数计算和仿真验证,提供了实战设计指南,帮助工程师掌握这一模拟IC设计中的关键技术,特别适合需要中等增益和较大输出摆幅的应用场景。

open4的博客 405

还在手敲LaTeX公式?用Rime小狼毫打造你的专属数学输入法(附完整配置包)

本文介绍如何利用Rime小狼毫输入法引擎打造专属数学公式输入方案,显著提升LaTeX公式输入效率。通过详细配置教程和智能补全技巧,帮助科研人员和学生实现3-5倍的输入速度提升,特别适合学术写作和技术文档创作场景。

weixin_32520601的博客 282

mysql online_详谈 MySQL Online DDL

作为一名DBA,对数据库进行DDL操作非常多,如添加索引,添加字段等等。对于MySQL数据库,DDL支持的并不是很好,一不留心就导致了全表被锁,经常搞得刚入门小伙伴很郁闷又无辜,不是说MySQL支持Online DDL么,不是说不会锁表的么?是的,令人高兴的是从MySQL5.6开始就支持部分DDL Online操作了,但并不是全部喔,今天这里就对我们常用的DDL进行总结和说明,让操作DDL的小伙伴...

weixin_32089639的博客 530

基于 STM32 的智能水表流量计设计与实现 —— 数据采集与远程传输

本文设计的基于 STM32 的智能水表流量计通过霍尔传感器实现流量采集,结合 STM32 的处理能力完成数据计算、存储与远程传输,具备计量精准、功耗低、可远程监控等特点。未来可优化方向:引入低功耗模式延长电池寿命,增加水质检测模块实现多参数监测,提升水务管理智能化水平。

weixin_42300449的博客 1027

【MySQL】Online DDL详解

我这一个表有1T的数据,这时我想给这个表加一个列,如果才能最大程度不影响业务呢?

http://DBAtao.cn/ 2万+

FastGPT智能体开发:FastGPT OpenAPI 知识库接口

FastGPT OpenAPI 知识库接口

王国平的博客 323

【WRF安装】WRF环境配置移植详细说明

【WRF安装】WRF环境配置移植详细说明

WW、forever的博客 819

Mysql online DDL 线上无锁添加索引

只能通过ALTER TABLE不能create index ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; 参数说明: ALGORITHM=INPLACE 更优秀的解决方案,在当前表加索引,步骤: 1.创建索引(二级索引)数据字典 2.加共享表锁,禁止DML,允许查询 3.读取聚簇索引,构造新的索引项,排序并插 入新索引 4.等待打开当前表的所有只读事务提交 5.创建索引结束 ALGORIT

Crystalqy的博客 6993

WINCC7.3破解文件

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

MySQL Online DDL原理解读

MySQL原生Online DDL是MySQL数据库提供的一项功能,它允许在不中断数据库服务的情况下执行数据定义语言(DDL)操作。

码到三十五 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL Online DDL,还是要谨慎

导读MySQL的Online DDL长期饱受诟病,8.0之后有没有好一些呢...本文重点讨论常见的几种Online DDL需求:增加新列(ADD COLUMN)修改列定...

老叶茶馆 4074

MySQL Online DDL空间不足问题解决方案

MySQL的Online DDL是一种在不锁表的情况下执行DDL操作的技术,广泛应用于数据库维护和优化中。其核心原理是通过在内存和临时文件中记录数据变更,实现无锁结构修改。但在处理大表时,常因innodb_online_alter_log_max_size等参数配置不当导致空间不足报错。合理调整临时表空间和日志缓冲区大小,结合pt-online-schema-change等工具,能有效解决生产环境中添加索引、修改列类型等场景下的空间问题。本文以订单表添加索引为例,详细解析了Online DDL的空间管理机制

weixin_30595035的博客 289

MySQL Online DDL:演变、原理与实践

MySQL Online DDL:演变、原理与实践

huanhuanzhou blog 1043

MySQL Online DDL 深度解析与优化指南

摘要:本文详细解析了MySQL Online DDL的空间需求、内存管理、并行线程、语句优化、失败条件和限制。Online DDL需要额外磁盘空间存储临时日志文件(默认上限128MB)、排序文件(可能等于表大小)和中间表文件。8.0.27+版本通过innodb_ddl_buffer_size控制内存使用,支持并行处理加速大表DDL。建议拆解复杂DDL语句,并注意并发DML可能导致失败。关键运维建议包括:预留足够空间、调大日志上限、设置临时目录、避开业务高峰及监控主从延迟。(149字)

m0_37607945的博客 1173

MySQL Online DDL操作空间优化与实战指南

Online DDL是MySQL中执行表结构变更的关键技术,其核心原理是通过创建临时表和日志缓冲区保证数据一致性。该技术解决了传统DDL操作会锁表的问题,但需要额外存储空间支持。在数据库运维实践中,合理配置innodb_online_alter_log_max_size和tmpdir参数至关重要,特别是在处理大表ALTER操作时。常见应用场景包括添加索引、修改列类型等schema变更,工程师需要平衡操作速度与临时空间消耗。通过案例可见,500GB表添加索引时若空间不足,可通过调整临时目录位置和增大日志缓冲区

weixin_30582943的博客 302

MySQL Online DDL

核心参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html Online DDL OnlineDDL支持在线更改表结构的同时,运行DML语句。Online DDL是5.7版本的特性,主要包含: 提高了业务的相应和可用性,不会造成业务的长时间不可用。 在DDL操作使用锁时,保证程序的并发和性能之前的平...

Mergades 836

mysql 5.7 online ddl_MySQL Online DDL 原理和踩坑

MySQL Online DDL 原理和踩坑MySQL 的 DDL(Data Definition Language) 包括增减字段、增减索引等操作。在 MySQL 5.6 之前,MySQL 的 DDL 操作会按照原来的表复制一份,并做相应的修改,例如,对表 A 进行 DDL 的具体过程如下:1、 按照表 A 的定义新建一个表 B2、 对表 A 加写锁3、 在表 B 上执行 DDL 指定的操...

weixin_28864139的博客 1139

MySQL Online DDL ALGORITHM区别

导读:MySQL的Online DDL长期饱受诟病,8.0之后有没有好一些呢… 本文重点讨论常见的几种Online DDL需求: 增加新列(ADD COLUMN) 修改列定义(MODIFY COLUMN) 增加/删除索引(ADD/DROP INDEX) 其他的DDL操作相对比较少,所以本文就不讨论了。 此外,本文也不讨论非InnoDB引擎以及非普通索引(如全文索引、空间索引)的场景。 我们先看下ALTER TABLE时ALGORITHM可以指定的几种方式: COPY ,是指DDL时,会生成(临时)新表

通往神秘的道路的专栏 2117

mysql 5.7 online ddl_MySQL的Online DDL语句

概念什么是OnlineDDL?在了解OnlineDDL之前,我们先来了解一下什么是DDL。说DDL,就不得不提一下它的另外两个兄弟:DML和DCL。他们三者的区别如下:DDL:data definition language,数据定义语言,用来定义数据的语句。例如我们平时的create table,create index,create function等。DML:data manipulatio...

weixin_36371924的博客 806

从模拟数据到场景复现,剖析 MySQL Online DDL 异常报错之谜

业务执行一条 alter table table_name engine=innodb 失败了很多次,一直无法执行成功,报错 ERROR 1062 (23000): Duplicate entry xxx for key 'xxx',在官方文档中也提到过,Online DDL 期间可能会出现 ERROR 1062 (23000): Duplicate entry 异常,但是没有详细说明,什么情况下会触发。业务执行 DDL 的时候,一直没有成功,意味着距离找到答案不远了。

a958014226的博客 859

mysql online ddl原理_MySQL Online DDL 方案剖析

一、常见的几种方案1.1 MySQL源生的IN-PLACE ONLINE DDL5.5,5.6 开始支持5.7 支持的更好,有更多ddl操作支持online8.0 支持快速加列功能1.2 第三方工具1. pt-online-schema-change2. gh-ost1.3 slave 先ddl,后切换主从二、方案剖析2.1 MySQL源生的IN-PLACE ONLINE DDL原理原理比较复杂,...

weixin_39668282的博客 669

mysql8.0添加操作表结构显式online ddl参数

mysql8.0添加操作表结构显式online ddl参数

weixin_42169734的博客 1485

MySQL专列,Online DDL邀你上车

在MySQL早期的版本,大部分DDL操作是非常昂贵的。因为实现的方式其实就是根据将要执行的DDL语句的定义,在源表的基础上,新建一个空的表,然后将源表的数据一行一行地插入新表,最后新建的表更名为源表,而旧表被删除。这意味着每次执行DDL都需要进行一次全表的复制以及索引的排序等操作,同时排斥外部事务操作,相当expensive。 MySQL忍不了,于是在带有innodb插件的5.1以及MySQL5....

灯火觅阑珊 367
上一篇: SQL 审核神器 SQLE 专业版全新上线,永久免费!
下一篇: MySQL 核心模块揭秘 | 06 期 | 事务提交之前,binlog 写到哪里?
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值