我们使用innodb引擎在mysql中存储了一个非常大的(1亿)行表。列“x”定义为“smallint(5)unsigned not null”。
自几年前的原始设计以来,需求现在已经发生了变化,列“x”需要存储最小数据类型大小“int unsigned not null”。
我们被允许“短暂”的停机时间来部署应用程序(少于5分钟),因此如果需要以任何方式使数据库表暂时不可用(例如完全表锁),则任何数据库更改都需要适应此时间窗口。如果更改可以“在线”完成,那么我们可能会接受较长时间的性能降级。
这里有没有人有过在一个非常大的表上修改mysql/innodb中的列类型的经验?如果是这样的话,一切顺利吗?大概花了多长时间(我意识到这取决于硬件,我只是想弄清楚我们在时间窗口中要求做的事情是否有可能实现)?
提前谢谢你,
最佳答案
这是我用过的食谱
在你有老专栏的地方,
创建新列B
创建触发器以在更新时更新b/insert on a
更新b=a
删除引用
为b创建fkey关系
更新代码以使用列B而不是A(部署)
在列A上放置触发器
删除列A
如果必须重新更改列名,请重复所有步骤。
关于mysql - InnoDB上的MySql数值类型迁移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6192102/