我尝试使用innodb=1 https://mariadb.com/kb/en/library/defragmenting-innodb-tablespaces/来整理表。
但这是一次糟糕的经历:-表上锁-没有一个好的碎片整理结果(总是没有数据在表上)
所以我使用percona工具https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html
并且取得了很好的结果,没有锁,也没有更多的数据在表上自由。(但需要磁盘上的空间来复制表)
但是第一种方法有什么问题呢?
最新情况:

发布于 2018-12-26 18:49:36
神话破坏者。
碎片整理是一个基本不适用于InnoDB的概念。很少值得使用OPTIMIZE TABLE或其他技术来整理。
InnoDB片段和/或具有“空闲”空间的方式有几种:
SHOW TABLE STATUS只显示了“免费”空间的一部分。此外,它通常会表明4/5/6/7 7MB对于非小型桌子是免费的,因为在“范围”内保留了空间以供将来采取行动。
为什么是碎片?
TABLE STATUS提供的)它显示了0.9GB的“数据”,但却显示了一个巨大的6.9GB“免费”。(我猜想STATUS是在OPTIMIZE之后拍摄的?)这种情况可以在多种情况下存在:
innodb_file_per_table = OFF,在这种情况下,“空闲”是ibdata1中有多少空闲空间,与表无关。(你说这不是你的案子。)PARTITIONs。每个分区总是显示一些“空闲”空间;它的加起来可以达到6.9GB。( PARTITIONing不明智的原因之一就是追求。)DELETEd表的大部分行。这可能是一个非常缓慢的过程。创建一个新表、复制要保留的行、然后重命名以使表就位会更快。而且,你猜怎么着,这种方法会给你免费的“优化”。根据手册,MariaDB中的碎片整理功能:
注意,表空间文件(包括ibdata1)不会因为碎片整理而收缩,但是由于使用的数据页较少,在InnoDB缓冲池中将获得更好的内存利用率。
所以..。
https://dba.stackexchange.com/questions/225789
复制相似问题