PostgresQL为膨胀表自动化VACUUM FULL

Gee*_*nte 7 postgresql nagios postgresql-9.1

我们有一个使用PostgreSQL数据库服务器的产品,该服务器部署在几百个客户端上.多年来,他们中的一些人已经收集了数十亿字节的数据.因此,在下一版本中,我们将引入自动清理程序,该程序将在夜间批处理作业中逐步归档和删除旧记录.

如果我理解正确,autovacuum将启动并分析和重新组织元组,因此性能将与存在较少记录时的性能相同.

如果我理解正确的话,实际的磁盘空间将不会释放,因为只有VACUUM FULL才会发生,而且不会由autovacuum触发.

所以我在考虑一个可以做到这一点的自动化流程.

我在http://wiki.postgresql.org/wiki/Show_database_bloat找到了nagios check_postgres使用的膨胀视图.

这个观点有什么好处吗?我是否理解如果tbloat > 2,它可以使用VACUUM FULL?如果ibloat太高,它可以使用REINDEX吗?

以下作业的任何注释作为每日批处理作业运行?

  • vacuumdb -Z mydatabase #vacuum with analyze-only
  • select tablename from bloatview order by tbloat desc limit 1
  • vacuumdb -f -t tablename mydatabase
  • select tablename, iname from bloatview order by ibloat desc limit 1
  • reindexdb -t tablename -i iname mydatabase

当然,我仍然需要将它包装在crontab中的一个漂亮的perl脚本中(我们使用的是ubuntu 12),或者postgresql是否有某种调度程序我可以用它来做?

或者这总是过度杀伤,是否有一个更简单的程序?

Tom*_*zky 5

您可能不需要它。最好一次执行一次-在第一次归档工作之后,您将获得磁盘空间,但是在此之后,您的日常归档工作和自动清理将防止死元组膨胀。

另外,vacuum full通常也更好cluster table_name using index_name; analyze table_name。这将根据索引对行进行重新排序。这样,相关的表行可以在物理上保存在磁盘附近,从而限制了磁盘查找(在传统磁盘驱动器上很重要,而在SSD上基本上不相关)和典型查询的读取次数。

请记住,这两个vacuum fullcluster会使你的表无法使用,而它们运行。