我们有一张有5亿行的桌子。 不幸的是,其中一列是int(11),这是一个有符号的整数,它是一个递增的值,超过了21亿个幻数。 这立即导致大约10,000个用户的停机。 我们讨论了很多解决scheme,并决定我们可以安全地回滚这个值,比如说十亿。 但是我们不得不为每一行都回滚。
这是我们所做的:
更新Table1设置MessageId =情况MessageId <1073741824然后0 else消息Id – 1073741824结束;
我在一个有1000万行的桌子上testing了这个,花了11分钟。 所以我认为更大的桌子需要550分钟,或者9个小时。 这将是我们三年来最大的停机时间。 (我们是一家创业公司)。 现在正在进行18个小时。
我们应该做什么?
请不要说我们应该做的。 我想我们应该一次更新几百万行。
有什么方法可以看到进展? Mysql能挂吗? 使用mysql 5.0.22。
谢谢!
尝试查看SHOW PROCESSLIST的输出; 它应该给你一个简要的想法, 最坏的情况下,你可以杀死该线程(使用KILL $ threadID),然后手动清理。
HTH。
你的意思是:更新表1设置MessageId =情况MessageId <1073741824然后MessageId其他MessageId – 1073741824结束;
否则,我可以看到一堆相同的消息。
其他方式可能会更快,在SQL级别:
create table new_table as select (all other fields), case msg id > xxx then msg_id - 1000000 else msg_id from old_table;
这样你就可以完整地扫描一张桌子,并一次性写入另一张桌子,而不是做大量的随机I / O(你可以用iostat检查)。