MySQL给表增加字段的时候出现Table is full的报错处理

文章目录

  • MySQL给表增加字段的时候出现Table is full的报错处理
  • 一、问题描述
  • 二、错误原因溯源
    • 复现错误
    • 分析
    • 错误修复
  • 总结

一、问题描述

今日在发布服务时,在服务Init阶段出现的报错,错误信息如下:

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statementat org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final].....Caused by: java.sql.SQLException: The table 'xxx' is fullat com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) ~[mysql-connector-java-5.1.47.jar!/:5.1.47]

服务架构:springboot+data jpa
给一张数据表增加了两个字段,该报错是在执行DDL语句时出错的

二、错误原因溯源

复现错误

在mysql-shell中执行该DDL语句
提示报错 [err] 1114 - the table ‘billboard’ is full
官方对该报错提示如下:

Error number:  `1114` ; Symbol: [`ER_RECORD_FILE_FULL`]SQLSTATE:  `HY000`
Message: The table '%s' is full`InnoDB`  reports this error when the system tablespace runs out of free space. Reconfigure the system tablespace to add a new data file.

错误说明是表空间不足,会导致这个错误。

分析

通过执行命令查看下这张表的信息:

show table status like "xxx";

结果如下:
这是一张百万行的数据表,Data_lengh约是258MB

数据库版本

show table status like "xxx";

结果:

在 MySQL5.7版本中 InnoDB是如何执行一个DDL语句,相信流程可见下图:

总结一下,大致的过程是,

1.锁住表结构文件(frm文件),解析DDL语义,创建新的表结构文件,新的表文件(ibd文件)和 相关的日志文件。
2.读取源文件的数据,重建数据和对应索引到新的表文件中,再把增量的新数据写入到新的表文件里。
3.重建完成后再移除源文件,把新的表结构文件,新的表文件重命名为源文件。

至此,得到一个朴素的推断,由于执行DDL语句,InnoDB会生成新的文件来重建数据库文件,那么造成临时表空间不足的原因可能会有:
1.MySQL的配置对表空间的大小做了限制,不允许数据库文件超过某个值 。
2.MySQL的数据文件所在磁盘空间不足。

对于猜想1:
可以看到该配置被设置为自动增加。

show VARIABLES like "INNODB_data_%";


对于猜想2
进入部署MySQL数据文件所在磁盘上,执行查询

可以看到当前磁盘剩余空间为 168MB 小于 258MB

错误修复

先进行硬盘扩容
MySQL扩容完成后,再次执行DDL语句,报错依旧产生。
此时已经满足了重建表空间的磁盘空间要求,但还是产生错误。
依靠猜想,读写操作一定磁盘上的数据读取到内存中进行转换操作,然后进行批量写磁盘(如果是读一条写一次磁盘会造成IO资源性能的低下),进行批操作的前提是有足够的内存空间。

show GLOBAL VARIABLES like "%table_size%";


默认的情况下 tmp_table_size 和 max_heap_table_size 大小为16MB
查看当前的主机,内存还有4.2G的空闲,我们将该值设置为 256M后,重启MySQL服务
并再次执行DDL语句,经过约10S左右,该语句执行成功。
执行成功后,再将相关参数改回。

总结

1 回过头再来考虑一个问题,如果我们要执行DDL的数据表是线上运行的一个千万级的大表,那么我们应该怎么处理?
应该避免在业务高峰期执行DDL的操作
如果需要热执行DDL,可以考虑配置相关的降级策略,减少对该表的事务操作,避免在重建后,还要处理增量数据。
2 MySQL 5.6版本之前是不支持在线修改DDL,即在完成DDL之前,会锁表,在以后的版本才支持在线DDL
3 执行了DDL语句之后,InnoDB重建数据表文件过程中,整理了空间碎片,所以重建后的idb的体积可能比重建前小

MySQL给表增加字段的时候出现Table is full的报错处理相关推荐

  1. mysql 建表语句 stored as_Druid 解析Hive建表语句解析报错

    Druid 版本: com.alibaba druid-spring-boot-starter 1.2.3 Hive 建表SQL create table ads_data.sale_detail_o ...

  2. MySQL修改表的字段

    MySQL修改表的字段 1.ALTER TABLE 方法 2.MODIFY COLUMN 方法 MySQL 修改表字段的方法有两种: ALTER TABLE MODIFY COLUMN. 1.ALTE ...

  3. mysql增加列耗时_实战-130W表增加字段耗时

    工作需要对130W的表增加字段,因为是操作线上数据库,所以提前在本地调查下耗时. 首先建表: CREATE TABLE `alter_cloumn_test` ( `id` int(11) unsig ...

  4. mysql增加字段设默认值_mysql原表增加字段且设置默认值及修改字段默认值

    -- 增加字段及注释 alter table sr_zjff_main add zjbzjxbj int(1) DEFAULT '0' COMMENT ''; alter table sr_main_ ...

  5. 实战-130W表增加字段耗时

    工作需要对130W的表增加字段,因为是操作线上数据库,所以提前在本地调查下耗时. 首先建表: CREATE TABLE `alter_cloumn_test` (`id` int(11) unsign ...

  6. mysql将一个表的字段更新到另一个表中

    mysql将一个表的字段更新到另一个表中 今天遇到了这个问题 百度了一下,给出的解决方案如下 UPDATE T_CONDETAILED SET latesprice=t_temp.amount FRO ...

  7. Laravel 安装mysql、表增加模拟数据、生成控制器

    参考中文网教程: 安装mysql.表增加模拟数据 http://www.golaravel.com/post/2016-ban-laravel-xi-lie-ru-men-jiao-cheng-yi/ ...

  8. MYSQL给表或者字段写注释

    Mysql数据库对表进行注释: ALTER TABLE table_name COMMENT='这是表的注释'; Mysql数据库对表的字段进行注释: ALTER table table_name M ...

  9. MySQL 修改表 添加字段

    MySQL 修改表 添加字段 ALTER TABLE 表名 ADD COLUMN 添加的字段 VARCHAR(10) NOT NULL COMMENT '备注' AFTER 某个字段;

最新文章

  1. 字符串的长度超过了为 maxJsonLength 属性设置的值
  2. Android studio报Error:(26, 13)-v7:27.错误的解决方法
  3. linux libimf.so,如何安装Linux版FLOW-3D及注意事项
  4. Atitit 源码语句解析结构 目录 1.1. 栈帧(stack frame).每个独立的栈帧一般包括: 1 1.2. 局部变量表(Local Variable Table) 2 2. ref 2
  5. PLUPLOAD插件 ━━ 上传总结(分片上传,php后端处理)
  6. “天外来客”讲述太阳系“童年”故事
  7. Ruby语言介绍(二)——Ruby基本语法(语言基础)
  8. 爱你穿越时间,两行来至秋末的眼泪
  9. python实现学员管理系统(增删改查)
  10. greenplum麒麟安装笔记
  11. BpbBppbpBB
  12. js中将中国标准时间格式、CST日期转换为yyyy-MM-dd HH:mm:ss格式总结
  13. CNN,GAN,AE和VAE概述
  14. Python保护视力小程序
  15. fastposter v2.11.0 天花板级的海报生成器
  16. (全栈旅行足迹地图打卡网站 0-1)-旅行足迹文章记录(项目完结)-15(WebGIS Vue-js-go-mysql)
  17. CloudTorrent 磁链下载 docker版本安装 nginx配置
  18. 孔乙己vsjava内部类
  19. 平台数据库授权时造成主从同步失败问题的事故报告20120705
  20. 简单实现一个关系图View

热门文章

  1. AccessDenied You have no right to access this object because of bucket acl.
  2. 阿里巴巴《Java开发手册》学习总结分享
  3. c语言--两个叹号连用
  4. 计算机信息技术应用教学设计,信息技术应用 用计算机画函数图象优秀教学设计...
  5. JimuReport积木报表1.1.05 版本发布,免费的企业级 Web 报表工具
  6. 全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)
  7. centos7纯净版安装教程
  8. 全开源的V17/欧泡支付/易支付/一键安装
  9. SQL Server 拼音简码获取
  10. CCheckListBox的使用