[size=small]今天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
将主库归档目录下的日志传到备库的日志目录下面
# 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' --主备切换的时候有用
restore_command='cp /pg/data/backup/archived_log/%f %p'
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.主节点新建表,插入数据,查看备节点是否同步成功。[/size]