ERROR 1878(HY000):临时文件写入失败

时间:2014-08-26 09:40:55

标签: mysql

我正在执行查询

  

ALTER TABLE message ADD COLUMN syncid int(10)NOT NULL DEFAULT 0;

MySQL返回错误:

ERROR 1878 (HY000): Temporary file write failure.

  

消息表信息:

     

引擎类型:InnoDB

     

行:15786772

     

索引长度:1006.89 MB

     

数据长度:11.25 GB

如何解决?

2 个答案:

答案 0 :(得分:13)

MySQL将ALTER TABLE实现为表重新创建,因此在该过程的某个阶段,系统上存在两个表副本。此操作需要超过12 GB的可用空间。

释放一些空间。或者,set your server to use a different temporary directory,其中有足够的空间。


备选方案的替代方案(WHILE可能需要包装在存储过程中):

  • 使用新结构
  • 创建一个新表(temp_table
  • 将数据从original_table小批量传输到temp_table
  • 删除original_table并重命名temp_table


-- useful only if concurrent access is allowed during migration
LOCK TABLES original_table WRITE, temp_table WRITE;

SELECT COUNT(*) INTO @anythingleft FROM original_table;
WHILE @anythingleft DO
    -- transfer data
    INSERT INTO temp_table
    SELECT
        original_table.old_stuff,
        "new stuff"
        FROM original_table
        ORDER BY any_sortable_column_with_unique_constraint -- very important!
        LIMIT 1000; -- batch size, adjust to your situation

    DELETE FROM original_table
    ORDER BY any_sortable_column_with_unique_constraint
    LIMIT 1000; -- ORDER BY and LIMIT clauses MUST be exactly the same as above

    SELECT COUNT(*) INTO @anythingleft FROM original_table;
END WHILE;

-- delete, rename
DROP TABLE original_table;
UNLOCK TABLES;
RENAME TABLE old_table TO original_table;

如果您的表使用InnoDB,使用SELECT ... FOR UPDATE;代替表锁可以使用更精细的解决方案,但我相信您能理解。

答案 1 :(得分:0)

很抱歉,您的答案很晚,或者没有找到这个旧主题,但是以下工具可以帮助您解决问题:

这两种工具都以@RandomSeed提出的方式重新创建表,但方式更简单。

但是,请确保文件系统上有足够的空间。这些工具不需要在临时文件夹中占用更多空间,当您将临时文件夹安装在单独的驱动器/ RAMdisk上时,这很有趣。