前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WAL has already been removed修复

WAL has already been removed修复

原创
作者头像
DB之路
修改2021-03-14 17:02:58
3.6K0
修改2021-03-14 17:02:58
举报
文章被收录于专栏:数据库PG数据库PG

今天pg主库出了一点问题,备库不同步,后台报错 

故障如图
故障如图

某一个wal日志被移走 

第一次出现这种情况的时候,主库没开归档,所以只好重新搭建备库 

这次,主库开了归档,所以直接到归档目录去找这个文件即可 

主节点查看pg_current_xlog_location();wal写入正常。 

备节点查看select pg_last_xlog_receive_location();值没有变化,已经不从主节点同步。 

归档的参数设置: 

主库配置  postgresql.conf 

archive_mode = on            

archive_command = 'cp %p /data/postgres/data/archived_log/%f'   

备库配置 recover.config 

restore_command='cp /data/postgres/data/archived_log/%f  %p' 

1)如果有归档,可以用主节点的归档来恢复备节点。 

cd /data/postgres/data/archived_log 

ll 00000008000000000000001A  找到了这个日志 

could not receive data from WAL stream: ERROR: requested WAL segment 00000008000000000000001A has already been removed

将主库归档目录下的日志传到备库的日志目录下面 

[root@pg1 archived_log]# scp 00000008000000000000001A root@10.10.10.175:/pg/data/pg_xlog/ 

root@10.10.10.175's password: 

00000008000000000000001A                                                    100%   16MB   5.3MB/s   00:03    

2)如果没归档 

没办法只能重建备节点 

第1种方法: 

重新搭建 

因为很多内容都是之前配置好的,因此要做的只有几步: 

1、停下现有的备库 

pg_ctl -D /data/postgres/data -m fast 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 root@10.10.10.175:/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=10.10.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 

第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.主节点新建表,插入数据,查看备节点是否同步成功。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档