軟體環境
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
參考部落格