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:
[postgres@dbserv10 ~]$ pg_basebackup -Xs -Fp -P -D /home/pg_archives/sunday_plain/ pg_basebackup: error: directory "/home/4pg/app_data" exists but is not empty pg_basebackup: removing contents of data directory "/home/pg_archives/sunday_plain/"
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:
[postgres@dbserv10 ~]$ pg_basebackup -Xs -Fp -P -D /home/pg_archives/sunday_plain/ -T "/home/4pg/app_data=/home/pg_archives/sunday_plain/app_data" -T "/home/4pg/temp_tblspc=/home/pg_archives/sunday_plain/temp_tblspc"
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