#准備
PostgreSQL12.3版本容器兩台,部署參考https://www.cnblogs.com/zspwf/p/16113298.html
主庫: 192.168.3.14:2200
從庫: 192.168.3.14:2201
#主庫
1.新建用於復制的用戶
CREATE ROLE replicate WITH LOGIN PASSWORD 'xyz!345' REPLICATION ;
2.往主庫的pg_hba.conf文件追加以下內容,其中192.168.3.14為從庫IP,/data/nismes/bd-test/為映射容器目錄,未映射請進入容器執行
METHOD參數解析
md5是常用的密碼認證方式,如果你不使用ident,最好使用md5。密碼是以md5形式傳送給數據庫,較安全,且不需建立同名的操作系統用戶。
password是以明文密碼傳送給數據庫,建議不要在生產環境中使用。
trust是只要知道數據庫用戶名就不需要密碼或ident就能登錄,建議不要在生產環境中使用。
reject是拒絕認證。
#映射執行
echo "host replication replicate 192.168.3.14/32 trust" >> /data/nismes/bd-test/pg_hba.conf
#未映射執行
docker exec -it 容器id /bin/bash
echo "host replication replicate 192.168.3.14/32 trust" >> /var/lib/postgresql/data/pg_hba.conf
3.主庫開啟歸檔模式
方式1
ALTER SYSTEM SET archive_command = ON ;
ALTER SYSTEM SET archive_command ='cp -i %p /home/%f </dev/null';
方式二:打開postgresql.conf文件,修改參數
4.主庫配置完成,重啟數據庫
#從庫
1.進入容器 ,執行命令
//將文件備份至Home目錄
pg_basebackup -h 192.168.3.14 -p 2200 -U replicate -w -Fp -Xs -Pv -R -D /home
//覆蓋數據目錄
cp -R /home/* /var/lib/postgresql/data/
//清空home目錄
rm -rf /home/*
2.設置備用服務器連接字符串
primary_conninfo
指定備用服務器用來連接發送服務器的連接字符串。這個字符串的格式在libpq-connstring中描述。 如果在這個字符串中有任何選項未被指定,那么將檢查相應的環境變量(見libpq-envars)。 如果環境變量也沒有被設置,則使用默認值。
連接字符串應當指定發送服務器的主機名(或地址),以及端口號(如果它和備用服務器的默認端口不同)。 還要指定對應於發送服務器上合適權限角色的用戶名(見streaming-replication-authentication)。 如果發送服務器要求口令認證,還需要提供一個口令。它可以在primary_conninfo字符串中提供,或者在后備服務器(使用replication作為數據庫名)的一個單獨~/.pgpass文件中提供。 不要在primary_conninfo字符串中指定一個數據庫名。
這個參數只能在服務器啟動時被設置。如果服務器沒有處於備用模式,則此設置無效。
ALTER SYSTEM SET primary_conninfo = 'user=replicate passfile=''/root/.pgpass'' host=192.168.3.14 port=2200 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'; ALTER SYSTEM SET max_connections ='300';
3.重啟從庫
#測試
主庫查看復制
select * from pg_stat_replication;
主庫創建數據庫測試
CREATE TABLE test2(fc1 varchar(50),fc2 int);
主庫插入測試
INSERT INTO test2 SELECT '測試1',1
從庫查看
SELECT * FROM test2
從庫刪除測試
DROP TABLE test2