PostgreSQL: pg_basebackup: error: directory „/home/4pg/app_data” exists but is not empty

30-Maj-2021

Jeśli stworzyłeś kilka tablespace w bazie postgresql i chcesz sporządzić kopię korzystając z pg_basebackup w formacie plain, to możesz spotkać problem w postaci błędu:

O co chodzi?

Backup w formacie plain kopiuje pliki i katalogi 1-1. Nie ma problemu z danymi znajdującymi się w katalogu data clustra SQL. Tutaj Postgres jest na tyle mądry, że wie, że należy go przekopiować do katalogu z kopią. Niestety co do pozostały tablespace, domyślnie jest tak, że kopia katalogu ma być wykonana w tym samym miejscu (sic!). Tego się oczywiście nie da zrobić wykonując kopię lokalnie na maszynie z zainstalowanym postgresem. Wydaje mi się to co najmniej dziwne, że taka jest logika wykonywania kopii, ale najwyraźniej chłopaki, którzy to robili mieli ku temu jakieś istotne powody – nie wnikam w to.

Jak obejść ten problem?

Na całe szczęście mamy w poleceniu pg_basebackup opcję, która pozwala wskazać do jakich katalogów mają być zapisane odpowiednie tablespace. Jest to opcja T. W tym przypadku komenda mogła by wyglądać tak:

Tablespace znajdujący się w katalogu /home/4pg/app_data zostanie teraz skopiowany do /home/pg_archives/sunday_plain/app_data i podobnie będzie z katalogiem /home/4pg/temp_tblspc, który zostanie skopiowany do /home/pg_archives/sunday_plain/temp_tblspc.

Dziękuję za wskazówki na innych blogach i forach:

https://www.percona.com/blog/2018/12/21/backup-restore-postgresql-cluster-multiple-tablespaces-using-pg_basebackup/

https://programmer.ink/think/introduction-to-temporary-tablespaces-of-postgresql-and-greenplum.html

pg_basebackup: error: directory “dir_abc” exists but is not empty OR ERROR: tablespace “ABC” is not empty

 

Dodaj komentarz:

Autor: Rafał Kraik