文档章节

PostgreSQL的一次恢复记录

kenyon_君羊
 kenyon_君羊
发布于 2017/01/22 10:02
字数 906
阅读 449
收藏 1

有一段时间没有做PostgreSQL的一线恢复了,一直都挺稳定,直到上周省公司产品部打电话,告知数据库不可用了。其实上上周已经协助省公司做过一次主备切换,因为疑似磁盘故障还是文件系统故障导致某几张大表不可读,但是上周又告知备机出故障了,就去现场做了一次支撑。仅记录一下,以备查看。
 

一、环境

OS:CentOS 6.x
DB:PostgreSQL 9.1
DBSize:600G

二、现状与分析
维护人员告诉我,备机进不去了,

--登陆报错

psql: FATAL:  the database system is starting up

查看进程,也不完整,只有两个postgres进程,查看日志,里面有很多报错信息,如下:

2017-01-19 13:25:29.430 CST,,,27618,,59d111c8.1c5a,2,,
2017-01-19 13:25:28 CST,,0,FATAL,XX000,"could not receive data from WAL stream: FATAL:  requested WAL segment 0000000600002B0000000000 has already been removed

分析:
日志其实提示很明显,就是备库所需要的主机上的wal日志被循环覆盖了,看样子是之前维护人员尝试从主机同步数据到备机,然后启动报的错,这里有两点需要注意:

1.主机上的wal日志是类似于Oracle的Redo File或者Mysql的ib_data组,是用来记录数据库事务的文件,是循环记录的;
2.备机恢复时需要读取wal日志,如果不完整或者丢失就会造成恢复中断,就是本例登数据库时一直显示启动中的状态。

这个库比较大,600多G的库传输和恢复需要一个多小时,这么长时间容易导致wal日志被覆盖。解决办法通常有两个,一个是增加wal存盘的数量,但是不好控制,另一个是做一个归档,将新生成的wal日志备份出来,这次采用的是第二个办法。

三、处理

主机上打开归档

archive_mode = on                          --改变这个参数需要重启,建议初始化数据库就打开
archive_command = 'cp %p /archive/%f'      --修改这个参数只需要reload

--重载配置生效
[postgres@bigdata1 ~]pg_ctl -D $PGDATA reload

这个时候就可以看到/archive下面会生成很多新的wal日志了

备机搭建:
使用pg_basebackup方式,参考https://my.oschina.net/Kenyon/blog/202751,略
库比较大,用pg_basebackup备份一开始会有点卡,然后就是一个多小时的传输等待了,拷贝结束,启动还是照样会报错,这个时候需要改一下备机的参数
 

--备机创建接收的归档文件夹
[postgres@bigdata2 ~]$mkdir /archive_stand

--将主机上的archive文件拷贝到备机上来
[postgres@bigdata1 ~] scp /archive/* postgres@192.168.2.199:/archive_stand

--修改postgresql.conf参数
restore_command = 'cp /archive_stand/%f %p'

--重命名recovery.done为recovery.conf,修改里面的primary连接信息,主要是IP改为主机,此处略

--再重新启动,可以发现缺失的wal日志被apply了,恢复成功有success字样日志输出
2017-01-19 15:36:08.592 CST,,,4108,,81e20156.fa8,5,,
2017-01-19 15:36:09 CST,1/0,0,LOG,00000,"restored log file ""0000000600000002F00000021"" from archive",,,,,,,,,""

四、后续其他
1.关闭主备机上的archive存档,不然会撑爆磁盘
2.验证主备数据同步,可以通过建一张新表或者插一条测试数据在备机上是否同步来验证
3.数据库的版本有点低,存在一些BUG,pg_basebackup版本同样也低,不像高版本有限流的一些参数(max_rate),开启同步会消耗大量的IO,如有可能,最好做下升级

© 著作权归作者所有

共有 人打赏支持
下一篇: 再见,2016
kenyon_君羊
粉丝 499
博文 170
码字总数 121714
作品 0
杭州
其他
私信 提问
加载中

评论(1)

刘玉峰
刘玉峰
mark
如何打造 PostgreSQL 闪回环境?

作者介绍 Lottu(乐途),目前就职于深圳宜搜科技有限公司,担任数据库DBA,主要承PostgreSQL、Oracle数据库维护工作以及数据库去O工作。 引言 在 PostgreSQL 数据库;目前是不支持类似 Oracle...

PostgreSQL中文社区
01/16
0
0
PostgreSQL 如何从崩溃状态恢复(上)

背景 为了合并I/O提高性能,PostgreSQL数据库引入了共享缓冲区,当数据库非正常关闭,比如服务器断电时,共享缓冲区即内存中的数据就会丢失,这个时候数据库操作系统重启时就需要从非正常状态...

卓刀
2018/07/10
0
0
Postgres中的WAL(三)ControlFileData & CKPT

控制文件在数据库中非常的重要,里面会记录CKPT信息以及数据库的初始化信息。这篇文件主要分享一下控制文件,以及数据库崩溃的情况下如何如何通过控制文件和CKPT来回放WAL。 PG_VERSION:10....

RDBMS原理分析
2018/07/12
0
0
PostgreSQL备份与恢复

PostgreSQL备份与恢复 官方文档(英文):http://www.postgresql.org/docs/9.4/static/backup.html 官方文档(中文):http://58.58.27.50:8079/doc/html/9.3.1zh/backup.html 逻辑备份: 1.......

YuanyuanL
2015/08/26
0
0
PostgreSQL数据库备份和还原

备份数据库三种方法: SQL转储 文件系统级备份。 持续存档。 pgdump是一个常规的 PostgreSQL客户端应用程序. pgdump不能以特殊权限运行,必须具有对要备份的所有表的读访问权限. pgdump连接受普...

鸿鹄安然
2018/10/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IntelliJ IDEA创建第一个Spring boot项目

下载maven:http://maven.apache.org/download.cgi 开发工具:IntelliJ IDEA JDK: Java JDK1.8 ## 1.为了第一个项目初始化速度加快,我们先来配置maven: 添加配置: 选择Build,Execution,Dep...

凌宇之蓝
40分钟前
2
0
Coding and Paper Letter(四十五)

资源整理。 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型。 它还支持随机建模以解决参数和模型的不确定...

胖胖雕
今天
4
0
golang 声明一个指定长度的数组,用于后续添加

很多时候我们需要声明一个指定长度的数组,用于后续添加.在使用go的时候要注意,下面的第一个例子会有报错 "non-constant array bound",应该使用第二个例子. Length 是动态的值 有报错的例子 ...

漫步海边小路
今天
0
0
Java NIO示例

Server端 /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */package book.chapter1.tcpnio;import java.net.InetSocketAddress;i...

月下狼
今天
0
0
发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部