Ручное восстановление данных системного каталога СУБД
Этот раздел является шагом 13 к сценарию восстановления данных системного каталога.
При выявлении проблем в работе СУБД после успешного обновления и некоторого периода эксплуатации может в озникнуть необходимость в корректировке системных данных каталога или откате их изменений, произведенных во время обновления.
В случае кластерной конфигурации все действия по изменению системного каталога производятся только на основном узле, при этом репликация осуществляется во время синхронизации (разделы «Откат таблиц системного каталога СУБД» и «После восстановления не получилось снять дамп какой либо из баз данных СУБД»). Переименование директорий пользовательских табличных пространств, изменение версии системного каталога производится как на мастере, так и на реплике.
Восстановление стенда после неуспешного обновления
Ошибка возникла до запуска утилиты inplace_upgrade.sh
При возникновении ошибки до запуска утилиты inplace_upgrade.sh
в случае, когда автоматический откат не выполнился, перейдите к инструкции отката.
Ошибка возникла при запуске утилиты inplace_upgrade.sh в режиме UPDATE
, утилита вернула код 5
При возникновении ошибки при запуске утилиты inplace_upgrade.sh
до обновления системных каталогов, предусмотрено автоматическое восстановление версии системного каталога и пользовательских табличных пространств. Если автоматический откат не выполнился, перейдите к инструкции отката.
Ошибка возникла при запуске утилиты inplace_upgrade.sh в режиме UPDATE
, утилита вернула код 4
При возникновении ошибки при запуске утилиты inplace_upgrade.sh
после начала обновления системных каталогов, предусмотрено автоматическое восстановление версии системного каталога и пользовательских табличных пространств. Если автоматический откат не выполнился, требуется откат бинарных файлов и настроек по инструкции отката. После отката бинарных файлов необходимо запустить утилиту inplace_upgrade.sh
с командой reset
:
./inplace_upgrade.sh -d <pgdata> -l <директория логов> -p <порт> -h <хост> -u <суперпользоватесь> -b <база данных для подключения по умолчанию> -s <директория с утили той> -m <директория для sql-дампов> -B <директория бэкапа> reset -t <директория утилит postgres and pg_ctl> -T <директория утилит psql and pg_dump>
После получения кода возврата 0
откат считается успешным.
Ошибка при работе утилиты inplace_upgrade.sh в режиме UPDATE
, утилита вернула код 1
Завершение утилиты inplace_upgrade.sh
с кодом 1
требует ручного восстановления. Ниже рассмат риваются возможные ситуации.
Для отката бинарных файлов и настроек сценария обновления требуется обратиться к инструкции отката.
Неуспешное изменение версии системного каталога в файле global/pg_control, при обновлении
Первое изменение, которое производит скрипт inplace_upgrade.sh
, заключается в вызове утилиты update_catalog_version
для обновления версии системного каталога. Перед обновлением файла global/pg_control
утилита update_catalog_version
формирует файл резервного копирования pg_control.bak
в директории --backupdir
. Утилита update_catalog_version
вызывается также и при автоматическом восстановлении в случае неудачного обновления – при этом создается дополнительная резервная копия, которая помещается в директорию <--backupdir>/reset_pg_control/pg_control.bak
.
Ниже рассматриваются возможные ситуации возникновения сбоя при работе утилиты update_catalog_version
.
Ошибка обновления версии системного каталога утилитой update_catalog_version
Ошибка возникла во время работы утилиты update_catalog_version
до момента начала обновления каталога. Данная ситуация сопровождается сообщением в логе:
update_catalog_version: error: Catalog version has not been updated, file <pgdata>/global/pg_control is corrupted
-
Выполните команду:
sudo cp <директория бэкапа>/pg_control.bak $PGDATA/global/pg_control
-
После успешного завершения работы утилиты проверьте утилитой
pg_controldata
содержимое файлаpg_control
:pg_controldata -D $PGDATA
Вывод:
...
Catalog version number: <старая версия системного каталога>
...
Ошибка при повторном вызове утилиты update_catalog_version
Ошибка возникла во время работы утилиты update_catalog_version
во время автоматического восстановления, инициированного утилитой inplace_upgrade.sh
.
Данная ситуация сопровождается следующим сообщением в логе:
pg_ctl start: waiting for server to start.................... done server started
...
ERROR: ... # Ошибка во время работы inplace_upgrade.sh
...
INFO: renamed '/pgdata/06/tablespaces/Tbl_t/PG_15_<новая версия системного каталога>' -> '/pgdata/06/tablespaces/Tbl_t/PG_15_<старая версия системного каталога>'
...
ERROR: update_catalog_version: Catalog version has not been updated, file <pgdata>/global/pg_control is corrupted
За время работы утилиты inplace_upgrade.sh
может поменяться позиция LSN, это приведет к изменению текущего WAL-файла и файла pg_control
. Поэтому в команде ниже работа производится именно с текущим pg_control
, который был сохранен перед повторным вызовом утилиты.
-
Выполните команду:
sudo cp <директория бэкапа>/reset_pg_control/pg_control.bak $PGDATA/global/pg_control
-
Проверьте права на доступ к файлу PostgreSQL. Запустите утилиту
update_catalog_version
:update_catalog_version -c <новая версия системного каталога> -C <старая версия системного каталога> -D $PGDATA -b <директория для бэкапа pg_control> -f
-
После успешного заве ршения работы
update_catalog_version
проверьте утилитойpg_controldata
содержимое файлаpg_control
:update_catalog_version
pg_controldata -D $PGDATA
update_catalog_versionВывод:
...
Catalog version number: <старая версия системного каталога>
...
Ошибка восстановления имени папки пользовательского табличного пространства в соответствии со старой версией системного каталога
Ошибка возникает во время автоматического восстановления, инициированного утилитой inplace_upgrade.sh
при переименовании папки пользовательского табличного пространства.
Для восстановления пользовательских табличных пространств необходимо получить из файла <директория бэкапа>/user_tbls.txt
все пользовательские табличные пространства, относящиеся к СУБД и произвести переименование содержащихся в них папок PG_<версия PostgreSQL>_<версия системного каталога>
в соответствии с возвращаемой версией системного каталога.
Данная ситуация сопровождается следующим сообщением в логе:
ERROR: ... # Ошибка во время работы inplace_upgrade.sh
...
ERROR: mv: cannot move ...
-
Выполните:
sudo mv <пользовательский tablespace>/PG_15_202409231 <пользовательский tablespace>/PG_15_202310091
-
Проверьте содержимое директории пользовательского табличного пространства командой
ls
:ls <директория пользовательского табличного пространства> -la
drwx------ 3 postgres postgres 4096 Oct 16 14:28 .
drwx------ 3 postgres postgres 4096 Oct 16 14:28 ..
drwx------ 3 postgres postgres 4096 Oct 16 14:28 PG_<версия PostgreSQL>_<старая версия системного каталога>