Postgresql autovacuum для предотвращения застревания на поврежденном столе

У меня запущен процесс, который нельзя убить безопасно: autovacuum: VACUUM public.mytable (для предотвращения обхода)

Эта таблица была очищена (за исключением некоторых записей, которые не могут быть удалены из-за повреждения таблицы во время аппаратной проблемы) и не могут быть удалены, потому что вакуум блокирует это. Мне пришлось запустить kill -9, чтобы остановить этот процесс и перезапустить базу данных, но вы не можете отключить этот автовакуум (чтобы предотвратить обход [транзакции]), поэтому автовакуум возвращается и сразу же застревает в этой поврежденной таблице.

Любое понимание этого?

1 ответ

Прежде всего, отключите сервер базы данных и сделайте физическую копию каталога данных в безопасное место. Затем вы можете обрезать файл данных поврежденной таблицы. Например:

--Get datafile path
db=# SELECT pg_relation_filepath('corrupted_table');
 pg_relation_filepath 
----------------------
 base/1234/56789
(1 row)
  1. Введите каталог базы данных (например: data/base/1234)
  2. Переименуйте файл в 56789_bkp
  3. Создайте пустой файл с именем 56789: touch 56789
  4. Запустить сервер базы данных
  5. Выполните таблицу усечений, чтобы принудительно перезаписать файл данных PostgreSQL: TRUNCATE TABLE corrupted_table;
  6. Вы можете захотеть VACUUM и сделать резервную копию впоследствии

Надеюсь это поможет.

Другие вопросы по тегам