Postgresql autovacuum для предотвращения застревания на поврежденном столе - PullRequest
0 голосов
/ 06 сентября 2018

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

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

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

1 Ответ

0 голосов
/ 06 сентября 2018

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

--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 и сделать резервную копию впоследствии

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

...