我正在执行查询
ALTER TABLE
message
ADD COLUMNsyncid
int(10)NOT NULL DEFAULT 0;
MySQL返回错误:
ERROR 1878 (HY000): Temporary file write failure.
消息表信息:
引擎类型:InnoDB
行:15786772
索引长度:1006.89 MB
数据长度:11.25 GB
如何解决?
答案 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上时,这很有趣。