我正在运行快速增长的NDB群集,并且在两个数据节点的每一个上都有有限的(8GB)物理内存。 我担心我将耗尽数据内存,所以我开始删除旧数据。 但是,删除并没有显示出使用统计数据的显着减less。 任何想法/解释为什么?
以下是统计数据:
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
为什么数据长度保持高?
Innodb不会将可用空间移交给文件系统,而是将来会被插入。 如果您在configuration中使用innodb_file_per_table参数,则可以通过发出OPTIMIZE TABLE来回收可用空间。 如果不是我知道的唯一方法是导出数据库,请停止mySQL并手动删除数据文件,然后再次导入数据库。
SO上有一个非常类似的问题 。
如果可能,你应该重新标题你的问题:标题引用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集群问题”,MySQL Cluster NDB 6.x和MySQL Cluster NDB 7.x。
希望有所帮助。