V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
twg
V2EX  ›  问与答

有一个问题,有一个很大的表,需要添加一列,有什么好的办法?

  •  
  •   twg · 2020-10-22 16:55:46 +08:00 · 1173 次点击
    这是一个创建于 1253 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司有些表数据量特别大,大概 3000w,现在需要增加一列,如果直接使用 alter,需要 10min 才能完成,这是完全不能接受的。所以除了新建表和停机,还有什么好的方法?

    PS:数据库使用的事 MySQL 。

    12 条回复    2020-10-23 10:06:01 +08:00
    clf
        1
    clf  
       2020-10-22 17:33:35 +08:00
    读写频繁的话主从切换。

    读写频率一般的话可以考虑一下 pt-osc,gh-ost 这两个工具增加字段。

    最新的 MYSQL8 我记得是可以实现秒级添加字段。
    qiayue
        2
    qiayue  
       2020-10-22 17:36:16 +08:00
    加列是一个很频繁的操作吗?
    如果几个月一次的话,1 小时也可以接受。
    twg
        3
    twg  
    OP
       2020-10-22 17:46:31 +08:00
    @lychs1998 我们用的是 mysql5.6 版本
    twg
        4
    twg  
    OP
       2020-10-22 17:47:21 +08:00
    @qiayue 加列不是很频繁,但是会锁住表吧?1 个小时肯定不能接受。
    skymei
        5
    skymei  
       2020-10-22 17:49:50 +08:00
    同样有疑问,蹭个贴
    x4400177
        6
    x4400177  
       2020-10-22 17:54:22 +08:00
    停服
    CrazyEight
        7
    CrazyEight  
       2020-10-22 17:57:08 +08:00
    高性能 MySQL 讲到过:
    ( 1 )不想担风险:在一台不提供服务的机器完成新表的数据同步,再切换机器。
    ( 2 )锁住表,拷贝.frm 文件并做出对应修改,再用新的.frm 文件替换掉旧的.frm 文件。有风险。
    twg
        8
    twg  
    OP
       2020-10-22 17:57:19 +08:00
    @x4400177 之前有一次就是停服来操作的。
    redtea
        9
    redtea  
       2020-10-22 17:58:33 +08:00 via iPhone
    借此机会分表吧,500 万就该分了。
    CODEWEA
        10
    CODEWEA  
       2020-10-22 18:01:10 +08:00
    原表叫 a,复制一个表叫 b,然后给这个表 b 增加列,最后补全表 b 数据
    CODEWEA
        11
    CODEWEA  
       2020-10-22 18:02:34 +08:00
    其实就是空间换时间
    twg
        12
    twg  
    OP
       2020-10-23 10:06:01 +08:00
    @CODEWEA 但是这个是不是需要一个从 a 表切换到 b 表的过程?那么还需要修改相应代码所连接的表?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2690 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:47 · PVG 23:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.