postgrespro / pg_probackup

Backup and recovery manager for PostgreSQL
https://postgrespro.github.io/pg_probackup/
Other
703 stars 86 forks source link

Папка назначения после успешного восстановления исчезает, а последующее в ту же папку падает с ошибкой. #615

Closed twistmind closed 9 months ago

twistmind commented 9 months ago

Здравствуйте.

Вот используемая команда для восстановления из бекапа с целью дополнительной проверки последнего выполненного бекапа - так называемое, тестирование восстановления из бекапа:

pg_probackup-15 restore -B /pg_arch/ --instance test -D /var/lib/postgresql/15/test_restoring -j 4 --no-validate

Если команда выполняется первый раз с таким местом назначения (параметр -D), то восстановление проходит успешно, однако папка test_restoring пропадает.

Если выполнить ту же команду еще раз, то возникает ошибка сразу же:

ERROR: Restore destination is not empty: "/var/lib/postgresql/15/test_restoring"

Однако папки там нет, поэтому что-то странное происходит.

Соответственно два вопроса:

fukanchik commented 9 months ago

У нас не воспроизводится:

fuxx@s ~ $ ls /tmp/restore/
ls: cannot access '/tmp/restore/': No such file or directory
fuxx@s ~ $ pg_probackup restore -B /tmp/xxx --instance=dba1 -d postgres -D /tmp/restore --no-validate
WARNING: Backup S5754P is used without validation.
INFO: Restoring the database from backup at 2023-12-05 16:50:49+03
INFO: Start restoring backup files. PGDATA size: 52MB
INFO: Backup files are restored. Transferred bytes: 52MB, time elapsed: 0
INFO: Restore incremental ratio (less is better): 100% (52MB/52MB)
INFO: Syncing restored files to disk
INFO: Restored backup files are synced, time elapsed: 0
INFO: Restore of backup S5754P completed.
fuxx@s ~ $ ls /tmp/restore
backup_label  global        pg_dynshmem  pg_ident.conf  pg_multixact  pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    PG_VERSION  pg_xact               postgresql.conf
base          pg_commit_ts  pg_hba.conf  pg_logical     pg_notify     pg_serial    pg_stat       pg_subtrans  pg_twophase  pg_wal      postgresql.auto.conf
fuxx@s ~ $ pg_probackup restore -B /tmp/xxx --instance=dba1 -d postgres -D /tmp/restore --no-validate
ERROR: Restore destination is not empty: "/tmp/restore"
fuxx@s ~ $ ls /tmp/restore
backup_label  global        pg_dynshmem  pg_ident.conf  pg_multixact  pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    PG_VERSION  pg_xact               postgresql.conf
base          pg_commit_ts  pg_hba.conf  pg_logical     pg_notify     pg_serial    pg_stat       pg_subtrans  pg_twophase  pg_wal      postgresql.auto.conf

Как видите, работает как ожидается - после первого восстановления всё в порядке и повторное восстaновление невозиожно.

Думаю, причина проблемы - тестовое восстановление в рабочую директорию /var/lib/postgresql/15/. Возможно, какой-то софт поддержания целостности прод системы удаляет неизвестную ему и потенциально опасную директорию test_restoring.

Попробуйте восстанавливать например в /tmp. Воспроизведётся ли проблема?

twistmind commented 9 months ago

Пробовал в /tmp - тоже самое. image

И вот ошибка, будто бы папка уже существует, но ее там нет:

image

ОС: Ubuntu 22.04.3 LTS

fukanchik commented 9 months ago

А если сделать ls /tmp/test_restoring?

twistmind commented 9 months ago

Нет такого файла или каталога

image

fukanchik commented 9 months ago

И при этом ls /pg_arch/ говорит, что /pg_arch/ найден?

twistmind commented 9 months ago

Да, конечно. С этой папкой все в порядке.

fukanchik commented 9 months ago

Какая у Вас операционка? Какая версия пробэкапа? Какая версия постгреса? Вы ставили пробэкап из пакета или из исходников?

twistmind commented 9 months ago

ОС: Ubuntu 22.04.3 LTS pg_probackup: pg_probackup-15 2.5.13 (PostgreSQL 15.4) postgresql: PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit

Ставил из пакета.

twistmind commented 9 months ago

Разобрался. Это моя ошибка - неправильно понял контекст сервера восстановления. Ожидал почему-то (точнее, я знаю почему), что восстановление будет на том сервере, откуда запускалась команда восстановления. Все эти "пропавшие" папки лежат на удаленном сервере, а не на локальном.

Прошу прощения. Закрываю.