在 innodb_file_per_table=ON 且 buffer_pool 极大(30G+)时,DROP TABLE 需遍历整个 Buffer Pool 清理脏页,持有 table_cache 锁阻塞所有 DML,导致实例级 Hang。
改引擎为 MyISAM 无效:ALTER TABLE ... ENGINE=MyISAM 本质是建新表+拷贝数据+删旧表,同样触发 Buffer Pool 遍历。
| 方案 | 原理 | 适用场景 | 风险/成本 |
|---|---|---|---|
| 1. 分批删除 + 重建 | 脚本循环 DELETE ... LIMIT 10000 避免长事务,最后 TRUNCATE 或 DROP |
可接受停机窗口、表无外键依赖 | 耗时长,需控制删除频率 |
| 2. Slave 上操作 + 切主 | 在从库执行 DROP,完成后提升为主 | 高可用架构、有成熟切换流程 | 需双主/主从、切换风险 |
3. Percona innodb_lazy_drop_table |
延迟清理 Buffer Pool,后台异步释放 | Percona 5.1.58+、可容忍已知 Bug | 社区版不支持、Bug 较多慎用 |
| 4. 硬链接法 (OS Hard Link) | 对 .ibd 建硬链接,DROP 仅减链接计数,数据块延迟释放 |
文件系统支持硬链接、极大表紧急止血 | 需 root 权限、后续需手动清理孤儿文件 |
# 在数据目录下
ln test.ibd test.ibd.hardlink
# 执行 DROP TABLE test;
# 此时磁盘空间未释放,但表已不可见
# 维护窗口手动删除 test.ibd.hardlink 释放空间
PARTITION BY RANGE),分区级 DROP PARTITION 秒级完成innodb_buffer_pool_size 合理性,避免过大导致启停/操作延迟