对已停止/关闭的postgresql数据库执行真空完全

对已停止/关闭的postgresql数据库执行真空完全,postgresql,Postgresql,我正在尝试重新启动一个已停止/关闭的postgresql db,它需要一个真空 按照上面的命令序列,我似乎无法正确执行最后一行 $ postgres -D /var/lib/pgsql/data YOUR_DATABASE_NAME < /tmp/fix.sql 知道为什么吗 澄清 “您的数据库名称”和我在服务器上使用的数据目录是正确的 这似乎是PostgreSQL中的一个问题,根据的文档,它应该适用于这些版本,但不适用 但是,使用--single switch可以使其工作: po

我正在尝试重新启动一个已停止/关闭的postgresql db,它需要一个
真空

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

$ postgres -D /var/lib/pgsql/data YOUR_DATABASE_NAME < /tmp/fix.sql  
知道为什么吗

澄清


“您的数据库名称”和我在服务器上使用的数据目录是正确的

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

但是,使用--single switch可以使其工作:

postgres --single -D [path-to-data-dir] [db-name] < /tmp/fix.sql  
postgres--single-D[path to data dir][db name]
问题中引用的“如何抽真空postgresql”页面在建议
完全抽真空时给出了一些非常糟糕的建议。所需要的只是一个完整的数据库真空,它只是一个作为数据库超级用户对整个数据库运行的
真空(即,您不指定任何表名)

VACUUM-FULL
的工作方式因版本而异,但它消除了堆文件中的所有空间,这些空间由数据库保存以供快速重用,并将其释放到操作系统中。这可能比返回可用数据库所需的最低速度要慢得多,数量级。而且,由于
真空满负荷后的任何插入或更新都需要操作系统调用来为数据库重新分配空间,因此这可能会导致以后的执行变慢,除非您的数据库出现大量膨胀。(虽然,如果您关闭自动真空,它的形状可能会很糟糕,但您可能希望先重新站起来,然后再解决这个问题。)

9.0版之前的
VACUUM-FULL
的另一个问题是,虽然它消除了表堆文件中的膨胀,但它往往会增加索引文件中的膨胀,有时会急剧增加。如果发出
VACUUM FULL
,通常应随后发出
REINDEX
,以使索引恢复良好状态

问题中引用的页面也没有注意到PostgreSQL文档中给出的使用单用户模式的建议:

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


正如其他人提到的——几乎没有关闭自动真空有益的用例。用大型表上的显式真空来补充autovacuum活动可能很有用,或者您可能想要调整autovacuum配置,但实际上--不要关闭它,否则您将看到saps性能膨胀,并且您将定期遇到事务ID环绕问题。当autovacuum执行维护时,注意到性能受到影响的人有时会本能地降低触发时的攻击性,但这通常会适得其反。一般来说,最好调整autovacuum成本限制参数以加快工作进度,而不是让它忽略需要维护的表。

告诉我你没有实际放置
你的数据库名称
当然没有:-)我自己的数据库名称当然!我对desaster恢复不太熟悉,但sql文件不应该通过管道传输到
psql
(在一次启动之后)。顺便问一下:你为什么要关掉自动吸尘器?我也这么做了(这是我认为任何现代版本都需要恢复的唯一原因)。我通常熟悉PostgreSQL管理的基本知识。您是否会遇到与“postgres-D[path to data dir][db name]”相同的错误?是的。即使我没有执行
我也会收到完全相同的错误。好的,最后一个问题-您是否使用了--single option进行了尝试?谢谢<代码>--单个
似乎有效。(还没有运行
。哇。这是一个非常详细和全面的答案。非常感谢您的详细介绍,@kgrittn!
postgres --single -D [path-to-data-dir] [db-name] < /tmp/fix.sql