mysql - 用很少的可用磁盘空间改变巨大的 MySQL 表

标签 mysql alter

我在 ALTER 一个巨大的 (InnoDB) MySQL 表时遇到了一些麻烦。表的 ID 列(这是主键)被定义为 UNSIGNED INT 但达到了最大值 (4294967295)。
为了能够向该表中添加更多行,我需要将此列的类型调整为 BIGINT。但是,标准的 MySQL ALTER 命令(以及我目前发现的任何其他解决方案)将尝试生成一个包含新定义的新表,然后将所有数据复制到其中。对于本例中的表,这需要 942.0Gb 的可用磁盘空间,而我只有 271Gb 可用(并且没有其他分区确实具有所需的可用磁盘空间)。

是否有不需要完整复制原始表(而是将数据移动到新表或类似的东西)的解决方案?
我不在乎在更改表时无法访问该表,该表可以完全锁定几个小时没有问题(反正我现在不能使用它)。

最佳答案

由于您有 271Gb 的可用磁盘空间,并且如果几个小时内未访问表也没有关系,请按照以下步骤操作:

  1. 创建一个新表,假设 tbl_tempIDBIGINT,保持剩余的表结构完全相同。
  2. 创建一个简单的过程(您使用的任何服务器端脚本语言),它将从原始表中选择一行并将其插入到 tbl_temp 中。
  3. 删除从原始表中插入的行。
  4. 插入所有行后,您的原始表格将为空。删除原表
  5. tbl_temp 重命名回原始表。

这样您就可以使用现有磁盘空间迁移整个数据。

关于mysql - 用很少的可用磁盘空间改变巨大的 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44780236/

相关文章:

MySQL 文档澄清;触发器访问另一个表

非常大的表上的 MySQL ALTER TABLE - 运行它安全吗?

更改 wav 文件的采样率和比特率而不会遇到打开文件的问题?

mysql - 为 mysql boolean 列中的先前值插入 NULL 值

mysql - Debian 上的 MariaDB : Syntax error: How to switch unix socket authentication back to password-based?

mysql - 我可以在我的机器上免费使用 MySql 来开发我的应用程序吗?

mysql 将两个表行连接到一张表中

javascript - 为什么不将数据库查询的结果推送到变量中?

mysql - SQL (MySQL) 查询以提取多个时间范围内的聚合

postgresql - 在 Postgres 中,表更改后如何重新验证 ("type-check") 函数和过程?