восстановить из pg_basebackup

Я делал ежедневные резервные копии БД postgresql с помощью команды

/usr/bin/pg_basebackup -D $outdir -Ft -x -z -w -R -v

Теперь я хочу восстановить эту БД на другом сервере. Я использовал описание на https://www.postgresql.org/docs/9.5/static/continuous-archiving.html#BACKUP-PITR-RECOVERY.

Файл recovery.conf, включенный в резервную копию, имеет следующее содержимое:

standby_mode = 'on'
primary_conninfo = 'user=postgres port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'

Следующий шаг (8.) в документации говорит о запуске postgresql. Это приводит к сбою из-за тайм-аута:

3783 postgres: startup process   waiting for 0000000100000024000000B 

На исходном сервере у меня нет этого файла. Можно ли восстановить только состояние pg_basebackup без использования файлов WAL? Что тогда должно быть в файле recovery.conf?

Следуя предложению @JosMac, я переместил recovery.conf со следующим результатом:

shaun2:/var/lib/pgsql/data # service postgresql start
Job for postgresql.service failed because the control process exited with error code. See "systemctl status postgresql.service" and "journalctl -xe" for details.
shaun2:/var/lib/pgsql/data # service postgresql status
â postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2018-06-18 12:02:53 CEST; 12s ago
  Process: 1340 ExecStop=/usr/lib/postgresql-init stop (code=exited, status=0/SUCCESS)
  Process: 9355 ExecStart=/usr/lib/postgresql-init start (code=exited, status=1/FAILURE)
 Main PID: 1060 (code=exited, status=0/SUCCESS)

Jun 18 12:02:52 shaun2 postgres[9369]: [3-1] 2018-06-18 12:02:52 CEST   LOG:  invalid checkpoint record
Jun 18 12:02:52 shaun2 postgres[9369]: [4-1] 2018-06-18 12:02:52 CEST   FATAL:  could not locate required checkpoint record
Jun 18 12:02:52 shaun2 postgres[9369]: [4-2] 2018-06-18 12:02:52 CEST   HINT:  If you are not restoring from a backup, try removing the file "/var/lib/pgsql/data/backup_label".
Jun 18 12:02:52 shaun2 postgres[9367]: [2-1] 2018-06-18 12:02:52 CEST   LOG:  startup process (PID 9369) exited with exit code 1
Jun 18 12:02:52 shaun2 postgres[9367]: [3-1] 2018-06-18 12:02:52 CEST   LOG:  aborting startup due to startup process failure
Jun 18 12:02:53 shaun2 postgresql-init[9355]: pg_ctl: could not start server
Jun 18 12:02:53 shaun2 systemd[1]: postgresql.service: Control process exited, code=exited status=1
Jun 18 12:02:53 shaun2 systemd[1]: Failed to start PostgreSQL database server.
Jun 18 12:02:53 shaun2 systemd[1]: postgresql.service: Unit entered failed state.
Jun 18 12:02:53 shaun2 systemd[1]: postgresql.service: Failed with result 'exit-code'.

Я полагаю, что PostgreSQL все еще ищет отсутствующий файл WAL из-за содержимого backup_label:

shaun2:/var/lib/pgsql/data # cat backup_label
START WAL LOCATION: 24/B0000028 (file 0000000100000024000000B0)
CHECKPOINT LOCATION: 24/B0000028
BACKUP METHOD: streamed
BACKUP FROM: master
START TIME: 2018-06-14 02:55:08 CEST
LABEL: pg_basebackup base backup

Результат после удаления backup_label:

shaun2:/var/lib/pgsql/data # service postgresql status
â postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2018-06-18 12:17:54 CEST; 4s ago
  Process: 1340 ExecStop=/usr/lib/postgresql-init stop (code=exited, status=0/SUCCESS)
  Process: 10401 ExecStart=/usr/lib/postgresql-init start (code=exited, status=1/FAILURE)
 Main PID: 1060 (code=exited, status=0/SUCCESS)

