如何在MemSql中为已删除的数据库释放空间

时间:2015-09-18 15:31:31

标签: scala memsql

我是MemSQL的新手。我在集群中的MemSQL中创建了一个数据库和表,其中包含5个叶节点和2个聚合器节点。 Spark在同一个集群上运行。 一切都处于默认模式。插入的数据和删除相同。 select *不返回任何内容。但是当我看到web clusterUI时,每个叶子节点仍然消耗大约6TB的磁盘空间。

enter image description here enter image description here 磁盘容量说明“这是MemSQL使用的磁盘空间相对于可用磁盘总空间的数量。当它已满时,不能创建快照,事务日志或列存储数据”。

通过这个描述,我假设6TB以上的磁盘空间是因为MemSQL的使用。

请一些人澄清一下

  1. 默认情况下MemSQL是否也会将数据写入磁盘?
  2. 删除内容和删除表后,是否删除写在磁盘上的数据?
  3. 如何释放MemSQL消耗的磁盘空间?我要删除哪个目录?我发现目录“/ var / lib / memsql / leaf-3306”包含此叶节点的所有memsql工件。

2 个答案:

答案 0 :(得分:5)

6TB的使用可能是因为MemSQL,或者可能是因为Spark或其他一些进程。 MemSQL ops报告总磁盘使用情况,而不是MemSQL使用的磁盘(工具提示略有误导)。

1)Rowstore表(没有CLUSTERD COLUMNSTORE索引的表)每次写入都会将日志写入磁盘。当日志变得很大时,日志会合并到快照中,默认情况下,我们会保留最后两个快照文件。因此,两个快照中较旧的一个可能包含您删除的数据。您可以使用SNAPSHOT <dbName>触发新快照,这样可以让GC清理旧的(可能是大的)快照。

2)快照和日志是每个数据库,而不是每个表。删除表不会触发快照/日志清理,但是删除数据库或触发新快照将会执行。

3)您可能不应该手动删除数据目录。 DROP DATABASE <db_name>将删除与该数据库关联的所有数据。

对于列存储表,故事略有不同,但我假设&#34;一切都是默认的&#34;表示没有列存储表。

答案 1 :(得分:-2)

在GC被触发之前,占用的内存将不会被释放。 Memsql将所有数据保存在内存中。即使我们删除表,数据库,行等,如果没有发生GC,内存也将无法使用。 从命令提示符强制执行GC,它将释放内存:

<强> memsql&GT;触发完整的gc flush;

在触发命令之前和之后比较 free -m 。 你会看到差异:)