异步删除大表

最近更新时间:2025-09-25 09:45:22

我的收藏

功能介绍

该功能主要用于删除数据文件很大的表,避免 IO 的抖动。
当执行 DROP TABLE 操作时,系统会先将原数据库对应的 .ibd 文件重命名为一个新的临时文件,并立即返回操作成功的消息。这个临时文件会被存放在由 innodb_async_drop_tmp_dir 参数指定的目录下。随后,系统会在后台分批次对该临时文件进行 truncate 处理,每次 truncate 的文件大小由 innodb_async_truncate_size 参数(MySQL 5.6 版本暂不支持,MySQL 5.7和 MySQL 8.0 支持)进行控制。
该功能无需用户操作,由内核自动完成,其原理是在删除表时,在另外一个目录中为表的数据文件创建一个硬连接。当执行 DROP TABLE 操作后,删除的只是该文件的一个硬连接。之后后台线程扫描到硬连接目录中有需要删除的文件时,会自动在后台 truncate 前面 drop 掉表的数据文件。

支持版本

内核版本 MySQL 5.6 20220303 及以上。
内核版本 MySQL 5.7 20230601 及以上。
内核版本 MySQL 8.0 20200630 及以上。

适用场景

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

使用说明

MySQL 5.6 版本使用说明
MySQL 5.7和 MySQL 8.0版本使用说明

功能开启步骤

1. 在使用异步删除大表功能前,设置参数 innodb_adaptive_hash_index 为 OFF。
2. 设置参数 innodb_async_truncate_work_enabled 为 ON,开启异步删除大表功能。关于设置参数的操作步骤请参考 设置实例参数

相关参数说明

参数名
动态
类型
默认
参数值范围
说明
innodb_adaptive_hash_index
yes
string
ON
ON/OFF
是否开启 InnoDB 自适应哈希索引。
ON:表示开启。
OFF:表示关闭。
innodb_async_truncate_work_enabled
yes
string
OFF
ON/OFF
是否开启异步删除大表。
ON:表示开启。
OFF:表示关闭。

功能开启步骤

1. 在使用异步删除大表功能前,设置参数 innodb_fast_ahi_cleanup_for_drop_table 为 ON。
2. 设置参数 innodb_adaptive_hash_index 为 OFF。
3. 设置参数 innodb_table_drop_mode 为 ASYNC_DROP,开启异步删除大表功能。关于设置参数的操作步骤请参见 设置实例参数
4. (可选步骤)设置参数 innodb_fast_ddl 为 ON,可以让异步删除大表功能更高效。此处涉及 FAST DDL 功能及相关参数,详细介绍请参见 FAST DDL

相关参数说明

参数名
动态
类型
默认
参数值范围
说明
innodb_fast_ahi_cleanup_for_drop_table
yes
string
ON
ON/OFF
是否开启自适应哈希索引的快速清理优化。
ON:表示开启,开启后可避免因 hash 清理过慢阻塞大表删除进度。
OFF:表示关闭。
innodb_adaptive_hash_index
yes
string
OFF
ON/OFF
是否开启 InnoDB 自适应哈希索引。
ON:表示开启。
OFF:表示关闭。
innodb_table_drop_mode
yes
string
ASYNC_DROP
SYNC_DROP/ASYNC_DROP
是否开启异步删除大表。
ASYNC_DROP:表示异步模式,即开启。
SYNC_DROP:表示同步模式,即关闭。
innodb_async_truncate_size
yes
int
128
128 - 168
异步删除大表功能在后台每次 truncate 的文件大小,单位MB。