Postgresql
Содержание
PostgreSQL
Проблемы
Не стартовал сервер и в логах было следующее:
PANIC: could not access status of transaction 36245907 DETAIL: could not read from file "/usr/local/pgsql/data/pg_clog/0022" at offset 147456: Success LOG: startup process (PID 3172) was terminated by signal 6
Решение 1:
cp /usr/local/pgsql/data/pg_clog/0021 /usr/local/pgsql/data/pg_clog/0022
затем вновь запустил сервер и выполнил команду
./vacuumdb -a
Решение 2:
dd bs=8k count=1 </dev/zero >/usr/local/pgsql8b3/data/pg_clog/0022
но мне не помогло
Восстановление PostgreSQL после повреждения файлов XLOG
Взято здесь и дополнено.
Мои симптомы после сбоя файловой системы, в логах:
Sep 22 17:00:00 enigma postgres[497]: [3490-1] ERROR: xlog flush request 3/3E428044 is not satisfied --- flushed only to 3/3E10A47C Sep 22 17:00:00 enigma postgres[497]: [3490-2] CONTEXT: writing block 5 of relation 1663/18538/2619 Sep 22 17:00:00 enigma postgres[497]: [3491-1] WARNING: could not write block 5 of 1663/18538/2619 Sep 22 17:00:00 enigma postgres[497]: [3491-2] DETAIL: Multiple failures --- write error may be permanent.
Или, когда файлы журнала транзакций (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 /home/pgsql/data | grep "Latest" Latest checkpoint location: 3/4000001C Latest checkpoint's REDO location: 3/4000001C Latest checkpoint's UNDO location: 3/4000001C Latest checkpoint's TimeLineID: 1 Latest checkpoint's NextXID: 87283762 Latest checkpoint's NextOID: 517621 Latest checkpoint's NextMultiXactId: 1 Latest checkpoint's NextMultiOffset: 0
Нам нужны строчки с NextXID и NextOID.
Переходим в пользователя от имени которого выполняется PGSQL (в моем случае FreeBSD, это pgsql)
# su pgsql
И теперь сбрасываем логи, указав в параметрах наши цифры из данных pg_control
$ pg_resetxlog -o 517621-x 87283762 -f /home/pgsql/data/ Transaction log reset
Все, логи транзакций удалены и PostgreSQL спокойно запустится, начав создавать их по-новой.
PS:Перед ӕтим остановите PostgreSQL и скопируйте папку /home/pgsql/ (рабочий каталог) на всякий случай :)