更改具有5200万行的mysql表的列精度
一些白痴(读:我)无意中以错误的精度将列添加到MySQL表中。在我们开始与日本客户打交道之前,一切都很好,现在专栏不够大 问题是这个表现在有5200万行 实际上有18列(!)是错误的,但只有两列需要更改。如果有一种方法可以同时完成所有18项,好的。否则就只有这两个了 如何在不锁定表或导致其他问题的情况下(在生产中)执行此操作?最好不要花24小时 是否正在创建一个新表,复制数据,然后重命名/删除方法更改具有5200万行的mysql表的列精度,mysql,Mysql,一些白痴(读:我)无意中以错误的精度将列添加到MySQL表中。在我们开始与日本客户打交道之前,一切都很好,现在专栏不够大 问题是这个表现在有5200万行 实际上有18列(!)是错误的,但只有两列需要更改。如果有一种方法可以同时完成所有18项,好的。否则就只有这两个了 如何在不锁定表或导致其他问题的情况下(在生产中)执行此操作?最好不要花24小时 是否正在创建一个新表,复制数据,然后重命名/删除方法 创建具有正确定义的新表 将数据从旧复制到新 重命名旧表 重命名新表 放下旧桌子 哪一个最好?基本上
哪一个最好?基本上就是这样,是的。我建议使用一个工具来实现这一点。查看pt在线模式更改。这是一部分 它所做的是在表上创建触发器,以便将新的/更新的数据传输到临时表。将数据复制到新的(更改的)表后,它会重命名这些表 示例用法如下所示:
# 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版本。较新版本允许在同一个表上有多个触发器)。当然,表有18列,都需要非整数,数字数据类型-但请注意,这可能是架构设计不佳的症状。请尝试在alter语句中添加
algorithm=inplace
。它要么工作并仅锁定表一秒钟左右,要么失败并出现错误(取决于列类型)。@vatev正如您在中看到的那样,需要一个完整的锁,因此这不起作用。@brother表实际上有30列。18.需要改变。它是一个表,表示/保存来自第三方站点的发票信息。这一点都没有错。@fancyPants如果没有完整的表锁,在MySQL中修改表是100%不可能的。唯一的问题是它会被锁定多久。谢谢。我已经看过pt在线模式更改,但是文档非常糟糕。从外观上看,它完成了我列出的所有5个步骤…因为恢复数据库可能需要24小时,我宁愿不要出错。我只能说,我是一名有6年经验的数据库管理员。我一直在使用它,到目前为止还没有出现问题。但我当然会建议事先测试它。