Postgresql

Материал из rrv-wiki
Перейти к навигации Перейти к поиску

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/ (рабочий каталог) на всякий случай :)