convert mysql column from varchar to varbinary获取“table is full”错误

enyaitl3  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(375)

我有一个包含大量记录(3300万条)的表,还有一个varchar(255)字段,我想把它转换成varbinary(32)。
每次尝试这样做时,都会出现以下错误:
错误1114(hy000):表“#sql-7a72_”已满。
这是我使用的查询:

alter table mytable modify myfield VARBINARY(32);

我有足够的空间在我的驱动器(超过12 gb,这是我的整个数据库大小相同),所以我相信这不是一个磁盘空间的问题。
我怎样才能解决这个问题?

qcuzuvrc

qcuzuvrc1#

首先找出两者的价值 tmpdir 或者 innodb_tmpdir 变量是,要查看哪一个取决于您使用的引擎:
innodb公司:

SHOW VARIABLES LIKE 'innodb_tmpdir';

密萨姆:

SHOW VARIABLES LIKE 'tmpdir';

然后检查以验证此路径是否有足够的空间工作。例如,您有一个包含2gb数据的表,并且innodb\u tmpdir配置为 /tmp . 如果将/tmp卷配置为512mb,mysql可能没有足够的空间来处理,因为它使用tmpdir来临时排序文件。
我建议不要使用这种方法,因为这样会导致数据丢失或损坏。相反,我建议在表中添加varbinary列,用显式转换为二进制的数据填充它。然后删除旧列并将新列重命名为旧列的名称。它看起来像这样:

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示例。尝试对第二个测试示例进行更改。这样你就可以确保你所做的任何改变都是你所期望的。

相关问题