mysql 某表 1200w 行数据,29 个字段,想新增一个字段,是否可行?
1 guijianshi01 2019-12-25 19:53:57 +08:00 MySQL 版本多少,5.6 以后和以前两码事 |
2 ben1024 2019-12-25 19:54:18 +08:00 可行,先增加一个无默认值的字段,在进行赋值。 有条件先锁表一下 |
3 menduo 2019-12-25 19:54:56 +08:00 可以啊,有什么不可以? |
![]() | 4 ksedz 2019-12-25 20:05:53 +08:00 使用 pt-online-schema-change |
![]() | 5 deepmindlab OP 看了下,我司居然用的 MariaDB…… mysql> select version(); +-----------------+ | version() | +-----------------+ | 10.0.24-MariaDB | +-----------------+ 1 row in set (0.00 sec) |
![]() | 6 deepmindlab OP @menduo 主要怕在执行过程中,性能下降,影响现有业务。 |
![]() | 7 deepmindlab OP @guijianshi01 10.0.24-MariaDB |
8 sghcel 2019-12-25 23:56:16 +08:00 via Android 主要的问题是要上表元数据锁,期间的阻塞所有读写请求 |
![]() | 9 haishiwuyuehao 2019-12-26 01:07:14 +08:00 ![]() 给楼主参考下,我有次是这样处理数据的: copy TableA -> TableB (得到) TableB 完成所有操作 TableA 重命名为 TableC TableB 重命名为 TableA 读取 TableA 大于某个点的数据(时间,唯一 ID 等)写入 TableB。完成数据补充 讲白了就是用张中间表进行操作数据。然后把中间表重命名为原始表,再把原始表的数据进行补充完整。 表命名基本上不消耗时间,对业务基本上无影响。 如果你担心影响线上数据库,也可以进行表同步到其他环境,完成操作再弄数据。 |
![]() | 10 xcstream 2019-12-26 08:55:48 +08:00 1200w 不是很大找个晚上随便加一下就可以了 |
![]() | 11 markgor 2019-12-26 09:09:28 +08:00 工具:pt-online-schema-change 手: 源表架去新表; 新表加字段; 源表加器(插入更新除)同步到新; 源表到新。 |
12 PonysDad 2019-12-26 09:36:55 +08:00 via iPhone 按 9 楼操作 |
13 securityCoding 2019-12-26 09:37:16 +08:00 增加临时表吧,不要直接在原表上面干 |
14 optional 2019-12-26 10:10:32 +08:00 不带默认值和 not null, 1200w 也就几秒钟吧 |
15 leorealman 2019-12-26 10:25:48 +08:00 1200w 而已,在线直接梭哈. |
![]() | 16 Kymair 2019-12-26 12:07:33 +08:00 pt-online-schema-change 用的触发器,会对原库性能有一定影响(同步调用) 推荐 GitHub 出品的 gh-ost 是基于 binlog 的 https://github.com/github/gh-ost |
![]() | 17 deepmindlab OP 主要是新增的同时插入默认值 |
![]() | 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 快速加列 |
![]() | 19 yincrow 2019-12-26 15:20:33 +08:00 1200w 而已,我司百亿条记录的表,加个索引也就是 10 个小时 |