![postgres 真空](https://linux22.com/image/556044/postgres%20%E7%9C%9F%E7%A9%BA.png)
好的伙计们,我已经搬到了一家新公司,我发现他们这里有一个 PostgreSQL 数据库来运行 OpenNMS。
我是一个 MySQL 用户,对 PostgreSQL 完全不熟悉,但我至少学会了如何运行psql
和postgres -D
进入单用户模式。
无论如何,OpenNMS 崩溃了。我进入系统并追踪到 PostgreSQL,结果给出了以下错误:
WARNING: database "template1" must be vacuumed within 965550 transactions
HINT: To avoid a database shutdown, execute a full-database VACUUM in "template1".
实际上,它从 100 万开始,现在降到了 965500,如您所见。我通过登录单个用户 ( postgres -D
) 并运行 Vacuum full 到达了这一点。现在我期望这能清理它,但结果恰好是 55 行:
WARNING: database "template1" must be vacuumed within 938861 transactions
HINT: To avid a database shutdown, execute a full-database VACUUM in "template1".
WARNING: database "template1" must be vacuumed within 938860 transactions
HINT: To avoid a database shutdown, execute a full-database VACUUM in "template1".
WARNING: database "template1" must be vacuumed within 938861 transactions
HINT: To avoid a database shutdown, execute a full-database VACUUM in "template1".
WARNING: database "template1" must be vacuumed within 938860 transactions
HINT: To avoid a database shutdown, execute a full-database VACUUM in "template1".
所以我的问题是,我是否只需要继续运行它直到达到 0 或者我做错了?
答案1
我以前也遇到过这个问题。下面是我修复它的过程的笔记。
您需要通过运行 vacuum 来解决问题,因为错误提示很方便。为此,首先,关闭 postgres
sudo /sbin/service postgresql stop
现在,您需要检查每个数据库并使用独立后端执行清理。以 postgres 用户身份运行:
postgres -D /opt/pgsql/data/ postgres
其中/opt/pgsql/data是postgres的数据目录的路径,postgres是要修复的数据库的名称。
您将收到如下提示:
PostgreSQL 独立后端 8.1.18
后端>
VACUUM
只需在后端>提示符下输入即可。
您现在很可能会收到类似的警告:必须在 999407 个事务内清理数据库“template1”,提示:为避免数据库关闭,请在“template1”中执行全数据库 VACUUM。
只需重复这些步骤,每次更改 DBNAME,直到不再收到警告。发生这种情况时,您可以重新启动 postgres,一切将再次正确。
编辑:我还应该提到,在我们执行了几次这个过程之后;我们决定实施自动清理过程:http://www.postgresql.org/docs/8.1/static/maintenance.html#AUTOVACUUM