вторник, 12 января 2016 г.

Падение сервера PostgreSQL

Сегодня после отключения света, отказался запускаться PosygreSQL сервер, Сразу скажу что машина где это произошло тестовая, поэтому ни чего сложного не случилось. Однако симптомы были такие:
При попытке запустить службу "Postgres"выдавалось сообщение что служба остановлена. В журнале событий было написано "Служба "PostgreSQL Database Server 9.1.9-1.1C" перешла в состояние Остановлена." - что собственно ни о чем не говорит.
А вот в логах самого сервера выдало следующее сообщение:



2016-01-12 14:50:04 MSK LOG:  database system was interrupted while in recovery at 2016-01-12 13:23:40 MSK
2016-01-12 14:50:04 MSK HINT:  This probably means that some data is corrupted and you will have to use the last backup for recovery.
2016-01-12 14:50:04 MSK FATAL:  the database system is starting up
2016-01-12 14:50:05 MSK LOG:  database system was not properly shut down; automatic recovery in progress
2016-01-12 14:50:05 MSK LOG:  redo starts at 26/63EE7208
2016-01-12 14:50:06 MSK FATAL:  the database system is starting up
2016-01-12 14:50:06 MSK LOG:  record with zero length at 26/64183728
2016-01-12 14:50:06 MSK LOG:  redo done at 26/641836E8
2016-01-12 14:50:06 MSK LOG:  last completed transaction was at log time 2016-01-12 12:58:29.099+04
2016-01-12 14:50:06 MSK WARNING:  page 22 of relation base/16400/30220 did not exist
2016-01-12 14:50:06 MSK PANIC:  WAL contains references to invalid pages
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
2016-01-12 14:50:06 MSK LOG:  startup process (PID 3080) exited with exit code 3
2016-01-12 14:50:06 MSK LOG:  aborting startup due to startup process failure
Стало понятно что сервер не может запуститься т.к. какие-то данные были порушены. и из за этого Postgres не может завершить начатые транзакции.
Теперь на всякий случай делаем физическую копию базы. После этого запускаем командную строку "cmd" от имени администратора:
pg_controldata "c:\Program Files (x86)\PostgreSQL\9.1.9-1.1C\data"
 далее в выводе ищем строки  
Latest checkpoint's NextXID:          0/863432
Latest checkpoint's NextOID:          7939103
Эта информация нам понадобиться что бы удалить лог транзакций:

pg_resetxlog.exe -o 7939103 -x 863432 -f "c:\Program Files (x86)\PostgreSQL\9.1.9-1.1C\data"
 Будет выдано сообщение:

 Transaction log reset
После данных действий желательно выполнить "тестирование и исправление"  с режимом логической целостности системы.

Комментариев нет:

Отправить комментарий