前言:
本人在网上找了很多关于postgresql的双机主从库备份的教程,并不能跑起来,期间遇到了很多坑,搭建无果,一言难尽;最后慢慢摸索出来的方式,有不足处望大神多多指导。
官方文档明确表示:recovery.conf文件已与postgres.conf合并请看以下找到的官方内容(此内容请以官方为准),所以使用此教程那么从机服务器尽量使用postgresql 12 之前的版本:
Move recovery.conf settings into postgresql.conf (Fujii Masao, Simon Riggs, Abhijit Menon-Sen, Sergei Kornilov)
recovery.conf is no longer used, and the server will not start if the file exists. recovery.signal and standby.signal are now used to switch into non-primary mode. trigger_file has been renamed to promote_trigger_file. The standby_mode setting has been removed.
废话不多说直接开始吧:
正文:
一,配置环境与主从机服务器说明:
本人用的是Ubuntu16的64位系统版本,主从机服务器部署了postgresql 9.5版本
主机服务器IP:192.168.190.131
从机服务器IP:192.168.190.132
二,先来配置主服务器(需要安装postgresql的小伙伴看我另外一篇安装教程:https://my.oschina.net/u/2336787/blog/5272061):
主服务器需要配置允许从服务器可以通过内部job任务取得数据流的用户以及配置。
开始你的配置:
vim /etc/postgresql/9.5/main/postgresql.conf
添加下面配置项:
listen_addresses = '192.168.190.131' #配置主库的ip,查找命令:ip addr
wal_level = hot_standby #
synchronous_commit = local #同步本地设置。
max_wal_senders = 2
wal_keep_segments = 10
pg_hba.conf文件配置,添加允许的用户列表
vim /etc/postgresql/9.5/main/pg_hba.conf
添加以下内容:
host replication repl 127.0.0.1/32 md5 #授权repl用户本地访问
host replication repl 192.168.190.131/32 md5 #授权repl用户主机服务器ip地址访问
host replication repl 192.168.190.132/32 md5 #授权repl用户从机服务器ip地址访问
启动服务器执行命令查看启动端口情况:
sudo /etc/init.d/postgresql start;
sudo netstat -tnlp |grep 5432
成功标志结果(如果未能启动成功请检查是否正确配置):
root@ubuntu:/# sudo /etc/init.d/postgresql start;
[ ok ] Starting postgresql (via systemctl): postgresql.service.
root@ubuntu:/# sudo netstat -tnlp |grep 5432
tcp 0 0 192.168.190.131:5432 0.0.0.0:* LISTEN 920/postgre
此时已经配置好,但现在还灭有配置项的授权用户,接下来创建一下授权用户:
执行命令:
sudo -u postgres psql
创建授权用户:
postgres=# CREATE USER repl REPLICATION LOGIN ENCRYPTED PASSWORD '123456';
三,再来配置从服务器(需要安装postgresql 的小伙伴看我另外一篇安装教程:https://my.oschina.net/u/2336787/blog/5272061):
从服务器只有读取(READ)权限,没有写入权限,所以不能修改。
配置前停止数据库:
sudo /etc/init.d/postgresql stop;
执行命令编辑配置文件:
vim /etc/postgresql/9.5/main/postgresql.conf
添加下面配置项:
listen_addresses = '192.168.190.131' #配置主库的ip,查找命令:ip addr
wal_level = hot_standby #
synchronous_commit = local #同步本地设置。
max_wal_senders = 2 #
wal_keep_segments = 10 #
hot_standby = on #
切换postgres用户
su - postgres
备份原来的main文件夹:
mv /var/lib/postgresql/9.5/main /var/lib/postgresql/9.5/main20211013.bak
创建一个新文件夹main
mkdir /var/lib/postgresql/9.5/main
赋权:
chmod 700 /var/lib/postgresql/9.5/main
chown -R postgres.postgres /var/lib/postgresql/9.5/main
将连接主机服务器拷贝对应的main数据流
pg_basebackup -h 192.168.190.131 -U repl -D /var/lib/postgresql/9.5/main -P --xlog #如需要直接添加recovery.conf在命令后面添加 -R 即可。
添加一个recovery.conf文件,执行命令:
vim /var/lib/postgresql/9.5/main/recovery.conf
在该文件添加下面内容:
standby_mode = 'on'
primary_conninfo = 'host=192.168.190.131 port=5432 user=repl password=123456'
trigger_file = '/tmp/postgresql.trigger.5432'
再授权:
chmod 600 /var/lib/postgresql/9.5/main/recovery.conf
chown -R postgres.postgres /var/lib/postgresql/9.5/main/recovery.conf
启动服务器执行命令查看启动端口情况:
sudo /etc/init.d/postgresql start;
sudo netstat -tnlp |grep 5432
成功标志结果(如果未能启动成功请检查是否正确配置):
root@ubuntu:/# sudo /etc/init.d/postgresql start;
[ ok ] Starting postgresql (via systemctl): postgresql.service.
root@ubuntu:/# sudo netstat -tnlp |grep 5432
tcp 0 0 192.168.190.132:5432 0.0.0.0:* LISTEN 920/postgre
效果呈现:
测试一:当主库变动也将热备份到从库当中。而从库中只有读取没有写入功能
测试二:当从库操作写入时不允许操作:
测试三:主库删除“tttttt”表测试,能立刻同步到从库中: