更改具有5200万行的mysql表的列精度

时间:2018-08-06 08:56:50

标签: mysql

一些白痴(读:我)无意间以错误的精度将列添加到了MySQL表中。一切都很好,直到我们开始与日本客户打交道,而且专栏现在还不够大。

问题是该表现在有5200万行。

实际上有18列(!)错误,但是只有两列需要更改。如果有一种方法可以一次完成全部18个操作,那么可以。否则就是两个。

如何(在生产中)执行此操作而不锁定表或引起其他问题?理想情况下,无需花24小时就可以完成。

是否正在创建一个新表,复制数据,然后重命名/删除该方式?

  1. 使用正确的定义创建新表
  2. 将数据从旧复制到新
  3. 重命名旧表
  4. 重命名新表
  5. 丢掉旧桌子

哪个最好?

1 个答案:

答案 0 :(得分:1)

那基本上就是要走的路,是的。我建议为此使用工具。看看pt-online-schema-change。它是percona-toolkit的一部分。

它的作用是在表上创建触发器,以便将新的/更新的数据转移到临时表上。将数据复制到新的(更改的)表后,它将重命名表。

示例用法如下:

# pt-online-schema-change --dry-run --alter "change col1 col1 decimal(10,2), change col2 col2 decimal(10,2)" --alter-foreign-keys-method=auto --max-load Threads_connected=500 --critical-load Threads_connected=1000 D=your_database_name,t=your_table_name,u=your_mysql_user,p=your_mysql_user_password

但是,请仔细阅读手册。 当表上已经有触发器时(取决于您使用的MySQL版本。这种新方法允许在同一表上使用多个触发器),这种方法也不起作用。