今天pg主庫出了一點問題,備庫不同步,背景報錯
fatal: requested wal segment 000000030000000000000047 has already been removed
某一個wal日志被移走
第一次出現這種情況的時候,主庫沒開歸檔,是以隻好重新搭建備庫
這次,主庫開了歸檔,是以直接到歸檔目錄去找這個檔案即可
主節點檢視pg_current_xlog_location();wal寫入正常。
備節點檢視select pg_last_xlog_receive_location();值沒有變化,已經不從主節點同步。
歸檔的參數設定:
主庫配置 postgresql.conf
archive_mode = on
archive_command = 'cp %p /pg/data/backup/archived_log/%f'
備庫配置 recover.config
restore_command='cp /pg/data/backup/archived_log/%f %p'
1)如果有歸檔,可以用主節點的歸檔來恢複備節點。
cd /pg/data/backup/archived_log
ll 000000030000000000000047 找到了這個日志
2014-09-05 06:15:41.592 utc,,,25007,,5409550d.61af,2,,2014-09-05 06:15:41 utc,,0,fatal,xx000,"could not receive data
from wal stream: fatal: requested wal segment 000000030000000000000047 has already been removed
将主庫歸檔目錄下的日志傳到備庫的日志目錄下面
[root@localhost archived_log]# scp 000000030000000000000048 [email protected]:/pg/data/pg_xlog/
[email protected]'s password:
000000030000000000000048 100% 16mb 5.3mb/s 00:03
2)如果沒歸檔
沒辦法隻能重建備節點
第1種方法:
重新搭建
因為很多内容都是之前配置好的,是以要做的隻有幾步:
1、停下現有的備庫
pg_ctl -d /pg/data stop
2、開啟主庫的備份狀态
postgres=# select pg_start_backup('/tmp/backup');
pg_start_backup
-----------------
0/64000020
--視窗不要退出
3、把主資料庫目錄拷貝到備庫目錄就可以了:
tar -zcvf data.tar.gz data
sudo scp data.tar.gz [email protected]:/pg
rm -fr data --删除原來的data目錄
tar -zxvf data.tar.gz
--删掉從主庫拷貝過來的postmaster.pid
4、修改recovery.conf
/pg/share/postgresql
[postgres@localhost postgresql]$ cp recovery.conf.sample /pg/data
[postgres@localhost postgresql]$ mv /pg/data/recovery.conf.sample /pg/data/recovery.conf --去找一個模闆過來修改
vi /pg/data/recovery.conf
standby_mode = on
primary_conninfo = 'host=192.168.10.173 port=5432 user=postgres password=tina' # e.g. 'host=localhost port=5432'
trigger_file = '/tmp/pg.trigger.456' --主備切換的時候有用
5、停下主庫備份
postgres=# select pg_stop_backup();
notice: pg_stop_backup complete, all required wal segments have been archived
pg_stop_backup
----------------
0/640001f8
6、啟動備庫
pg_ctl -d /pg/data start
搞定,主備同步
---------
注意:
wal_level=hot_standby
wal_keep_segments=1024
max_wal_sender=1 ---限制備庫個數為1
而自己定義的/pg/pg_log1是記錄資料庫的所有操作和報錯
logging_collector = on
log_directory = '/pg/pg_log1'
log_filename = 'postgresql-%y-%m-%d_%h%m%s.log'
log_rotation_age = 1d
log_rotation_size = 10mb
postgresql-2014-09-05_061148.log --類似這種格式
第2中,使用pg_basebackup線上搭建從庫
1.關閉資料庫pg_ctl stop -d $pgdata
2.備份了postgresql.conf pg_hba.conf,recovery.conf三個檔案,然後清理$pgdata下面的所有資料, ~/.pgpass保持原來的不需要修改
3.清理相關表空間目錄
4.通過pg_basebackup從主庫複制資料
pg_basebackup -d /data01/pgdata/browser/pg_root -fp -xs -v -p -h 192.168.xxx.xxx -p 1921 -u replica,大概花了1個多小時 完成資料複制。
5.複制完成後,将備份的postgresql.conf pg_hba.conf,recovery.conf三個檔案複制到$pgdata下
6.啟動備庫pg_ctl start -d $pgdata
3)備庫重建後檢查:
1.檢查日志,以及相關wal程序。ps -elf | grep wal | grep -v grep
2.檢查備節點select pg_last_xlog_receive_location();,已經可以變化說明在從主節點複制同步
3.主節點建立表,插入資料,檢視備節點是否同步成功。