在mariadb中删除数百万条记录后如何释放硬盘空间

Bla*_*uez 5 mysql mariadb ubuntu disk-space master-slave-replication

我们有一个应用程序,我们每隔几秒接收一次信息,我们将这些信息记录在一个称为事件的表中,该表目前重达 240 GB,这是迄今为止我们拥有的最大的。

前段时间我们删除了记录以保留特定日期的记录。不久前我们发现存储数据库的服务器正在填满磁盘,删除数百万条记录后,磁盘空间保持不变。

在网上搜索我们发现执行以下查询 ALTER TABLE tablename ENGINE = Innodb; 将释放已删除记录的已用空间。

但是我们遇到的问题是,由于我们有大于200G的表,所以该命令执行时间较长,导致新信息因阻塞而无法及时插入。

我们找到的选项如下:

  • 制作数据库的副本(主 - 从),从我们在这里看到的情况来看,我们必须对主数据库进行备份并将其传递给从数据库,以便它开始从发生的地方进行复制,为此我们有详细信息是的,我们不想关闭当前的服务器,以便我们的服务保持功能,但我们也不希望丢失任何信息。我们在前一天对服务器进行了备份,我们可以使用它,但是我们如何恢复一天内未插入的信息,如果创建了该备份,那么该备份有什么内容以及从服务器是从哪里配置的?
  • 备份我们当前的数据库并将其上传到新服务器,以免使用 ALTER TABLE tablename ENGINE = Innodb 命令,为此我们必须关闭服务器。
  • 执行 ALTER TABLE tablename ENGINE = Innodb 命令,我们执行测试,在我们作为测试的 10 GB 表中,执行了大约 25 分钟。

有没有更优化的方法来释放空间,而不必取消我们的服务并且不会丢失信息?或者如果必须在最短的时间内完成?

此查询 ALTER TABLE tablename ENGINE = Innodb 知道它是否锁定表。

生产中的环境信息: Ubuntu Ubuntu 16.04.3 LTS mysql Distribution 10.1.21-MariaDB 所有表的类型均为 Engine = Inodb

非常感谢

Bil*_*win 2

InnoDB 表空间文件从不收缩是正确的。删除大量行后,大文件中可能会有未使用的空间,但该文件仍然占用文件系统上的大量空间。

缩小文件的唯一方法是将剩余数据复制到新的表空间,然后删除原始表空间。这就是您所描述的 ALTER 语句的作用。该声明的替代形式是:

ALTER TABLE <name> FORCE;

OPTIMIZE TABLE <name>;
Run Code Online (Sandbox Code Playgroud)

他们都做同样的事情。我喜欢带有 FORCE 的那个,因为我最清楚它在做什么。

将大量数据复制到新表空间需要很长时间,并且会在表运行时阻止对该表的访问。

我过去在一些工作中所做的就是使用免费工具pt-online-schema-change来运行此任务,而不会阻止对表的访问。事实上,它可能比直接运行 ALTER TABLE 花费的时间更长,但由于它不会阻止访问,因此不会导致中断,因此没有人会因为花费很长时间而感到不安。我们在比您描述的大得多的桌子上运行了这个程序,大到需要几天的时间才能完成。

您使用 MariaDB。我不知道,而且我个人也从未将 pt-online-schema-change 与 MariaDB 一起使用过。但我从其他用户那里了解到,它的工作原理是相同的,因为 MariaDB 与 MySQL 非常相似,因此 pt-online-schema-change 所需的功能是相同的。MariaDB 与 MySQL 不是同一个产品,但在这种情况下它已经足够接近了。