前言:
本人在網上找了很多關於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”表測試,能立刻同步到從庫中: