我们有一个MySQL表,其中DATA_FREE已经增长到TB的大小。我们无法在这样大的表上运行优化,因为这样的表有数十亿行。我们在较低的环境中做了POC,在那里我们有72.5GB的DATA_FREE和254 M的记录。我们禁用了索引并在表上运行了优化命令,整个优化查询需要65分钟才能完成,包括索引恢复时间。我们怀疑这将需要大量的时间生产,我们不能有这么长的停工时间。此表具有频繁的读、写和删除。
我们还计划将MySQL服务器从5.x升级到8.x。ops团队通过创建现有数据库的read副本来完成此过程。我想知道在阅读复制创建过程中,它是否释放了DATA_FREE?
发布于 2023-03-07 17:30:54
不是的。
RDS读取副本是从源的快照创建的。也就是说,对源上的表空间进行字节对字节的物理备份,完成这些表空间中存在的任何数据碎片。
如果您需要在不停机的情况下消除data_free,则使用pt-在线-模式更改。它实际上比优化表花费的时间更长,但这并不是一个问题,因为您可以在表工作时继续读和写表。
发布于 2023-03-28 17:36:43
你是如何进入需要OPTIMIZE的情况的?如果是因为“大删除”,那么有几种更好的方法-- http://mysql.rjweb.org/doc.php/deletebig
如果上次创建或更改表时关闭了innodb_file_per_table,则该度量将讨论共享存储,而不是特定的表。
如果您没有关闭索引,您的OPTIMIZE可能运行得更快;它将重建索引,并且可能比您的速度更快。
如果删除是为了清除“旧”数据,那么PARTITION BY RANGE(TO_DAYS())可能是今后最好的选择。分区。如果删除的是其他内容,请详细说明。
https://dba.stackexchange.com/questions/324477
复制相似问题