Как восстановить поврежденную системную таблицу в PostgreSQL - PullRequest
3 голосов
/ 30 мая 2011

Я только что попытался выполнить pg_upgrade на довольно большом кластере баз данных PostgreSQL с версии 8.3.0 до версии 9.0.4.Все выглядело так, как будто все будет работать нормально, пока на целевом кластере не будет создана новая схема.Он умер, пытаясь создать групповую роль дважды по какой-то причине.

После просмотра всех сценариев было совершенно очевидно, что она дублирует групповую роль 4 раза.Я восстановил базу данных 8.3.0, и было очень очевидно, что в таблице pg_authid была повторена строка.

Я попытался запустить базу данных в однопользовательском режиме, чтобы попытаться REINDEX TABLE pg_authid.Это не помогло при попытке создать новый индекс с дублированными значениями.

Я попытался удалить несправедливую роль группы.Это удалило одну из 4 строк в pg_authid, но, похоже, это еще больше сбило с толку.

Я видел упоминание о том, что запуск полного вакуума на столе может исправить такое повреждение, но у меня мало надежд на эту работу,Поэтому пока данные будут восстановлены, я буду искать идеи.

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

Вы точно следовали pg_upgrade шагам ?Если это так, у вас должен быть в наличии ваш старый датадир, и вы можете вернуться к нему, если это необходимо… правильно?: (

A REINDEX TABLE не решит вашу проблему, но

# From old database
pg_dump -t my_problem_table(s) ... > my_screwed_up_data.sql
pg_dump -T my_problem_table(s) ... > my_not_screwed_up_data.sql


# Fix whatever isn't right
${EDITOR} my_screwed_up_data.sql

# In to a fresh database instance
cat my_screwed_up_data.sql | psql
cat my_not_screwed_up_data.sql | psql

может помочь вам начать. Возможно, вам придется выполнить шаги два и три несколько раз, покавы загружаете вещи правильно. Надеемся, что только ваши системные каталоги содержат поддельные данные.

1 голос
/ 03 июня 2011

Рассматривали ли вы изменение pg_upgrade, чтобы вы могли исправить неверные утверждения, как это предложил Шон, прежде чем приступить к обновлению? Я считаю, что дамп / восстановление происходит в pg_upgrade для системных таблиц.

...