天天看點

FATAL: requested WAL *** segment has already been removed

今天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.主節點建立表,插入資料,檢視備節點是否同步成功。