V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
deepmindlab
V2EX  ›  程序员

mysql 某表 1200w 行数据, 29 个字段,想新增一个字段,是否可行?

  •  
  •   deepmindlab · 2019-12-25 19:46:06 +08:00 · 4985 次点击
    这是一个创建于 1797 天前的主题,其中的信息可能已经有所发展或是发生改变。

    mysql 某表 1200w 行数据,29 个字段,想新增一个字段,是否可行?

    19 条回复    2019-12-26 15:20:33 +08:00
    guijianshi01
        1
    guijianshi01  
       2019-12-25 19:53:57 +08:00
    MySQL 版本多少,5.6 以后和以前两码事
    ben1024
        2
    ben1024  
       2019-12-25 19:54:18 +08:00
    可行,先增加一个无默认值的字段,在进行赋值。
    有条件先锁表一下
    menduo
        3
    menduo  
       2019-12-25 19:54:56 +08:00
    可以啊,有什么不可以?
    ksedz
        4
    ksedz  
       2019-12-25 20:05:53 +08:00
    使用 pt-online-schema-change
    deepmindlab
        5
    deepmindlab  
    OP
       2019-12-25 20:14:19 +08:00
    看了下,我司居然用的 MariaDB……
    mysql> select version();
    +-----------------+
    | version() |
    +-----------------+
    | 10.0.24-MariaDB |
    +-----------------+
    1 row in set (0.00 sec)
    deepmindlab
        6
    deepmindlab  
    OP
       2019-12-25 20:16:20 +08:00
    @menduo 主要怕在执行过程中,性能下降,影响现有业务。
    deepmindlab
        7
    deepmindlab  
    OP
       2019-12-25 20:16:40 +08:00
    @guijianshi01 10.0.24-MariaDB
    sghcel
        8
    sghcel  
       2019-12-25 23:56:16 +08:00 via Android
    主要的问题是要上表元数据锁,期间的阻塞所有读写请求
    haishiwuyuehao
        9
    haishiwuyuehao  
       2019-12-26 01:07:14 +08:00   ❤️ 3
    给楼主参考下,我有次是这样处理数据的:
    copy TableA -> TableB (得到)
    TableB 完成所有操作

    TableA 重命名为 TableC
    TableB 重命名为 TableA

    读取 TableA 大于某个点的数据(时间,唯一 ID 等)写入 TableB。完成数据补充

    讲白了就是用张中间表进行操作数据。然后把中间表重命名为原始表,再把原始表的数据进行补充完整。

    表命名基本上不消耗时间,对业务基本上无影响。

    如果你担心影响线上数据库,也可以进行表同步到其他环境,完成操作再弄数据。
    xcstream
        10
    xcstream  
       2019-12-26 08:55:48 +08:00
    1200w 不是很大找个晚上随便加一下就可以了
    markgor
        11
    markgor  
       2019-12-26 09:09:28 +08:00
    工具:pt-online-schema-change
    手動:
    源表複製架構去新表;
    新表加字段;
    源表加觸發器(插入更新刪除)同步觸發到新錶;
    複製源表數據到新錶。
    PonysDad
        12
    PonysDad  
       2019-12-26 09:36:55 +08:00 via iPhone
    按 9 楼操作
    securityCoding
        13
    securityCoding  
       2019-12-26 09:37:16 +08:00
    增加临时表吧,不要直接在原表上面干
    optional
        14
    optional  
       2019-12-26 10:10:32 +08:00
    不带默认值和 not null, 1200w 也就几秒钟吧
    leorealman
        15
    leorealman  
       2019-12-26 10:25:48 +08:00
    1200w 而已,在线直接梭哈.
    Kymair
        16
    Kymair  
       2019-12-26 12:07:33 +08:00
    pt-online-schema-change 用的触发器,会对原库性能有一定影响(同步调用)

    推荐 GitHub 出品的 gh-ost 是基于 binlog 的
    https://github.com/github/gh-ost
    deepmindlab
        17
    deepmindlab  
    OP
       2019-12-26 14:01:49 +08:00
    主要是新增的同时插入默认值
    dai875939260
        18
    dai875939260  
       2019-12-26 14:25:09 +08:00
    这版本没啥好办法。新的版本好像会比较快 https://mariadb.com/kb/en/instant-add-column-for-innodb/,https://yq.aliyun.com/articles/670691 快速加列
    yincrow
        19
    yincrow  
       2019-12-26 15:20:33 +08:00
    1200w 而已,我司百亿条记录的表,加个索引也就是 10 个小时
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3190 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 13:27 · PVG 21:27 · LAX 05:27 · JFK 08:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.