Табличное пространство и база данных

postgres$ mkdir /var/lib/postgresql/ts_dir

Табличные пространства может создавать только суперпользователь:

student$ psql -U postgres -c "CREATE TABLESPACE ts LOCATION '/var/lib/postgresql/ts_dir'"
CREATE TABLESPACE
student$ psql -U postgres -c "ALTER TABLESPACE ts OWNER TO student"
ALTER TABLESPACE
α=> CREATE DATABASE backup_base;
CREATE DATABASE
α=> \c backup_base
You are now connected to database "backup_base" as user "student".
α=> CREATE TABLE t(s text) TABLESPACE ts;
CREATE TABLE
α=> INSERT INTO t VALUES ('Привет, мир!');
INSERT 0 1

Базовая резервная копия

Создадим каталог, в который поместим резервную копию:

postgres$ mkdir /var/lib/postgresql/backup

Каталог для табличного пространства ts на сервере, который будет развернут из резервной копии:

postgres$ mkdir /var/lib/postgresql/ts_beta_dir

Запускаем pg_basebackup от имени роли student, указывая формат tar со сжатием:

postgres$ pg_basebackup --format=tar --gzip -U student --pgdata=/var/lib/postgresql/backup
postgres$ ls -l /var/lib/postgresql/backup/
total 4676
-rw-r--r-- 1 postgres postgres     339 июн 13 20:00 32843.tar.gz
-rw-r--r-- 1 postgres postgres 4761420 июн 13 20:00 base.tar.gz
-rw------- 1 postgres postgres   19792 июн 13 20:00 pg_wal.tar.gz

Восстановление из базовой резервной копии

Разворачиваем резервную копию:

postgres$ rm -rf /var/lib/postgresql/10/beta/*
postgres$ tar -zxf /var/lib/postgresql/backup/base.tar.gz -C /var/lib/postgresql/10/beta
postgres$ tar -zxf /var/lib/postgresql/backup/32843.tar.gz -C /var/lib/postgresql/ts_beta_dir
postgres$ tar -zxf /var/lib/postgresql/backup/pg_wal.tar.gz -C /var/lib/postgresql/10/beta/pg_wal

Изменяем порт:

postgres$ echo 'port = 5433' >> /var/lib/postgresql/10/beta/postgresql.auto.conf

В каталоге pg_tblspc сейчас пусто:

postgres$ ls /var/lib/postgresql/10/beta/pg_tblspc/

Символическая ссылка появится при старте сервера в соответствии с файлом tablespace_map (который находится внутри base.tar):

postgres$ cat /var/lib/postgresql/10/beta/tablespace_map
32843 /var/lib/postgresql/ts_dir

Изменяем в этом файле путь для табличного пространства:

postgres$ sed -i 's/ts_dir/ts_beta_dir/' /var/lib/postgresql/10/beta/tablespace_map

Запуск и проверка

Запускаем сервер.

student$ sudo pg_ctlcluster 10 beta start
postgres$ ls -l /var/lib/postgresql/10/beta/pg_tblspc/
total 0
lrwxrwxrwx 1 postgres postgres 31 июн 13 20:00 32843 -> /var/lib/postgresql/ts_beta_dir
student$ psql -p 5433 -d backup_base
β=> \c backup_base
You are now connected to database "backup_base" as user "student".
β=> SELECT * FROM t;
      s       
--------------
 Привет, мир!
(1 row)

Удаление базы данных и табличного пространства

Чтобы удалить БД, надо от нее отключиться.

α=> \c student
You are now connected to database "student" as user "student".
α=> DROP DATABASE backup_base;
DROP DATABASE
α=> DROP TABLESPACE ts;
DROP TABLESPACE
postgres$ rm -rf /var/lib/postgresql/ts_dir/

И для второго сервера:

β=> \c student
You are now connected to database "student" as user "student".
β=> DROP DATABASE backup_base;
DROP DATABASE
β=> DROP TABLESPACE ts;
DROP TABLESPACE
postgres$ rm -rf /var/lib/postgresql/ts_beta_dir/