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)
- Введите каталог базы данных (например: data/base/1234)
- Переименуйте файл в 56789_bkp
- Создайте пустой файл с именем 56789:
touch 56789
- Запустить сервер базы данных
- Выполните таблицу усечений, чтобы принудительно перезаписать файл данных PostgreSQL:
TRUNCATE TABLE corrupted_table;
- Вы можете захотеть VACUUM и сделать резервную копию впоследствии
Надеюсь это поможет.