![]() | 1 JustinJie OP 求大佬临幸 ~ |
![]() | 2 JustinJie OP 我订 |
![]() | 3 dswyzx 2019-10-18 11:35:11 +08:00 才 400w 啊.用代码的话只要别一条一条处理也不怕 |
5 zgzhang 2019-10-18 11:39:52 +08:00 ![]() 我能想到的步骤如下: 1. 新老表双写,读老表 2. 数据迁移,400W 条数据迁移应该很快 3. 抽样对比数据,看下是否 OK 4. 灰度读数据到新表 5. 老表下线 |
![]() | 6 telami 2019-10-18 11:40:15 +08:00 ![]() 一般来说三种方式: 1、sql 脚本,能用 sql 处理的,一定用 sql,成本最低。看你的数据是不是经过大的处理,如果是要用到外部一些数据,这种就不推荐了。 2、python 脚本,好处是想咋写咋写,400 万数据也不多,用完一次就扔掉,不用重复上线。 3、代码,代码的话看场景,设计多个表,甚至需要一些外部 api 数据处理,这就只能用代码了,但是同步数据得上线,上完线还得删,就比较麻烦。 |
![]() | 7 CoCoMcRee 2019-10-18 11:41:31 +08:00 ![]() 这么点数据量, 找个 NaviCat 之类的工具 同步下就行了吧 |
8 taotaodaddy 2019-10-18 11:42:34 +08:00 via Android ![]() 如果数据处理规则很简单就用 sql 如果比较复杂就 python 走一波,用完即扔 |
9 taogen 2019-10-18 11:47:51 +08:00 ![]() 用脚本或者代码,对比两个库,生成最终的 SQL 文件。新库中,清空对应的表,执行 SQL 文件。 |
![]() | 10 xxdd 2019-10-18 12:15:02 +08:00 ![]() 写 sql 脚本吧 这个迁移应该不涉及数据比对 |
![]() | 11 JustinJie OP @zgzhang # 5 1. 新功能上线貌似就没有使用老表了, 新功能没有向之前表插入 2. 数据迁移 怎么弄 ? 我主要就是想问下这个怎么实现 之前没有弄过 3. 抽样对比数据 到时候肯定是要测的 4. 灰度是个啥意思 ? 我研究下 @telami # 6 1. 我暂时只想到了一个用程序读取老表然后插入新表的办法, sql 脚本暂时还不知道如何去写 2. python 脚本 不怎么会 没怎么研究过 我这边是弄 Java 的 3. 是的 我也是这么想的 代码比较麻烦 而且我只想到循环处理 肯定耗时性能也不好 @CoCoMcRee # 7 好的 我研究下同步工具 但是我两个表的字段 名称不一样 还有些字段不同 不知道能不能处理 @taotaodaddy # 8 好的 感谢 @taogen # 9 你的意思是用代码 生成 对应 sql 语句 然后去执行 ? 我也有这么考虑的 @xxdd # 10 嗯 都比较推荐 sql 脚本 我向下 数据比对 这个是什么意思 ? |
![]() | 12 JustinJie OP 我顶 ! 再次召唤大佬~ |
![]() | 13 JustinJie OP 再顶 ! |
![]() | 14 JustinJie OP 大佬们, 周五已经下班了吗~ ![]() |
![]() | 15 wuwukai007 2019-10-18 14:21:11 +08:00 ![]() pandas read_sql pandas to_sql 注意缺失值处理一下,应该蛮快的。 |
![]() | 16 JustinJie OP @wuwukai007 # 15 Python ? ![]() |
![]() | 17 markgor 2019-10-18 14:53:52 +08:00 ![]() 表有就不能跑同步了, 就算是 dump 出,你也 source 不了去。 所以老老本。 具就是: 1、本,建 2、本用的源。 3、和後端商做切。 4、本同步 5、後端切 6、下 7、休息 |
![]() | 18 JustinJie OP |
19 lazyfighter 2019-10-18 15:25:24 +08:00 ![]() kettle |
![]() | 20 JustinJie OP @lazyfighter # 19 ![]() |
![]() | 21 MorpheusAnchor 2019-10-18 15:38:50 +08:00 ![]() 做过类似的 几十个表吧 逻辑处理比较复杂 用 python 一条一条写的,但是可复用,因为是公司的产品,部署出去的 |
22 zgzhang 2019-10-18 16:10:17 +08:00 ![]() @JustinJie 你的服务如果在迁移期间可以停止服务,那同步数据用脚本还是 sql 都可以。但是你确定迁移期间没有数据修改的问题吗? |
![]() | 24 JustinJie OP |
![]() | 25 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 |
![]() | 26 lufeng08 2019-10-18 17:32:54 +08:00 ![]() 做过类似的,一个论坛重构,几千万条帖子,几亿个回复,跨服务器迁移,写接口实现,然后写 shell 脚本请求接口,每页多少条数据可以配置,先每页 100 条执行,根据测试结果慢慢往上加,比如加到 2000,400 万条数据,每次迁移 2000 条,也就 2000 秒执行完毕。 |
![]() | 27 justseemore 2019-10-18 18:50:43 +08:00 ![]() ![]() |
28 CoooooolFrog 2019-10-18 19:23:56 +08:00 ![]() 如果允许服务短时间不可用,简单点直接 mysqldump。 如果不允许服务不可用,双写表,数据同步完以后清理旧表,全部迁移新表。 |
![]() | 29 lufeng08 2019-10-19 12:14:57 +08:00 ![]() 有句话不知当讲不当讲,我们做了一个提升新手生产力的脚手架,也开发了好多应用上架了,都免费了,你可以参观下,可以拿来二次开发 https://www.gepardshop.com/appstore |
![]() | 30 JustinJie OP @markgor # 25 好的 我考虑的是直接拼接成 sql 脚本 给 dba 执行, 程序跑, 记录失败 log 也很有必要的样子 @lufeng08 # 26 大佬, 膜拜 ! 我去研究下 @zpfhbyx # 27 关键我两张表 好些字段不一样 , 不只是名称, 这样也有用的吗 ? @CoooooolFrog # 28 好的 接收到了 大佬 ~ @lufeng08 # 29 再次感谢 ~ |
![]() | 31 justseemore 2019-10-21 13:28:11 +08:00 ![]() @JustinJie 自己逻辑映射啊,最后数据批量插入,没问题的,实际跑过,线上直接 rename 完事了如果不同实例,停双写或者反向双写,然后直接上代码就可以了,验证数据没问题,直接停双写 |