MySQL给表增加字段的时候出现Table is full的报错处理
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的报错处理相关推荐
- mysql 建表语句 stored as_Druid 解析Hive建表语句解析报错
Druid 版本: com.alibaba druid-spring-boot-starter 1.2.3 Hive 建表SQL create table ads_data.sale_detail_o ...
- MySQL修改表的字段
MySQL修改表的字段 1.ALTER TABLE 方法 2.MODIFY COLUMN 方法 MySQL 修改表字段的方法有两种: ALTER TABLE MODIFY COLUMN. 1.ALTE ...
- mysql增加列耗时_实战-130W表增加字段耗时
工作需要对130W的表增加字段,因为是操作线上数据库,所以提前在本地调查下耗时. 首先建表: CREATE TABLE `alter_cloumn_test` ( `id` int(11) unsig ...
- mysql增加字段设默认值_mysql原表增加字段且设置默认值及修改字段默认值
-- 增加字段及注释 alter table sr_zjff_main add zjbzjxbj int(1) DEFAULT '0' COMMENT ''; alter table sr_main_ ...
- 实战-130W表增加字段耗时
工作需要对130W的表增加字段,因为是操作线上数据库,所以提前在本地调查下耗时. 首先建表: CREATE TABLE `alter_cloumn_test` (`id` int(11) unsign ...
- mysql将一个表的字段更新到另一个表中
mysql将一个表的字段更新到另一个表中 今天遇到了这个问题 百度了一下,给出的解决方案如下 UPDATE T_CONDETAILED SET latesprice=t_temp.amount FRO ...
- Laravel 安装mysql、表增加模拟数据、生成控制器
参考中文网教程: 安装mysql.表增加模拟数据 http://www.golaravel.com/post/2016-ban-laravel-xi-lie-ru-men-jiao-cheng-yi/ ...
- MYSQL给表或者字段写注释
Mysql数据库对表进行注释: ALTER TABLE table_name COMMENT='这是表的注释'; Mysql数据库对表的字段进行注释: ALTER table table_name M ...
- MySQL 修改表 添加字段
MySQL 修改表 添加字段 ALTER TABLE 表名 ADD COLUMN 添加的字段 VARCHAR(10) NOT NULL COMMENT '备注' AFTER 某个字段;
最新文章
- 字符串的长度超过了为 maxJsonLength 属性设置的值
- Android studio报Error:(26, 13)-v7:27.错误的解决方法
- linux libimf.so,如何安装Linux版FLOW-3D及注意事项
- Atitit 源码语句解析结构 目录 1.1. 栈帧(stack frame).每个独立的栈帧一般包括:	1 1.2. 局部变量表(Local Variable Table)	2 2. ref	2
- PLUPLOAD插件 ━━ 上传总结(分片上传,php后端处理)
- “天外来客”讲述太阳系“童年”故事
- Ruby语言介绍(二)——Ruby基本语法(语言基础)
- 爱你穿越时间,两行来至秋末的眼泪
- python实现学员管理系统(增删改查)
- greenplum麒麟安装笔记
- BpbBppbpBB
- js中将中国标准时间格式、CST日期转换为yyyy-MM-dd HH:mm:ss格式总结
- CNN,GAN,AE和VAE概述
- Python保护视力小程序
- fastposter v2.11.0 天花板级的海报生成器
- (全栈旅行足迹地图打卡网站 0-1)-旅行足迹文章记录(项目完结)-15(WebGIS Vue-js-go-mysql)
- CloudTorrent 磁链下载 docker版本安装 nginx配置
- 孔乙己vsjava内部类
- 平台数据库授权时造成主从同步失败问题的事故报告20120705
- 简单实现一个关系图View
热门文章
- AccessDenied You have no right to access this object because of bucket acl.
- 阿里巴巴《Java开发手册》学习总结分享
- c语言--两个叹号连用
- 计算机信息技术应用教学设计,信息技术应用 用计算机画函数图象优秀教学设计...
- JimuReport积木报表1.1.05 版本发布,免费的企业级 Web 报表工具
- 全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)
- centos7纯净版安装教程
- 全开源的V17/欧泡支付/易支付/一键安装
- SQL Server 拼音简码获取
- CCheckListBox的使用