PG学习日记(2)PG13.7部署standby库

后备服务器作为主服务器的数据备份,可以保障数据不丢,而且在主服务器发生故障后可以提升为主服务器继续提供服务。

环境:

IP

主机名

系统

数据库

111.111.111.221

pg13

centos 7.6

Postgresql 13.7

111.111.111.220

pg13standby

centos 7.6

Postgresql 13.7

1、主库参数配置

首先配置主机的postgresql.conf

vi
/app/pgsql/13.7/data/postgresql.conf

listen_addresses = '*'
wal_level = replica #replica = 9.6版本以前的archive和hot_standby --该级别支持wal归档和复制。
max_wal_senders = 10
max_replication_slots = 10
hot_standby = on # 主要用来备库配置,主库配置无影响
wal_keep_size = 0
#pg13后配置,之前是wal_keep_segments
wal_log_hints = on #pg_rewind必须参数
full_page_writes = on

然后配置主机的pg_hba.conf

vi
/app/pgsql/13.7/data/pg_hba.conf

host replication all 111.111.111.220/24 trust #新增

2、安装PG备库

2.1、创建用户组

可以先删除默认创建的postgres用户

userdel -r postgres

然后创建用户组

groupadd -g 701
postgres

useradd -g 701 -u
701 -s /bin/bash -m postgres

这样的好处是用户home目录就会在/home/postgres下,否则默认是在/var/lib/pgsql下,

su - postgres

vi
~/.bashrc

添加下面变量

#For PostgreSQL

export
PGHOME=/usr/pgsql-13

export
PGDATA=/app/pgsql/13.7/data

export
PGHOST=/app/pgsql/13.7/socket

export
PGUSER=postgres

export
LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH

export
PATH=$PGHOME/bin:$PATH

2.2、修改数据库配置 --这里和主库保持一致,好像是没有强制要求

前面修改的数据库目录,这里需要创建相关目录,且要赋予权限

# mkdir /app

# chown
postgres:postgres /app

# su - postgres

$ mkdir -p
/app/pgsql/13.7/data

$
mkdir -p /app/pgsql/13.7/socket

$ mkdir -p /app/pgsql/13.7/tablespace --自定义表空间目录

yum install
postgresql13-libs-13.7-1PGDG.rhel7.x86_64.rpm

yum install
postgresql13-13.7-1PGDG.rhel7.x86_64.rpm

yum install
postgresql13-server-13.7-1PGDG.rhel7.x86_64.rpm

yum install
postgresql13-contrib-13.7-1PGDG.rhel7.x86_64.rpm

装好四个安装包后就不要初始化了

2.3、修改数据存储目录在自启动脚本中的值

# vi
/usr/lib/systemd/system/postgresql-13.service

# Location of
database directory

#
Environment=PGDATA=/var/lib/pgsql/13/data/ #-- 注释掉这一句

Environment=PGDATA=/app/pgsql/13.7/data/ #-- 修正为实际值

3、使用pg_basebackup创建备机数据库

在备库上执行命令备份主库到备库

pg_basebackup
-Upostgres -Fp -X stream -R -P -v -D $PGDATA -p 5432 -h 111.111.111.221

pg_basebackup
-h 111.111.111.221 -R -p 5432
-Upostgres --password -X stream -Fp --progress -D $PGDATA

如果有自定义表空间那么要单独为自定义表空间指定目录,否则会报错,本次就是有一个自定义表空间test_tb,且在data目录内。

PG学习日记(2)PG13.7部署standby库

虽然命令是把data目录的表空间备份过去,但是test_db是自定义的,所以命令里也必须手工指定

原计划是和主库同样放在data目录内,结果执行报错

pg_basebackup -h 111.111.111.221 -R -p
5432 -Upostgres --password -X stream -Fp --progress -D $PGDATA -T /app/pgsql/13.7/data/test_tb=/app/pgsql/13.7/data/test_tb

PG学习日记(2)PG13.7部署standby库

说data目录非空。。。 好吧,那就在指定另一个目录,没有创建也可以,命令会自动创建

pg_basebackup -h 111.111.111.221 -R -p
5432 -Upostgres --password -X stream -Fp --progress -D $PGDATA -T /app/pgsql/13.7/data/test_tb=/app/pgsql/13.7/test_tb

PG学习日记(2)PG13.7部署standby库

3、启动备机数据库服务器

修改数据存储目录在自启动脚本中的值

# vi
/usr/lib/systemd/system/postgresql-13.service

# Location of
database directory

#
Environment=PGDATA=/var/lib/pgsql/13/data/ #-- 注释掉这一句

Environment=PGDATA=/app/pgsql/13.7/data/ #-- 修正为实际值

pg_ctl start

PG学习日记(2)PG13.7部署standby库

报错已经提示了是权限问题,但不是没有权限,而是权限设置不对,因为是解压过来的备份,所以权限是775,提示要700或750

PG学习日记(2)PG13.7部署standby库

查看源库是700,那就修改为700

PG学习日记(2)PG13.7部署standby库

PG学习日记(2)PG13.7部署standby库

成功启动,但是有信息[10164] HINT: Future log output
will appear in directory "log".

4、检查

登录主机查看流复制关系

psql
-Upostgres -dpostgres -p5432
select * from
pg_stat_replication;

PG学习日记(2)PG13.7部署standby库

主机插入数据

./psql -Upostgres
-dpostgres -p54321
create table t1 (idint ,name varchar);
insert into t1 values (1,'cli');

备机查询数据,数据同步成功

psql -Upostgres
-dpostgres -p54322
select* from t1;

PG学习日记(2)PG13.7部署standby库