我正在运行一个快速增长的 NDB 集群,两个数据节点上的物理内存有限(8GB)。我担心数据内存会用完,所以我开始删除旧数据。但是,删除操作并没有显示使用率统计数据有任何显著的减少。有什么想法/解释吗?
以下是之前的统计数据:
ndb_mgm> all report mem
Node 11: Data usage is 44%(85073 32K pages of total 192000)
Node 11: Index usage is 22%(20428 8K pages of total 89632)
Node 12: Data usage is 43%(83800 32K pages of total 192000)
Node 12: Index usage is 22%(20425 8K pages of total 89632)
这是我删除大约三分之一数据后的统计数据。
ndb_mgm> all report mem
Node 11: Data usage is 41%(80557 32K pages of total 192000)
Node 11: Index usage is 15%(14223 8K pages of total 89632)
Node 12: Data usage is 41%(79274 32K pages of total 192000)
Node 12: Index usage is 15%(14226 8K pages of total 89632)
如您所见,索引使用量比数据使用量减少得更多。还需要做什么来回收我删除的数据的空间吗?
PS 我主要从行数较大的表中删除了行。当我比较表统计信息时,我在清理的其中一个表上注意到了这一点:
Rows | Avg_row_length | Data_length
Before 1858558 | 88 | 399147008
After 241832 | 88 | 398884864
为什么数据长度一直很高?
答案1
Innodb
不会将可用空间移交给文件系统,而是供将来的插入使用。如果您正在使用表 1. innodb_file_per_table参数在您的配置中,您可以通过发出来回收可用空间OPTIMIZE TABLE
。如果不是,我知道的唯一方法是导出数据库,停止 mySQL 并手动删除数据文件,然后再次导入数据库。
有一个非常相似的问题在 SO 上。
答案2
如果可能的话,你应该重新命名你的问题:标题引用了 Innodb,但你的问题是关于 NDB 的。
无论如何,当您在 NDB 中进行删除时,它只会释放内存空间以供该表将来使用。如果您真的想释放它,您可以滚动重启数据节点或优化表(取决于您的版本)。请参阅:http://docs.oracle.com/cd/E17952_01/refman-5.1-en/mysql-cluster-limitations-limits.html
相关引述:“NDB 表上的 DELETE 语句使以前由已删除行使用的内存仅可供同一表上的插入重新使用。但是,可以通过执行集群的滚动重启使此内存可供一般重新使用。请参见第 17.5.5 节“执行 MySQL 集群的滚动重启”。
从 MySQL Cluster NDB 6.3.7 开始,可以使用 OPTIMIZE TABLE 克服此限制。有关更多信息,请参见第 17.1.6.11 节“MySQL 5.1、MySQL Cluster NDB 6.x 和 MySQL Cluster NDB 7.x 中解决的先前 MySQL Cluster 问题”。
希望有所帮助。