mysql 修改大表字段,报错ERROR 1878 (HY000): Temporary file write failure. 用pt-online-schema-change

摘要:
对联机表执行Alter以添加字段。MySQL配置的tmp缓存目录只有2Gselectdata_Length,1。根据原始表(original_table)的表结构和ddl语句。

在线上一个表上执行了alter 增加字段操作,报异常:ERROR 1878 (HY000): Temporary file write failure. 初步怀疑表太大,临时空间不够。

1.查了下表的大小将近28G,索引18G,mysql配置的tmp缓存目录只有2G

select data_length,index_length   from tables where  table_schema='dbName'  and table_name = 'tableName';  

select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,  concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB  

    from tables where  table_schema='dbName'  and table_name = 'tableName'; 

mysql 修改大表字段,报错ERROR 1878 (HY000): Temporary file write failure. 用pt-online-schema-change第1张

解决方法:

一、更改mysql 的tmp目录,让tmp目录空间更大,然后重新执行 变更sql语句。

mkdir -p /data/tmp

chown -R mysql:mysql /data/tmp

chmod a+w /data/tmp

vim /etc/my.cnf      #把tmpdir设置到 /data/tmp

tmpdir=/data/tmp

service mysqld restart 需要重启mysql服,对线上业务影响较大。

 innodb 在 ddl 的时候所执行的操作:

1. 按照原始表 (original_table) 的表结构和 ddl 语句,新建一个不可见的临时表 (temporary_table)

2. 在原表上面加上 WRITE LOCK 阻塞所有的更新操作 (insert、delete、update等操作)

3. 执行 insert into tmp_table select * from original_table

4. rename original_table 和 tmp_table 最后 drop original_table

5. 最后释放掉 write lock

 

二、采用pt-online-schema-change方式进行修改。

「来自 2018 年的补充:目前 MySQL 自己也提供了 onlineddl 的工具,在数据量不大的时候还是非常好用的,直接指定 inplace 也可以轻松达到不锁表加字段的效果」。

 

通过以上的步骤我们可以很容易的发现,这样操作在表锁定的情况是只能查询,不能写入。为了解决这个问题所以 percona 公司推出了一个不会阻塞的工具 pt-online-schema-change。

这里不得不再次介绍一下 pt-online-schema-change 是怎么做到在不阻塞写入的情况下改动数据库的:

1. 首先创建一个和你要执行的 alter 操作的表一样的空的表结构。

2. 执行我们赋予的表结构的修改,然后 copy 原表中的数据到新表里面。

3. 在原表上创建一个触发器在数据 copy 的过程中,将原表的更新数据的操作全部更新到新的表中来。 这里特别注意一下,如果原表中已经定义了触发器那么工具就不能工作了,因为 pt 使用到了数据库的触发器。

4. copy 完成之后,用 rename table 新表代替原表,默认删除原表。

 

转自:https://blog.csdn.net/educast/article/details/89520434

原理 pt-online-schema-change 使用解析:https://blog.csdn.net/isoleo/article/details/103818332

mysql 修改大表字段,报错ERROR 1878 (HY000): Temporary file write failure. 用pt-online-schema-change第2张

免责声明:文章转载自《mysql 修改大表字段,报错ERROR 1878 (HY000): Temporary file write failure. 用pt-online-schema-change》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇15.ARM处理器的启动流程把list转换为一个用逗号分隔的字符串下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于sqlite的Qt 数据库封装

[代码]mydata.h 10 #ifndef MYDATA_H 11 #define MYDATA_H 12 #include <QObject> 13 #include <QString> 14 #include <QtSql/QSqlTableModel> 15 #include &l...

linux 后台执行oracle sql脚本

一、简单后台执行。 nohup  sqlplus   Oracle/Oracle@orcl   @sql.sql     & --这样的写法会报错(Error 45 initializing SQL*Plus Internal error)  今天打算写个后台执行清理单张表和备份sql脚本。发现一直报错,网上也没有具体的修改方法。 后来到别的博客去...

Navicat安装及简单使用

一、安装   下载地址:https://pan.baidu.com/s/1bpo5mqj   下载完之后,直接解压出来就能用,看一下解压之后的目录:   双击打开下面这个文件(可以把它添加一个桌面快捷方式,或者添加到任务栏):          然后会提示你输入注册码:            回到navicat的解压出来的文件夹里面,有个叫做key.tx...

Sql Server使用技巧

1. 当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改,如果强行更改会出现以下提示: 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改”选项。如果要去掉此提示,打开SQL 2008 在最上面 工具-〉选项-〉...

ant-desin-vue——table全选时自定义的禁用行也被选上,且最后一行不选中问题

错误效果(序号1是获取数据后,初始化禁用的项):                                                        正确效果:                                                                                              ...

试试SQLServer 2014的内存优化表

试试SQLServer 2014的内存优化表 SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度。 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技术来支持大规模OLTP工作负载。 就算如此,要利用此新功能,数据库必须包含“内存优化...