【问题标题】:Postgres wraparound problemsPostgres 环绕问题
【发布时间】:2014-11-28 06:18:09
【问题描述】:

我的生产 PostgreSQL 遇到了一个问题,它基本上与环绕问题有关,因为 XID 范围超出限制。

这个 PostgreSQL 生产运行了 1 年多,有大量事务和批量插入。

我在谷歌上搜索了很多,但对这个严重错误感到困惑和害怕。现在我在任何吸尘或自动吸尘过程中都会遇到这个错误。 我有大约 250 GB 的 Postgres 生产数据库,并且我还为所有表设置了 auto-vacuum。

Error and Warning are:

WARNING:  oldest xmin is far in the past
HINT:  Close open transactions soon to avoid wraparound problems.

我还检查了当前打开的事务,但 Postgres 会话中没有任何长时间运行的事务。

Current database age of XID :
  Database       Age
"template1";  153163876
"template0";  153163876
"postgres";   153163876
"dispatcher"; 153163876
"qate";       195568300

我使用以下查询得到的结果:

SELECT datname, age(datfrozenxid) FROM pg_database;

请尽快提供您的意见,因为这很快就会给我的生产数据库带来问题。

【问题讨论】:

  • 你能负担得起强行关闭未结交易吗?
  • 感谢 Erwin,但我没有为 PostgreSQL 找到任何长时间运行的进程。
  • 然后一个普通的 VACUUM should 就能完成它的工作......

标签: sql postgresql transactions postgresql-9.3 vacuum


【解决方案1】:

如果您有能力强制关闭未结交易:

SELECT pg_terminate_backend(procpid)
FROM   pg_stat_activity
WHERE  datname = 'mydb';

然后 autovacuum 可以冻结行,也可以手动运行VACUUM。您可能必须暂时阻止新交易。以下是详细说明:

.. 除非你不DROP db。就VACUUM吧。

否则 Postgres 将强制关闭以防止数据丢失。 Detailed explanation in the manual.

【讨论】:

  • 就我而言,问题进程是空闲事务。另一个症状是 autovacuum 工作进程没有运行。一旦我按照上面的方法进行了 pg_terminate_backend 调用,autovacuum 工作人员就会返回并且 pg_log 警告消失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2015-11-13
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多