记录这个操作对应的时间点 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怎么扩展字段的信息别忘了在本站进行查找喔 。
推荐阅读
- 越狱进入国外服务器,越狱去外网
- 如何规划新媒体产品设计,如何规划新媒体产品设计方案
- 小程序如何快速搭建,小程序如何快速搭建网页
- 腾讯小程序是在哪里注册的,腾讯小程序是什么意思
- go语言接收post golang发送post请求
- pg菲尼克斯头部安装过程,菲尼克斯头部组装教程
- 有史莱姆的单机游戏,打史莱姆的单机游戏
- mysql怎么更改主键值 mysql如何修改主键
- 你的梦里直播是什么歌,你的梦里是谁呀