我有一个包含大量记录(3300万条)的表,还有一个varchar(255)字段,我想把它转换成varbinary(32)。每次尝试这样做时,都会出现以下错误:错误1114(hy000):表“#sql-7a72_”已满。这是我使用的查询:
alter table mytable modify myfield VARBINARY(32);
我有足够的空间在我的驱动器(超过12 gb,这是我的整个数据库大小相同),所以我相信这不是一个磁盘空间的问题。我怎样才能解决这个问题?
qcuzuvrc1#
首先找出两者的价值 tmpdir 或者 innodb_tmpdir 变量是,要查看哪一个取决于您使用的引擎:innodb公司:
tmpdir
innodb_tmpdir
SHOW VARIABLES LIKE 'innodb_tmpdir';
密萨姆:
SHOW VARIABLES LIKE 'tmpdir';
然后检查以验证此路径是否有足够的空间工作。例如,您有一个包含2gb数据的表,并且innodb\u tmpdir配置为 /tmp . 如果将/tmp卷配置为512mb,mysql可能没有足够的空间来处理,因为它使用tmpdir来临时排序文件。我建议不要使用这种方法,因为这样会导致数据丢失或损坏。相反,我建议在表中添加varbinary列,用显式转换为二进制的数据填充它。然后删除旧列并将新列重命名为旧列的名称。它看起来像这样:
/tmp
ALTER TABLE mytable ADD COLUMN myfield2 VARBINARY(32) AFTER myfield;
由于您似乎希望将列截断为最多32个字符,因此填充myfield2的update语句如下所示:
UPDATE mytable SET myfield2 = CAST(LEFT(myfield, 32) AS BINARY);
一旦您对结果满意,就可以删除旧列:
ALTER TABLE mytable DROP COLUMN myfield;
然后重命名新列:
ALTER TABLE mytable RENAME COLUMN myfield2 TO myfield;
我还强烈建议您进行备份并验证备份是否良好。首先将备份还原到另一个mysql示例。尝试对第二个测试示例进行更改。这样你就可以确保你所做的任何改变都是你所期望的。
1条答案
按热度按时间qcuzuvrc1#
首先找出两者的价值
tmpdir
或者innodb_tmpdir
变量是,要查看哪一个取决于您使用的引擎:innodb公司:
密萨姆:
然后检查以验证此路径是否有足够的空间工作。例如,您有一个包含2gb数据的表,并且innodb\u tmpdir配置为
/tmp
. 如果将/tmp卷配置为512mb,mysql可能没有足够的空间来处理,因为它使用tmpdir来临时排序文件。我建议不要使用这种方法,因为这样会导致数据丢失或损坏。相反,我建议在表中添加varbinary列,用显式转换为二进制的数据填充它。然后删除旧列并将新列重命名为旧列的名称。它看起来像这样:
由于您似乎希望将列截断为最多32个字符,因此填充myfield2的update语句如下所示:
一旦您对结果满意,就可以删除旧列:
然后重命名新列:
我还强烈建议您进行备份并验证备份是否良好。首先将备份还原到另一个mysql示例。尝试对第二个测试示例进行更改。这样你就可以确保你所做的任何改变都是你所期望的。