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

千万级的数据库怎么加上字段/索引,老哥们

  •  
  •   ligthdawn · 2021-03-15 19:01:47 +08:00 · 2528 次点击
    这是一个创建于 1350 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在网上查了资料后,发现没有特别完美的方案,在此请教老哥们有没有别的方法。

    网上资料解决方案如下: 1.创建关联表,把字段加到关联表,然后在代码中手动关联(需要修改业务代码) 2.创建新的临时表,把数据复制过去,需要停机操作,不然有可能数据不一致(需要停机) 3.使用 pt-online-schema-change 工具(没用过,不清楚)

    有没有方法可以不停机也能完美加上字段 /索引的呢,老哥们

    14 条回复    2021-03-16 10:54:23 +08:00
    MeteorCat
        1
    MeteorCat  
       2021-03-15 19:07:22 +08:00 via Android
    我们是停机维护的,找个维护时间点处理一般,这种稳定安全点,不需要什么骚操作
    killergun
        2
    killergun  
       2021-03-15 20:25:27 +08:00
    先分库分表?
    sagaxu
        3
    sagaxu  
       2021-03-15 20:51:43 +08:00 via Android
    mysql 5.6 都发布 8 年了,怎么还在用 5.5 以下版本?
    bagheer
        4
    bagheer  
       2021-03-15 22:19:52 +08:00
    我有一个 3 亿的表,停掉建新表导入数据是最稳的,不要使用 3.
    Jooooooooo
        5
    Jooooooooo  
       2021-03-15 22:22:19 +08:00
    建新表, 复制数据, rename.
    Ptu2sha
        6
    Ptu2sha  
       2021-03-15 23:43:41 +08:00
    不能停的话应该新建表 代码同步数据
    luckyrayyy
        7
    luckyrayyy  
       2021-03-15 23:56:29 +08:00 via iPhone
    为啥弄个新表一定要停机,新数据双写,老数据慢慢同步过去,几个小时够了吧?
    sagaxu
        8
    sagaxu  
       2021-03-16 00:04:57 +08:00 via Android
    @luckyrayyy 问题是 innodb 加字段加索引不会影响正常读写,为什么要停机?
    ksedz
        9
    ksedz  
       2021-03-16 00:11:56 +08:00
    mysql 的话 pt 可以

    原理是建一个新表,在原表上加增删改的触发器,数据修改会自动同步到新表
    新表开始跟原表的数据,跟上进度后直接 rename 替换原表,达到不停机加索引的目的

    非常好用,有进度显示,失败也没事,把新表删了(谨慎)重来就行
    注意剩余磁盘空间大于原表
    securityCoding
        10
    securityCoding  
       2021-03-16 02:24:42 +08:00 via Android
    已经支持 online ddl 啦
    shakoon
        11
    shakoon  
       2021-03-16 09:07:05 +08:00
    所以你知道这个帖子里说的是什么事情了吧,这都是老一辈的智慧啊
    https://www.v2ex.com/t/761703
    wakzz
        12
    wakzz  
       2021-03-16 09:25:04 +08:00
    @securityCoding online ddl 对于小表可以,千万甚至上亿的大表慎用。
    我们公司之前有个千万级的单表,用 online ddl 加索引后前十来分钟索引正常添加,看监控 IO 和 CPU 占用比较高,但十来分钟后 mysql 突然无响应,然后软重启,所有 mysql 线程被中断,客户端 TCP 连接全部中断,索引也加失败了。
    这个现在能在 5.7 的版本稳定复现(没试过 8.0 ),所以对大表的索引操作还是需要谨慎使用 online ddl 的,这玩意不是银弹。
    XDJI
        13
    XDJI  
       2021-03-16 10:20:24 +08:00
    @wakzz 好奇这是咋出现的 有大事务吗? 我 5.6 经常执行千万单表倒没出现过。 想避下坑
    wakzz
        14
    wakzz  
       2021-03-16 10:54:23 +08:00
    @XDJI 跟事务没关系,我们猜测是 online ddl 对大表加索引时内存没管理好,出问题的 mysql 实例只有 4G 内存,但由于一些原因拿不到日志,所以只能猜测是 OOM 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5154 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:22 · PVG 09:22 · LAX 17:22 · JFK 20:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.