异步删除大表

最近更新时间:2023-08-21 16:46:31

我的收藏

功能介绍

该功能主要用于删除数据文件很大的表,避免 IO 的抖动。
DROP TABLE 会将原数据库文件 (.ibd) 重命名为一个新的临时文件并返回成功,临时文件存放在 innodb_async_drop_tmp_dir 指定的目录下,并在后台分批次 truncate,每次 truncate 的文件大小由 innodb_async_truncate_size 控制,异步删表功能的开启由:innodb_async_truncate_work_enabled(MySQL 5.6)、innodb_table_drop_mode(MySQL 5.7、8.0)参数控制。
该功能无需用户操作,由内核自动完成,其原理是在删除表时,为表的数据文件在另外一个目录中创建一个硬连接。当执行 drop table 后,删除的只是该文件的一个硬连接。之后后台线程扫描到硬连接目录中有需要删除的文件,自动在后台 truncate 前面 drop 掉表数据文件。
注意:
在使用异步删除大表功能前,需要先设置参数 innodb_fast_ahi_cleanup_for_drop_table 为 ON,避免因 hash 清理过慢阻塞大表删除进度,相关参数设置操作请参见 设置实例参数

支持版本

内核版本 MySQL 5.6 20200303 及以上
内核版本 MySQL 5.7 20220715 及以上
内核版本 MySQL 8.0 20200630 及以上

适用场景

该功能适用于需要删除的表数据文件很大的场景。

使用说明

MySQL 5.6 版本,通过设置 innodb_async_truncate_work_enabled 为 ON,DROP TABLE 即会变成异步模式,默认值为 OFF。
MySQL 5.7、8.0 版本,通过设置 innodb_table_drop_mode 为 ASYNC_DROP,DROP TABLE 即会变成异步模式,默认值为 SYNC_DROP。
每次 truncate 的文件大小由 innodb_async_truncate_size 控制(MySQL 5.6 版本暂不支持)。
打开 innodb_fast_ddl 参数后,可以让异步删除大表能力更高效。
MySQL 5.6 相关参数说明
MySQL 5.7 相关参数说明
MySQL 8.0 相关参数说明
参数名
动态
类型
默认
参数值范围
说明
innodb_async_truncate_work_enabled
Yes
string
OFF
ON/OFF
是否开启异步清理大表。

参数名
动态
类型
默认
参数值范围
说明
innodb_table_drop_mode
Yes
string
SYNC_DROP
SYNC_DROP/ASYNC_DROP
是否开启异步清理大表。
innodb_async_truncate_size
Yes
int
128
128 - 168
异步 DROP TABLE 在后台每次 truncate 文件大小,单位MB。

参数名
动态
类型
默认
参数值范围
说明
innodb_table_drop_mode
Yes
string
SYNC_DROP
SYNC_DROP/ASYNC_DROP
是否开启异步清理大表。
innodb_async_truncate_size
Yes
int
128
128 - 168
异步 DROP TABLE 在后台每次 truncate 文件大小,单位MB。