Бывают случаи, когда файлы журнала транзакций (pg_xlog) могут быть повреждены или случайно удалены.
В таком случае PostgreSQL не сможет работать и просто не запустится с подобной ошибкой: Jul 4 11:30:18 database postgres[92997]: [1-1] LOG: database system was interrupted at 2009-07-04 11:24:30 MSD
Jul 4 11:30:18 database postgres[92997]: [2-1] LOG: could not open file "pg_xlog/000000010000031A00000027"
(log file 794, segment 39): No such file or directory
Jul 4 11:30:18 database postgres[92997]: [3-1] LOG: invalid primary checkpoint record
Jul 4 11:30:18 database postgres[92997]: [4-1] LOG: could not open
Найти поврежденный xlog-файл вряд ли получится, поэтому выход один - очистить информацию в БД об используемых логах.
Для этого есть штатная утилита pg_resetxlog
Но перед ее использованием надо узнать что именно вытирать из БД. Для этого делаем:
# pg_controldata /var/db/pgsql/| grep "Latest checkpoint"
Latest checkpoint's REDO location: 31A/27FFF7B8
Latest checkpoint's UNDO location: 0/0
Latest checkpoint's TimeLineID: 1
Latest checkpoint's NextXID: 0/2400998005
Latest checkpoint's NextOID: 75014368
С этой информации нам интересны последние строчки с (NextXID, NextOID).
Переходим в пользователя от имени которого выполняется PGSQL (в моем случае, это pgsql)
# su pgsql
И теперь сбрасываем логи, указав в параметрах наши цифры из данных pg_control
$ pg_resetxlog -o 75014368 -x 2400998005 -f /var/db/pgsql/
Transaction log reset
Все, PGSQL теперь не помнит, что у него были когда-то логи транзакций и спокойно запустится, начав создавать их по-новой.
PS: Хочется напомнить, что любые действия по восстановлению данных, требуют сохранения исходных данных
перед любыми действиями над ними. Ну и максмум осторожности :)
URL: http://blog.mironovs.com/2009/07/vosstanovlenie-postgresql-p.../
Обсуждается: http://www.opennet.me/tips/info/2120.shtml