postgresql 復制


異步復制

#創建復制數據庫用戶
CREATE ROLE rep login replication encrypted password  'rep';

#修改配置文件pg_hba.conf,增加replica用戶,進行同步
host  replication rep 192.168.20.201/24 md5
host  replication rep 192.168.20.202/24 md5

#修改配置文件postgresql.conf,修改以下幾個地方
wal_level = hot_standby  # 這個是設置主為wal的主機
max_wal_senders = 32 # 這個設置了可以最多有幾個流復制連接,差不多有幾個從,就設置幾個
wal_keep_segments = 256 # 設置流復制保留的最多的xlog數目
wal_sender_timeout = 60s # 設置流復制主機發送數據的超時時間
max_connections = 100 # 這個設置要注意下,從庫的max_connections必須要大於主庫的


登錄postgre用戶,測試連接主庫數據庫是否正常
psql -h 192.168.20.201

#若鏈接正常,刪除從庫data目錄下文件
rm -rf data/*

#通過pg_basebackup命令行在從庫上生成基礎備份
pg_basebackup -h 192.168.20.201 -U rep -Fp -X stream  -P -R -D /u01/pgsql/data  -l replbackup20191015
#參數說明:
#        -h:指定連接的數據庫的主機名或IP地址,這里就是主庫的ip
#        -U:指定連接的用戶名,此處是我們剛才創建的專門負責流復制的repl用戶
#        -F:指定了輸出的格式,支持p(原樣輸出)或者t(tar格式輸出)
#        -X:表示wal日志格式
#        -P:表示允許在備份過程中實時的打印備份的進度
#        -R:表示會在備份結束后自動生成recovery.conf文件,這樣也就避免了手動創建
#        -D:指定把備份寫到哪個目錄
#        -l:表示指定一個備份的標識,運行命令后看到如下進度提示就說明生成基礎備份成功

#修改從庫數據目錄下的postgresql.conf文件,將hot_standby改為啟用狀態
hot_standby=on

#重啟從數據庫


postgres=# SELECT client_addr,application_name,sync_state FROM pg_stat_replication;
  client_addr   | application_name | sync_state 
----------------+------------------+------------
 192.168.20.202 | walreceiver      | async
(1 row)

  同步復制

修改主庫postgresql.conf  
synchronous_standby_names = 'rep1' 


重啟主數據庫

postgres=# SELECT client_addr,application_name,sync_state FROM pg_stat_replication;
  client_addr   | application_name | sync_state 
----------------+------------------+------------
 192.168.20.202 | rep1      | sync
(1 row)

  延遲復制

延遲復制是加快誤操作恢復 ,比如dml、ddl操作失誤  比用備份pitr恢復速度快,pitr是恢復整庫.
修改備庫上的recovery.conf
[postgres@redis03 data]$ cat recovery.conf
standby_mode = 'on'
primary_conninfo = 'application_name=rep2 user=rep password=rep host=192.168.20.201 port=5432 sslmode=prefer sslcompression=0 krbsrvname=postgres target_session_attrs=any'
recovery_min_apply_delay = '8h'
recovery_target_timeline = 'latest'

啟動數據庫

延遲復制 演練
postgres=# \d
        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t    | table | postgres
 public | t1   | table | postgres
 public | t2   | table | postgres
(3 rows)

postgres=# delete from t2 ;
DELETE 10000
主庫上查延遲時間
postgres=# SELECT client_addr,application_name,sync_state,replay_lag  FROM pg_stat_replication;
  client_addr   | application_name | sync_state |   replay_lag    
----------------+------------------+------------+-----------------
 192.168.20.202 | rep1             | sync       | 
 192.168.20.203 | rep2             | async      | 00:02:02.748067
(2 rows)

備庫上查看復制事務的最后時間 、lsn、現在時間
postgres-# SELECT pg_last_wal_replay_lsn(), pg_last_xact_replay_timestamp(),now() ;
 pg_last_wal_replay_lsn | pg_last_xact_replay_timestamp |              now              
------------------------+-------------------------------+-------------------------------
 0/251BE288             | 2019-10-15 18:03:27.592845+08 | 2019-10-16 11:18:57.641601+08
(1 row)



延遲復制庫停止復制
postgres=# SELECT pg_wal_replay_pause();
 pg_wal_replay_pause 
---------------------
 
(1 row)

啟動復制
select pg_wal_replay_resume(); 主庫的數據 postgres=# select count(1) from t2; count ------- 0 (1 row) 備庫的數據 postgres=# select count(1) from t2; count ------- 10000 (1 row) 停止延遲復制數據庫 pg_ctl stop -m fast 修改recovery.conf [postgres@redis03 data]$ cat recovery.conf standby_mode = 'on' primary_conninfo = 'application_name=rep2 user=rep password=rep host=192.168.20.201 port=5432 sslmode=prefer sslcompression=0 krbsrvname=postgres target_session_attrs=any' recovery_target_time = '2019-10-16 10:18:57.641601+08' 如果恢復的數據不是需要的,可以慢慢推進recovery_target_time 時間

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM