mysql 对一个大表做在线ddl,怎么进行实施的才能尽可能降低影响

mysql 对一个大表做在线ddl,怎么进行实施的才能尽可能降低影响,第1张

可以采用中间表。假设你原始表名是“test”,那么步骤如下

建立一个和“test”一样表结构的新表,表名为test_new。create table test_new like test

将test表中数据拷贝到test_new中。insert into test_new select * from test

在test_new上执行ddl *** 作

最后将执行过ddl更新的test_new表改名为test,原test表改名为test_old。Rename table test to test_old, test_new to test

确认检查无误后drop掉test_old表

如果test表很大,在第二步会消耗很长时间,那么第二步可以以主键ID为准,采用分段导入,一次导入比如5000条数据,多次导入,这样不会对生产环境造成太大影响,假设test表上有自增主键“form_id",那么上面第二步命令变为:

insert into test_new select * from test where form_id between '1' and '5000'

insert into test_new select * from test where form_id between '5001' and '10000'

.

.

.

参考 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-12.html

在线DDL之 快速增加列(秒级别的),并不会造成业务抖动。该功能自 MySQL 8.0.12 版本引入,是由腾讯游戏DBA团队贡献,我国程序员还是挺厉害的嘛。注意一下,此功能只适用于 InnoDB 表。实际上MySQL 5.7就已支持 Online DDL,虽说大部分 DDL 不影响对表DML *** 作,但是依然会消耗非常多的时间,且占用额外的磁盘空间,并会造成主从延迟,或者影响表的查询速度。有了这个ALGORITHM=INSTANT 就可应对瞬息万变的需求了。。

ALGORITHM=INSTANT 目前对6种ddl有效:

实际试验下,使用 mysql5.7的INPLACE 算法 时间: 52s。

使用 Instant Add Column ,时间:0.39 s。 果然是秒级别添加

当然我们不需要显式指定algorithm=instantmysql会优先使用INSTANT算法来进行ddl的;若显式指定algorithm=instant 同时目标ddl不支持就会报错。如下,DROP COLUMN 时指定则报错

添加或删除virtual 列

添加或删除列默认值

修改 ENUM 定义

修改索引类型

重命名表,好像和5.7的INPLACE算法也没啥时间上的区别。INPLACE的rename table已经足够快了

还有一些特殊情况不能使用ALGORITHM=INSTANT的:

Instant Add Column只能将新字段添加到表的尾巴上,不能添加到中间!

不支持压缩表,即该表行格式不能是 COMPRESSED。

不支持包含全文索引的表;不支持临时表;不支持那些在数据字典表空间中创建的表。这些就不一一验证了。平时 *** 作时要注意下!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8602368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-18
下一篇 2023-04-18

发表评论

登录后才能评论

评论列表(0条)

保存