各位大佬们 征求意见 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 A 生成的内容
JustinJie
V2EX    程序员

各位大佬们 征求意见

  •  
  •   JustinJie 2019-10-18 11:19:02 +08:00 3871 次点击
    这是一个创建于 2184 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 菜鸡一枚, 接到一个数据迁移的需求
    2. 新功能重构上线, 要把老库里面的表数据迁移到新库的表里, 两张表字段大体上一样也有一些区别, 表里面大概 40 个字段
    3. 数据库是 mysql, 老库的数据量大概在 400 多万条的亚子
    4. 现在正在考虑方案, 奈何之前没接触过类似的功能, 找 v2 大佬请教, 用什么样的方式比较好, 是用代码实现, 还是直接脚本之类的 ? 如果可以的话可以说的稍微具体点
    31 条回复    2019-10-21 13:28:11 +08:00
    JustinJie
        1
    JustinJie  
    OP
       2019-10-18 11:23:07 +08:00
    求大佬临幸 ~
    JustinJie
        2
    JustinJie  
    OP
       2019-10-18 11:29:49 +08:00
    我订
    dswyzx
        3
    dswyzx  
       2019-10-18 11:35:11 +08:00
    才 400w 啊.用代码的话只要别一条一条处理也不怕
    JustinJie
        4
    JustinJie  
    OP
       2019-10-18 11:36:54 +08:00
    @dswyzx # 3 不一条一条处理 ? 代码不就 for 循环吗 ? 还有什么方法 ?
    zgzhang
        5
    zgzhang  
       2019-10-18 11:39:52 +08:00   1
    我能想到的步骤如下:
    1. 新老表双写,读老表
    2. 数据迁移,400W 条数据迁移应该很快
    3. 抽样对比数据,看下是否 OK
    4. 灰度读数据到新表
    5. 老表下线
    telami
        6
    telami  
       2019-10-18 11:40:15 +08:00   2
    一般来说三种方式:
    1、sql 脚本,能用 sql 处理的,一定用 sql,成本最低。看你的数据是不是经过大的处理,如果是要用到外部一些数据,这种就不推荐了。
    2、python 脚本,好处是想咋写咋写,400 万数据也不多,用完一次就扔掉,不用重复上线。
    3、代码,代码的话看场景,设计多个表,甚至需要一些外部 api 数据处理,这就只能用代码了,但是同步数据得上线,上完线还得删,就比较麻烦。
    CoCoMcRee
        7
    CoCoMcRee  
       2019-10-18 11:41:31 +08:00   1
    这么点数据量, 找个 NaviCat 之类的工具 同步下就行了吧
    taotaodaddy
        8
    taotaodaddy  
       2019-10-18 11:42:34 +08:00 via Android   1
    如果数据处理规则很简单就用 sql
    如果比较复杂就 python 走一波,用完即扔
    taogen
        9
    taogen  
       2019-10-18 11:47:51 +08:00   1
    用脚本或者代码,对比两个库,生成最终的 SQL 文件。新库中,清空对应的表,执行 SQL 文件。
    xxdd
        10
    xxdd  
       2019-10-18 12:15:02 +08:00   1
    写 sql 脚本吧 这个迁移应该不涉及数据比对
    JustinJie
        11
    JustinJie  
    OP
       2019-10-18 13:45:37 +08:00
    @zgzhang # 5
    1. 新功能上线貌似就没有使用老表了, 新功能没有向之前表插入
    2. 数据迁移 怎么弄 ? 我主要就是想问下这个怎么实现 之前没有弄过
    3. 抽样对比数据 到时候肯定是要测的
    4. 灰度是个啥意思 ? 我研究下
    @telami # 6
    1. 我暂时只想到了一个用程序读取老表然后插入新表的办法, sql 脚本暂时还不知道如何去写
    2. python 脚本 不怎么会 没怎么研究过 我这边是弄 Java 的
    3. 是的 我也是这么想的 代码比较麻烦 而且我只想到循环处理 肯定耗时性能也不好
    @CoCoMcRee # 7
    好的 我研究下同步工具 但是我两个表的字段 名称不一样 还有些字段不同 不知道能不能处理
    @taotaodaddy # 8
    好的 感谢
    @taogen # 9
    你的意思是用代码 生成 对应 sql 语句 然后去执行 ? 我也有这么考虑的
    @xxdd # 10
    嗯 都比较推荐 sql 脚本 我向下 数据比对 这个是什么意思 ?
    JustinJie
        12
    JustinJie  
    OP
       2019-10-18 13:49:03 +08:00
    我顶 !
    再次召唤大佬~
    JustinJie
        13
    JustinJie  
    OP
       2019-10-18 13:59:57 +08:00
    再顶 !
    JustinJie
        14
    JustinJie  
    OP
       2019-10-18 14:18:56 +08:00
    大佬们, 周五已经下班了吗~
    wuwukai007
        15
    wuwukai007  
       2019-10-18 14:21:11 +08:00   1
    pandas read_sql

    pandas to_sql
    注意缺失值处理一下,应该蛮快的。
    JustinJie
        16
    JustinJie  
    OP
       2019-10-18 14:23:39 +08:00
    @wuwukai007 # 15 Python ? 我先看下
    markgor
        17
    markgor  
       2019-10-18 14:53:52 +08:00   1
    表有就不能跑同步了,
    就算是 dump 出,你也 source 不了去。
    所以老老本。
    具就是:
    1、本,建
    2、本用的源。
    3、和後端商做切。
    4、本同步
    5、後端切
    6、下
    7、休息
    JustinJie
        18
    JustinJie  
    OP
       2019-10-18 15:20:04 +08:00
    @markgor # 17 大佬懂我
    不过我还有点疑问就是 我一条语句写一个 insert into 这样的行吗 ?
    还是有更好的什么写法和形式吗 ?
    lazyfighter
        19
    lazyfighter  
       2019-10-18 15:25:24 +08:00   1
    kettle
    JustinJie"
        20
    JustinJie  
    OP
       2019-10-18 15:31:18 +08:00
    @lazyfighter # 19 好的 我看下
    MorpheusAnchor
        21
    MorpheusAnchor  
       2019-10-18 15:38:50 +08:00   1
    做过类似的 几十个表吧 逻辑处理比较复杂 用 python 一条一条写的,但是可复用,因为是公司的产品,部署出去的
    zgzhang
        22
    zgzhang  
       2019-10-18 16:10:17 +08:00   1
    @JustinJie 你的服务如果在迁移期间可以停止服务,那同步数据用脚本还是 sql 都可以。但是你确定迁移期间没有数据修改的问题吗?
    markgor
        23
    markgor  
       2019-10-18 16:11:15 +08:00   1
    @JustinJie 要求就一,有要求就 N ,插入 N 步操作。
    JustinJie
        24
    JustinJie  
    OP
       2019-10-18 16:55:07 +08:00
    @zgzhang # 22
    服务在晚上发布, 一般都没有什么用户的了, 应该是没有问题的

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

    因是一年前的事,大概就些,
    你的境我不清楚,我是地的,量不算大,好像十,

    注意下超和新的格式就可以了( mysqlmax_allowed_packet,有 MYSQL 特性是否一致)。
    了,mysql 有 max_connections。

    ,你不缺的就一跑,失的起,然後打牌的打牌,喝酒的喝酒,跳舞的跳舞,每一看看有出就可以了。最後跑完就看看失的 log 面有 SQL 句,量不多直接就在新行面的句。

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

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

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

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

    @lufeng08 # 29
    再次感谢 ~
    justseemore
        31
    justseemore  
       2019-10-21 13:28:11 +08:00   1
    @JustinJie 自己逻辑映射啊,最后数据批量插入,没问题的,实际跑过,线上直接 rename 完事了如果不同实例,停双写或者反向双写,然后直接上代码就可以了,验证数据没问题,直接停双写
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1015 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:54 PVG 06:54 LAX 15:54 JFK 18:54
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86