使用 pt-online-schema-change 在单次操作中清除行并回收磁盘空间

使用 pt-online-schema-change 在单次操作中清除行并回收磁盘空间

💡 原文英文,约2600词,阅读约需10分钟。
📝

内容提要

PT-1751为pt-online-schema-change添加了一个新参数,允许用户通过将所需行复制到新表并删除原始表来执行“反向清除”。与传统的清除方法相比,这样可以节省时间和资源。文章提供了如何使用此功能的示例,并建议检查缺失的行并验证清除是否成功。这个新功能减少了清除行所需的时间和工作量,并以最小的影响和锁定回收空间。

🔎

延伸解读

反向清除的适用场景与优势

当需要从超大表中清除大部分行、仅保留少量数据时,传统方法需先用 pt-archiver 删除大量行,再重建表,可能耗时数天并严重冲击缓冲池。新方法利用 pt-online-schema-change 的 --where 参数,仅将需保留的行复制到新表,再通过重命名交换并删除旧表,从而减少 DELETE 操作和缓冲池污染,更快回收空间。

操作流程与关键注意事项

使用 --where 指定保留条件后,pt-osc 会创建新表并复制符合条件的行,同时触发器保持新表同步。完成后需手动执行 RENAME TABLE 交换表名,此操作原子且会等待事务。之后应通过 LEFT JOIN 检查旧表中有而新表缺失的 ID,并对比 MIN/MAX 日期验证清除效果。确认无误后再删除旧表。

删除旧表时的潜在风险

删除旧表虽能立即回收空间,但需注意 InnoDB 的 Adaptive Hash Index 可能引发问题:若 AHI 很大,DROP TABLE 时可能因扫描 AHI 而阻塞流量,导致明显停顿。建议在业务低峰期执行,并参考 MySQL Bug #91977 了解详情。

❓

Q&A

pt-online-schema-change的新参数有什么作用?

新参数–where允许用户执行反向清除,通过复制所需行到新表并删除原始表,节省时间和资源。

传统的清除方法有哪些缺点?

传统清除方法需要两步,可能耗时数天,并且会影响缓冲池,导致性能下降。

如何使用pt-online-schema-change进行反向清除?

使用pt-online-schema-change命令,指定–where参数以复制所需的行,然后手动交换表。

反向清除的测试过程是怎样的?

测试过程包括创建数据库和表,插入数据,验证触发器工作,并运行pt-online-schema-change命令。

如何确保新旧表之间没有缺失的行?

可以通过LEFT JOIN查询旧表和新表,检查ID是否匹配,以确保没有缺失行。

使用新参数–where有什么优势?

使用新参数可以减少清除行所需的时间和工作量,并以最小的影响和锁定回收空间。

🏷️

标签

➡️

继续阅读