Создание слота для репликации #под суперпользователем postgres
Код: Выделить всё
SELECT pg_create_physical_replication_slot('replica');
pg_create_physical_replication_slot
-------------------------------------
(replica,)
(1 row)
Код: Выделить всё
DO
$$
BEGIN
IF EXISTS (SELECT 1 FROM pg_user WHERE usename='student') THEN
RAISE NOTICE 'Role already exists';
ELSE
CREATE ROLE student WITH LOGIN;
END IF;
END
$$;
ALTER ROLE student WITH createdb;
ALTER ROLE student WITH createrole;
ALTER ROLE student WITH replication;
GRANT pg_read_all_stats TO student;
mkdir /var/lib/postgresql/beta
chown postgres:postgres /var/lib/postgresql/beta
chmod 700 /var/lib/postgresql/beta
Создание базовой резервной копии для новой реплики #под пользователм student
mkdir /home/student/backup
pg_basebackup --pgdata=/home/student/backup -R --slot=replica --progress
353087/353087 kB (100%), 1/1 tablespace
Представление pg_replication_slots показывает, что слот репликации получил явное значение restart_lsn записи wal журнала с которой начнется репликация:
Код: Выделить всё
SELECT * FROM pg_replication_slots \gx
postgres=# SELECT * FROM pg_replication_slots \gx
-[ RECORD 1 ]-------+-----------
slot_name | replica
plugin |
slot_type | physical
datoid |
database |
temporary | f
active | f
active_pid |
xmin |
catalog_xmin |
restart_lsn | 0/4B000000
confirmed_flush_lsn |
wal_status | reserved
safe_wal_size |
two_phase | f
conflicting |
Код: Выделить всё
rm -rf /var/lib/postgresql/beta/*
cp -R /home/student/backup/* /var/lib/postgresql/beta
chown -R postgres:postgres /var/lib/postgresql/beta
Код: Выделить всё
-bash-4.4$ ls -l /var/lib/postgresql/beta/standby.signal
-rw------- 1 postgres postgres 0 Jan 5 21:31 /var/lib/postgresql/beta/standby.signal
-bash-4.4$ cat /var/lib/postgresql/beta/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=student reusepass=1 passfile=''/home/student/.pgpass'' channel_binding=prefer port=5432 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any target_server_type=any hostorder=sequential load_balance_hosts=disable'
primary_slot_name = 'replica'
В файле /var/lib/postgresql/beta/postgresql.conf для новой БД указать номер порта port=5433 отличный от мастера параметр поскольку обе базы данных запускаются на одном Linux
Чтобы не задавать пароль пользователя в /home/student/.pgpass', на тестовом сервере возможно отключить запрос пароля, отредактировав секцию репликации файла pg_hba.conf реплики:
Код: Выделить всё
local replication all trust
Код: Выделить всё
-bash-4.4$ pg_ctl start -D /var/lib/postgresql/beta
2025-01-05 21:36:17.044 MSK [7413] LOG: redirecting log output to logging collector process
2025-01-05 21:36:17.044 MSK [7413] HINT: Future log output will appear in directory "log"
Код: Выделить всё
2025-01-05 21:50:35.626 MSK [10220] LOG: started streaming WAL from primary at 0/4C000000 on timeline 1
Код: Выделить всё
postgres=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
Код: Выделить всё
postgres=# SELECT * FROM pg_replication_slots \gx
-[ RECORD 1 ]-------+-----------
slot_name | replica
plugin |
slot_type | physical
datoid |
database |
temporary | f
active | t
active_pid | 10222
xmin |
catalog_xmin |
restart_lsn | 0/4C538B68
confirmed_flush_lsn |
wal_status | reserved
safe_wal_size |
two_phase | f
conflicting |