MySQL NDB 数据/内存使用情况

MySQL NDB 数据/内存使用情况

我正在运行一个快速增长的 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 问题”。

希望有所帮助。

相关内容