天天看點

postgresql主從備份_Postgresql主從熱備配置

軟體環境

CentOS5.1

Postgresql  9.4.10

一、 安裝postgreSQL

1.YUM自動擷取版本

SHELL>wget --no-check-certificate https://yum.postgresql.org/9.4/redhat/rhel-5-x86_64/pgdg-redhat94-9.4-1.noarch.rpm

SHELL>rpm -ivh pgdg-redhat94-9.4-1.noarch.rpm

SHELL>yum install postgresql94-server postgresql94-contrib

2.初始化資料庫

SHELL>/etc/init.d/postgresql-9.4 initdb

3.啟動資料庫

SHELL>/etc/init.d/postgresql-9.4 start

4.進入資料庫

SHELL>su  postgres

SHELL>psql

5.修改密碼

SQL>alter user postgres with password 'postgres';

6.啟動服務

SHELL>service postgresql-9.4 restart

二、配置過程

主機IP:server.example.com

從機IP:client.example.com

資料庫:postgres

使用者名:postgres

密  碼:postgres

1. 主機pg_hba.conf添加備份主從資料庫

# IPv4 local connections

host    replication     postgres        client.example.com/32         trust

host    replication     postgres        server.example.com/32         trust

2. 主機postgresql.conf配置(‘#’非必須)

wal_level = hot_standby #開啟主從熱備模式

max_wal_senders = 10      #從機可連接配接數

wal_keep_segments = 32

#check_function_bodies = on

#checkpoint_segments = 16

#hot_standby = on

#hot_standby_feedback = on

#autovacuum = on

#fsync = on #異步資料同步

#full_page_writes = on

#archive_mode = on #打開歸檔模式

#archive_command = 'cp %p /var/lib/pgsql/9.4/data/pg_archive/%f'

#将歸檔檔案儲存在data/archive目錄下

#log_destination = 'csvlog'

#logging_collector = on

#log_directory = '/var/log/pgsql-log/'

#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

#log_truncate_on_rotation = on

#log_rotation_age = 1d

#log_rotation_size = 10MB

#log_min_duration_statement = 1000

#log_lock_waits = on

#log_statement = ' ddl '

#log_timezone = 'PRC'

#log_autovacuum_min_duration = 0

3. 建立歸檔檔案和日志檔案

SHELL>mkdir /var/lib/pgsql/9.4/data/pg_archive

SHELL>chown -R postgres.postgres /var/lib/pgsql/9.4/data/pg_archive

SHELL>mkdir /var/log/pgsql-log

SHELL>chown -R postgres.postgres /var/log/pgsql-log

4. 重新開機動服務

SHELL>service postgresql-9.4 restart

5. 基礎備份

SQL> select pg_start_backup('');

6. 從資料庫删除 data目錄

SHELL>rm -rf /var/lib/pgsql/9.4/data

7. 拷貝主資料庫至從伺服器

SHELL>scp -rp /var/lib/pgsql/9.4/data [email protected]:/var/lib/pgsql/9.4/

SHELL>chown -R postgres.postgres /var/lib/pgsql/9.4/data

8. 結束主資料庫的備份狀态

SQL> select pg_stop_backup();

9. 檢視是否成功歸檔

SHELL>cd /var/lib/pgsql/9.4/data/pg_archive

SHELL>ls

10. 移動歸檔檔案到從機

SHELL>scp -rp /var/lib/pgsql/9.4/data/pg_archive [email protected]:/var/lib/pgsql/9.4/data/

SHELL>chown -R postgres.postgres /var/lib/pgsql/9.4/data/pg_archive

11. 從機資料庫配置

SHELL>mkdir /var/log/pgsql-log

SHELL>chown -R postgres.postgres /var/log/pgsql-log

postgresql.conf 設定hot_standby = on

12. 添加recovery.conf檔案(在$PG_HOME/share裡,使用者組postgresql),并錄入以下内容

restore_command = 'cp /var/lib/pgsql/9.4/data/pg_archive/%f %p'

standby_mode = on

primary_conninfo = 'host=server.example.com port=5432 user=postgres password=postgres'

trigger_file = '/trigger.postgres'(任意值)

13. 删除從資料庫postmaster.pid檔案以及pg_xlog下的檔案,并重新啟動服務

SHELL>rm /var/lib/pgsql/9.4/data/postmaster.pid

SHELL>rm -rf /var/lib/pgsql/9.4/data/pg_xlog/*

SHELL>service postgresql-9.4 restart

13.驗證是否配置成功并确定主從機

①.主機表中能查到記錄,從機表中沒有

SQL>select * from pg_stat_replication;

√②.根據psql自帶函數判斷,主機f 從機t

SQL>select pg_is_in_recovery();

√③. 檢視postgresql線程,wal sender是主機,wal receiver是從機

SHELL>ps -ef|grep postgres

如果都驗證失敗,可以setup指令關閉防火牆再次驗證

14. 主從切換

①.關閉主機服務

SHELL>service postgresql-9.4 stop

有trigger_file觸發檔案則删除

SHELL>rm  trigger_file檔案

從機進行驗證(結果應該無wal receiver項)

SHELL>ps -ef|grep postgres

②.觸發從機為主機

SHELL>touch  trigger_file檔案

驗證(應包含autovacuum項且recovery檔案字尾變為done)

SHELL>ps –ef|grep postgres

③.建立新從機,以下選一種方式

(一)按主從熱備配置建立

(二)複制新主機的recovery.conf檔案,并修改配置

Ⅰprimary_conninfo資訊

Ⅱ添加recovery_target_timeline = 'latest'(不加會有timeline時間線問題)

Ⅲ重命名唯一trigger_file  然後同步歸檔檔案

SHELL>scp -rp /var/lib/pgsql/9.4/data/pg_archive [email protected]:/var/lib/pgsql/9.4/data

SHELL>chown postgres:postgres /var/lib/pgsql/9.4/data

④.啟動新從機

SHELL>service postgresql-9.4 start

三、部分問題記錄

could not connect to the primary server 關閉防火牆

server closed the connection unexpectedly啟動postgreSQL服務/var/lib/pgsql權限需為700

參考部落格