我正在尝试重新启动已停止/已关闭且需要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'和数据目录是正确的。
答案 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)