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

2021-03-15 19:01:47 +08:00
 ligthdawn

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

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

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

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

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

非常好用,有进度显示,失败也没事,把新表删了(谨慎)重来就行
注意剩余磁盘空间大于原表
securityCoding
2021-03-16 02:24:42 +08:00
已经支持 online ddl 啦
shakoon
2021-03-16 09:07:05 +08:00
所以你知道这个帖子里说的是什么事情了吧,这都是老一辈的智慧啊
https://www.v2ex.com/t/761703
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
2021-03-16 10:20:24 +08:00
@wakzz 好奇这是咋出现的 有大事务吗? 我 5.6 经常执行千万单表倒没出现过。 想避下坑
wakzz
2021-03-16 10:54:23 +08:00
@XDJI 跟事务没关系,我们猜测是 online ddl 对大表加索引时内存没管理好,出问题的 mysql 实例只有 4G 内存,但由于一些原因拿不到日志,所以只能猜测是 OOM 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/761861

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX