mysql怎么扩展字段 mysql 扩容( 二 )


记录这个操作对应的时间点 t2
BEGIN;
DELETE FROM B WHERE updated_timet1;
INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time t1;
COMMIT;
7. 现在A 和 B 差不多该同步了吧? 差不多了,但是6 执行完之后,A仍然在写, 子子孙孙无穷尽也 ... , 但这个时候 A 和 B 的差异已经非常非常小了,所以在下一步 , 我们在一个transaction 里执行下面的操作:
BEGIN;
DELETE FROM B WHERE updated_timet2;
INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time t2;
ALTER TABLE A RENAME TO C;
ALTER TABLE B RENAME TO A;
COMMIT;
8. Done
PS: 如果A表没有时间戳,实际上没有先见之明的人大概不会想到要预留一个时间戳的字段, 那么几乎是没有办法快速比较两个表的差异的,这个时候我选择的做法就是放弃修改的数据,只管新的数据了 ,  所以只要把t1,t2 换成id 就可以了 ,  这样delete 语句也省略了 ,  因为没啥好delete的;
千万不要想着根据ID 来JOIN 然后更新B表的字段来补齐新的数据,如果能把两个千万级别的表JOIN起来,内存有多大呢?
9. 上面的解决方案是我们第二次尝试之后犯下了一个巨大的错误 , 这个错误导致网站瘫痪了大概20分钟,如果你和我一样没有发现问题,那么这就是悲剧的地方 。问题就在于我是根据上面的PS来操作的, 然后B就华丽地变成了A. B 表至今身上是没有索引的, 立即悲剧 。所以应当在第5步之后按照A的索引为B建立索引, 待索引全部好了之后, 再继续6 。如果不是走PS这条路,而是有时间戳的字段的话 ,  在6的时候会发现这个问题, 因为那条Delete 慢的超出想像,会明白这里是有问题的
10. 新手,请在本地练习之后 ,  再实际操作; 可以多操作几次, 写一个脚本,服务器上直接执行脚本.
mysql怎么扩展字段的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql 扩容、mysql怎么扩展字段的信息别忘了在本站进行查找喔 。

推荐阅读