后备服务器作为主服务器的数据备份,可以保障数据不丢,而且在主服务器发生故障后可以提升为主服务器继续提供服务。
环境:
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目录内。
虽然命令是把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
说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
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
报错已经提示了是权限问题,但不是没有权限,而是权限设置不对,因为是解压过来的备份,所以权限是775,提示要700或750
查看源库是700,那就修改为700
成功启动,但是有信息[10164] HINT: Future log output will appear in directory "log".
4、检查
登录主机查看流复制关系
psql -Upostgres -dpostgres -p5432
select * from pg_stat_replication;