各位大佬们 征求意见

2019-10-18 11:19:02 +08:00
 JustinJie
1. 菜鸡一枚, 接到一个数据迁移的需求
2. 新功能重构上线, 要把老库里面的表数据迁移到新库的表里, 两张表字段大体上一样也有一些区别, 表里面大概 40 个字段
3. 数据库是 mysql, 老库的数据量大概在 400 多万条的亚子
4. 现在正在考虑方案, 奈何之前没接触过类似的功能, 找 v2 大佬请教, 用什么样的方式比较好, 是用代码实现, 还是直接脚本之类的 ? 如果可以的话可以说的稍微具体点
3525 次点击
所在节点    程序员
31 条回复
MorpheusAnchor
2019-10-18 15:38:50 +08:00
做过类似的 几十个表吧 逻辑处理比较复杂 用 python 一条一条写的,但是可复用,因为是公司的产品,部署出去的
zgzhang
2019-10-18 16:10:17 +08:00
@JustinJie 你的服务如果在迁移期间可以停止服务,那同步数据用脚本还是 sql 都可以。但是你确定迁移期间没有数据修改的问题吗?
markgor
2019-10-18 16:11:15 +08:00
@JustinJie 沒時間要求就一條條,有時間要求就嘗試讀 N 條,插入 N 條 異步操作。
JustinJie
2019-10-18 16:55:07 +08:00
@zgzhang # 22
服务在晚上发布, 一般都没有什么用户的了, 应该是没有问题的

@markgor # 23
OK 我懂了 应该没有时间要求
那我是不是就 Java 代码 读取数据, 拼接成 sql 生成脚本这样 ? 还是有好的方式呢 ?
markgor
2019-10-18 17:22:40 +08:00
@JustinJie java 不清楚,我是直接 PHP 跑腳本
主進程讀 1K 條就 fork 個子線程出來跑插入,
然後插入失敗就寫個 log (完整的 SQL 語句),
最後在跑一次失敗 log 裡面的記錄。

因為是一年前的事,大概就這些,
你的環境我不清楚,我當時是異地的,數據量不算大,好像幾十萬筆記錄,

注意下網絡超時和新數據庫的格式就可以了( mysqlmax_allowed_packet,還有 MYSQL 特性是否一致)。
對了,mysql 還有個 max_connections。

實話實說,你不缺時間的就一條條跑,失敗的記錄起來,然後打牌的打牌,喝酒的喝酒,跳舞的跳舞,每個一會看看有沒出錯就可以了。最後跑完就看看失敗的 log 裡面有沒 SQL 語句記錄,數量不多直接就在新數據庫裡運行裡面的語句。

good luck
lufeng08
2019-10-18 17:32:54 +08:00
做过类似的,一个论坛重构,几千万条帖子,几亿个回复,跨服务器迁移,写接口实现,然后写 shell 脚本请求接口,每页多少条数据可以配置,先每页 100 条执行,根据测试结果慢慢往上加,比如加到 2000,400 万条数据,每次迁移 2000 条,也就 2000 秒执行完毕。
zpfhbyx
2019-10-18 18:50:43 +08:00
先双写啊,新库带老库的主键 id 插入到新库,然后查新库最小 id, 然后 while(true) 老库主键作位移,一次 1000 ,然后新库, insert 批量插入, 保你 5kw 数据没问题
CoooooolFrog
2019-10-18 19:23:56 +08:00
如果允许服务短时间不可用,简单点直接 mysqldump。
如果不允许服务不可用,双写表,数据同步完以后清理旧表,全部迁移新表。
lufeng08
2019-10-19 12:14:57 +08:00
有句话不知当讲不当讲,我们做了一个提升新手生产力的脚手架,也开发了好多应用上架了,都免费了,你可以参观下,可以拿来二次开发
https://www.gepardshop.com/appstore
JustinJie
2019-10-21 13:08:00 +08:00
@markgor # 25
好的 我考虑的是直接拼接成 sql 脚本 给 dba 执行, 程序跑, 记录失败 log 也很有必要的样子

@lufeng08 # 26
大佬, 膜拜 ! 我去研究下

@zpfhbyx # 27
关键我两张表 好些字段不一样 , 不只是名称, 这样也有用的吗 ?

@CoooooolFrog # 28
好的 接收到了 大佬 ~

@lufeng08 # 29
再次感谢 ~
zpfhbyx
2019-10-21 13:28:11 +08:00
@JustinJie 自己逻辑映射啊,最后数据批量插入,没问题的,实际跑过,线上直接 rename 完事了如果不同实例,停双写或者反向双写,然后直接上代码就可以了,验证数据没问题,直接停双写

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/610581

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX