Проблемы с переносом Postgres

У меня возникла одна проблема с моим производственным PostgreSQL, которая связана с проблемой переноса, в основном из-за превышения диапазона XID.

Это производство PostgreSQL работает более 1 года с большим количеством транзакций и массовой вставкой.

Я много искал в Google, но смущаюсь и очень пугаюсь этой критической ошибки. Прямо сейчас я получаю эту ошибку во время любого вакуума или автоматического вакуума. У меня около 250 ГБ производственной базы данных Postgres, и я также установил автоочистку для всех таблиц.

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;

пожалуйста, предоставьте свои данные как можно скорее, потому что очень скоро это действительно создаст проблему для моей производственной базы данных.


person Anvesh    schedule 28.11.2014    source источник
comment
Можете ли вы позволить себе принудительно закрывать открытые сделки?   -  person Erwin Brandstetter    schedule 28.11.2014
comment
Спасибо, Эрвин, но я не нашел долго работающего процесса для PostgreSQL.   -  person Anvesh    schedule 28.11.2014
comment
Тогда обычный ВАКУУМ should сможет выполнить свою работу...   -  person Erwin Brandstetter    schedule 28.11.2014


Ответы (1)


Если вы можете позволить себе принудительное закрытие открытых транзакций:

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

Затем автоочистка может заморозить строки, или вы можете запустить VACUUM вручную. Возможно, вам придется временно запретить новые транзакции. Вот подробная инструкция:

.. за исключением того, что вы не DROP БД. Просто VACUUM это.

Или Postgres принудительно завершит работу, чтобы предотвратить потерю данных. Подробное объяснение в руководстве.

person Erwin Brandstetter    schedule 28.11.2014
comment
В моем случае проблемными процессами были простаивающие транзакции. Другим симптомом является то, что рабочие процессы автоочистки не запущены. Как только я выполнил вызовы pg_terminate_backend, как указано выше, рабочие автоочистки вернулись, а предупреждения pg_log исчезли. - person Robert Casey; 02.08.2017