Jun 18 12:17:53 shaun2 postgres[10414]: [4-1] 2018-06-18 12:17:53 CEST   LOG:  invalid secondary checkpoint record
Jun 18 12:17:53 shaun2 postgres[10414]: [5-1] 2018-06-18 12:17:53 CEST   PANIC:  could not locate a valid checkpoint record
Jun 18 12:17:54 shaun2 postgres[10412]: [2-1] 2018-06-18 12:17:54 CEST   LOG:  startup process (PID 10414) was terminated by signal 6: Aborted

person muclux    schedule 15.06.2018    source источник


Ответы (1)


Мы используем pg_basebackup для резервного копирования, а также выполнили несколько восстановлений, поэтому в целом он работает очень хорошо без проблем.

Но я бы порекомендовал вам использовать параметр -X stream вместо -x (что означает «-X выборка»). С этим параметром pg_basebackup будет перехватывать и сохранять сегменты журнала WAL, созданные во время резервного копирования, вместе с файлами данных. Эти журналы WAL будут храниться в отдельных файлах pg_xlog.tar или pg_wal.tar (в зависимости от версии PG).

Полное описание восстановления можно найти здесь - pg_basebackup / pg-barman - восстановить резервную копию tar

person JosMac    schedule 15.06.2018
comment
К сожалению, я хочу восстановить резервную копию файла двухдневной давности, созданного с параметром -x, а не -X stream. У меня нет ни pg_xlog.tar, ни pg_wal.tar. Описание в вашей ссылке предполагает наличие одного из этих файлов в recovery.conf файле. - person muclux; 15.06.2018
comment
Что ж, теоретически - если во время запуска базовой резервной копии транзакций не было, вы можете попробовать запустить восстановленную резервную копию без файла восстановления. Но я сомневаюсь, что ... Если у вас есть archive_mode ON или Always on вашей БД и archive_command установлен или wal_keep_segments действительно высокий, вы можете копировать журналы WAL из своей БД. В противном случае я бы сделал еще один базовый бэкап с новыми параметрами ... - person JosMac; 15.06.2018
comment
Мне нужны данные с прошлой среды, поэтому новая резервная копия не поможет. Резервное копирование выполняется в 3 часа ночи, и в настоящее время нет активности. Так что данные в базовой резервной копии были бы достаточно точными - если бы я мог их восстановить. Текущие файлы WAL начинаются сегодня утром, поэтому они не помогают. - person muclux; 15.06.2018
comment
Хорошо, если вы уверены, что не было активности, остановите службу postgresql (если она запущена), переименуйте файл recovery.conf и попробуйте снова запустить службу postgresql и посмотрите сообщения в /var/log/postgresql/postgresql-xxx-main.log - person JosMac; 18.06.2018
comment
Вижу - посмотрите сообщение HINT: If you are not restoring from a backup, try removing the file "/var/lib/pgsql/data/backup_label" - попробуйте переименовать этот файл и попробуйте еще раз. - person JosMac; 18.06.2018
comment
Я редактировал один раз, добавляя результат без файла backup_label. - person muclux; 18.06.2018
comment
Понятно - есть возможность сбросить контрольную точку - см. Здесь - stackoverflow.com/questions/8799474/ - person JosMac; 18.06.2018
comment
На самом деле мы сделали шаг вперед. Мы воспроизвели распаковку tar и получили один необходимый файл WAL. К сожалению, мы все еще не можем запустить PostgreSQL из-за «FATAL: не удалось подключиться к основному серверу». Я предполагаю, что это связано с тем, что мы установили резервную копию на другом сервере. Я задам еще один вопрос по этой части. - person muclux; 18.06.2018
comment
Теперь нам удалось восстановить данные на втором сервере, вернувшись к вашему первому предложению: удалите recovery.conf (но на этот раз с запрошенным файлом WAL - и он сработал. Большое спасибо за вашу помощь и терпение! - person muclux; 18.06.2018