我在 ALTER
一个巨大的 (InnoDB) MySQL 表时遇到了一些麻烦。表的 ID 列(这是主键)被定义为 UNSIGNED INT
但达到了最大值 (4294967295)。
为了能够向该表中添加更多行,我需要将此列的类型调整为 BIGINT
。但是,标准的 MySQL ALTER
命令(以及我目前发现的任何其他解决方案)将尝试生成一个包含新定义的新表,然后将所有数据复制到其中。对于本例中的表,这需要 942.0Gb 的可用磁盘空间,而我只有 271Gb 可用(并且没有其他分区确实具有所需的可用磁盘空间)。
是否有不需要完整复制原始表(而是将数据移动到新表或类似的东西)的解决方案?
我不在乎在更改表时无法访问该表,该表可以完全锁定几个小时没有问题(反正我现在不能使用它)。
最佳答案
由于您有 271Gb 的可用磁盘空间,并且如果几个小时内未访问表也没有关系,请按照以下步骤操作:
- 创建一个新表,假设
tbl_temp
的ID
为BIGINT
,保持剩余的表结构完全相同。 - 创建一个简单的过程(您使用的任何服务器端脚本语言),它将从原始表中选择一行并将其插入到
tbl_temp
中。 - 删除从原始表中插入的行。
- 插入所有行后,您的原始表格将为空。删除原表
- 将
tbl_temp
重命名回原始表。
这样您就可以使用现有磁盘空间迁移整个数据。
关于mysql - 用很少的可用磁盘空间改变巨大的 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44780236/