一些白痴(读:我)无意间以错误的精度将列添加到了MySQL表中。一切都很好,直到我们开始与日本客户打交道,而且专栏现在还不够大。
问题是该表现在有5200万行。
实际上有18列(!)错误,但是只有两列需要更改。如果有一种方法可以一次完成全部18个操作,那么可以。否则就是两个。
如何(在生产中)执行此操作而不锁定表或引起其他问题?理想情况下,无需花24小时就可以完成。
是否正在创建一个新表,复制数据,然后重命名/删除该方式?
哪个最好?
答案 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版本。这种新方法允许在同一表上使用多个触发器),这种方法也不起作用。