在postgresql db上执行VACUUM FULL,这是停止/停止的

时间:2012-04-08 05:34:29

标签: postgresql

我正在尝试重新启动已停止/已关闭且需要VACUUM的postgresql数据库。

http://suwala.eu/blog/2010/10/09/how-to-vacuum-postgresql/

按照上面的命令序列,我似乎无法让最后一行执行正确。

$ postgres -D /var/lib/pgsql/data YOUR_DATABASE_NAME < /tmp/fix.sql  

这给我一个错误,说

postgres: invalid argument: "YOUR_DATABASE_NAME"
Try "postgres --help" for more information.

知道为什么吗?

澄清

我在服务器上使用的'YOUR_DATABASE_NAME'和数据目录是正确的。

2 个答案:

答案 0 :(得分:7)

在推荐VACUUM FULL时,问题中引用的“how-to-vacuum-postgresql”页面提供了一些非常糟糕的建议。所需要的只是一个完整的数据库真空,它只是作为数据库超级用户对整个数据库运行的VACUUM(即,你没有指定任何表名)。

VACUUM FULL根据版本的不同而不同,但它会消除数据库中保存的堆文件中的所有空间,以便快速重用,并将其发布到操作系统。这可能比恢复到可用数据库所需的最小数量要慢得多。并且由于VACUUM FULL之后的任何插入或更新都需要OS调用来重新为数据库分配空间,否则它会导致之后执行速度变慢,除非您的数据库有很多膨胀。 (虽然,如果你关闭autovacuum,它可能会形成一个可怕的形状,但你可能想先重新站起来,然后再解决这个问题。)

版本9.0之前的VACUUM FULL的另一个问题是,虽然它消除了表的堆文件中的膨胀,但它往往会在其索引文件中增加膨胀,有时会非常显着。如果您发出VACUUM FULL,通常应该使用REINDEX跟随它,以使索引恢复良好状态。

问题中引用的页面也没有注意到http://www.postgresql.org/docs/8.3/interactive/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND的PostgreSQL文档中给出的建议使用单用户模式:

  

因为系统进入后不会执行命令   安全关闭模式,唯一的方法是停止服务器   并使用单用户后端执行VACUUM。关机模式是   不是由单用户后端强制执行。请参阅postgres参考页面   有关使用单用户后端的详细信息。

正如其他人所提到的 - 几乎没有用例关闭autovacuum是有益的。使用大型表上的显式真空吸尘器来补充 autovacuum活动可能很有用,或者你可能想要调整autovacuum配置,但实际上 - 不要关闭它,否则你会看到臃肿性能下降并且您将定期遇到事务ID环绕问题。当autovacuum执行维护时发现性能受损的人有时会有一种直觉,使其在触发时不那么积极,但这通常会适得其反。通常最好调整autovacuum成本限制参数来调整工作量,而不是忽略需要维护的表。

答案 1 :(得分:6)

这似乎是PostgreSQL中的一个问题,因为根据9.08.3的文档,它应该适用于那些版本,但不是。

但是,使用--single开关可以正常工作:

postgres --single -D [path-to-data-dir] [db-name] < /tmp/fix.sql