2016-04-27 4 views
5

Использование Debian свистящих, Postgresql 9.3Postgres не запускается после удаления pg_xlog файлов

Моя база данных пошли вниз, потому что раздел, в котором он хранит файлы WAL получили полный. Итак, я удалил все внутри ./pg_xlog/, потому что я не знал, что они (да, невероятно глупо от меня). Теперь сервис Postgres не запускается, хотя проблема, по Syslog:

00000: could not open tablespace directory "pg_tblspc/16386/PG_9.3_201306121": File or directory not found 
LOCAL: RelationCacheInitFileRemoveInDir, relcache.c:4895 
00000: Primary checkpoint record is invalid 
LOCAL: ReadCheckpointRecord, xlog.c:6543 
00000: Secondary checkpoint record is invalid 
LOCAL: ReadCheckpointRecord, xlog.c:6547 
PANIC: XX000: could not locate a valid checkpoint record 
LOCAL: StartupXLOG, xlog.c:5228 

Я не совсем уверен в том, что проблема в том, что он не может найти правильный pg_tblspc или полное отсутствие контрольной точки WAL файлы. Фактический путь к тому, где хранятся базы данных, - /dados/PG_9.3_201306121. Что я могу сделать, чтобы запустить сервис снова?

EDIT1: Хорошо, мне удалось вернуть эту информацию в режиме онлайн. Некоторые базы данных были повреждены. Мне удалось сделать DROPDB два из них (они даже не могли подключиться к ним без принудительного перезапуска службы). Я попытался сделать это с другой, получившей повреждение, но ошибка снова была связана с xlog. Я пробовал сделать над ним чистое восстановление, но восстановление было неполным. Затем я создал новую базу данных и попытался восстановить старую резервную копию этой базы данных. Это также было неполным.

Теперь я не могу сбросить базы данных и не создавать новые, я всегда получаю ошибку xlog flush request not satisfied. Я пробовал работать pg_resetxlog, но, похоже, он ничего не делал. Другое дело, что ошибка показывает cannot write to block 1 of pg_tblspc/16385/PG_9.3_201306121/36596452/11773, write error may be permanent.

EDIT2: Часть проблемы выше была с этим 11773 файлом. Я переименовал его в 11773.corrupt, и теперь база данных позволяет мне создавать и снова отбрасывать.

+0

Nonono, не продолжайте использовать его! Создайте резервную копию, закройте ее, переименуйте старый каталог данных, initdb, новый (или используйте обертку вашего пакета, но сначала установите его), а затем восстановите свои дампы в новом экземпляре PostgreSQL. –

ответ

6

Postgres не запускается после удаления pg_xlog файлов

Гм, да. Не делай этого.

Что я могу сделать, чтобы начать сервис снова?

Ну, вы повредили свою базу данных. Восстановить из резервных копий. У вас есть резервные копии, верно? Предпочтительно удобный архив PITR, например, из PgBarman, где вы можете восстановить до 5 минут назад. Нет?

ОК, во-первых, архивируйте поврежденную копию. https://wiki.postgresql.org/wiki/Corruption

Теперь. Если вам повезет, pg_resetxlog доставит вас и запустит достаточно, чтобы успешно сделать базу данных pg_dump, поэтому вы можете переместить старый datadir старой поврежденной установки в сторону, initdb и восстановить базу данных.

Если вам не повезло pg_dump не удастся, или вы получите отказы восстановления из-за таких вещей, как дубликаты первичных ключей. В последнем случае, возможно, придется вручную отремонтировать дамп. Если pg_dump не работает, соответствующее действие будет зависеть от того, почему он не работает.

Так что да. Не удалять pg_xlog.

В сообществе PostgreSQL есть дискуссии о переименовании pg_xlog в нечто более очевидное, что это важный компонент базы данных, и, надеюсь, это будет сделано в выпуске 9.7.

+0

Хорошо, у меня есть резервные копии, но теперь некоторые из баз данных повреждены. Ну, это не проблема, но теперь я не могу DROP или CREATE базы данных, я всегда получаю ошибку «xlog flush request not satisfied» – Arthur

+0

Вам нужно будет initdb, –