昨天,一重要生产环境的备库主机由于硬件故障需要停机做硬件检测,由于是流复制环境,备库可以停,停机检测大概花了 2 小时左右,之后再次启动备库时,报了如下错误:
数据库日志
1 |
2013-07-01 13:25:29.430 CST,,,27738,,51d112c8.6c5a,1,,2013-07-01 13:25:28 CST,,0,LOG,00000,"streaming replication successfully connected to primary",,,,,,,,"libpqrcv_connect, libpqwalreceiver.c:171","" |
备注:根据报错信息,很容易知道是由于停机时间的过程中备库所需的 WAL 已经被主库循环使用覆盖了,而在备库停机维护过程中,主库并未打开归档,这时这个备库需要重做了。也许有人会问,为何不一直打开主库的归档,我想说的是,这个库在 TB 级而且比较繁忙,忙的时候一天的归档 600 GB左右,这么大的归档需要大量的存储。但是在备库停机维护过程中,建议主库打开归档,只要不把归档目录撑满,那么在备库重新恢复后,有了主库的归档,那么备库依然能够跟上主库,为了加深理解,下面模拟这个错误,并演示规避方法:
环境信息
主机: 笔记本虚拟机
系统: Red Hat Enterprise Linux Server release 6.2
版本: PostgreSQL 9.3beta1
主库IP: 192.168.1.36 主机名:redhatB
备库IP: 192.168.1.35 主机名: redhat6
备注: 流复制搭建过程略,参考 PostgreSQL:使用 pg_basebackup 搭建流复制环境
模拟过程
2.1 设置主库 postgresql.conf
为了容易出演示效果,设置以下参数,其它参数根据需求设置:
1 |
checkpoint_segments = 3 |
备注:归档目录 /archive/pg93/ 需要创建好并赋相应权限。
2.2 重载配置文件
1 |
[pg93@redhatB pg_root]$ pg_ctl reload -D $PGDATA |
备注:参数修改好后需要 reload 。
2.3 测试前: 主库数据
1 |
[pg93@redhatB ~]$ psql |
2.4 测试前: 备库数据
1 |
[pg93@redhat6 ~]$ psql |
备注:这里先标记下数据,以便后面做对比。
2.5 停备库
1 |
[pg93@redhat6 ~]$ pg_ctl stop -m fast -D $PGDATA |
2.6 在主库上执行以下操作
1 |
postgres=# insert into test_1 values (5,now()); |
便于显示,重复内容就不贴了。
2.7 查看归档目录
1 |
[pg93@redhatB pg93]$ ll /archive/pg93/ | wc -l |
备注:这时归档目录就产生了一些归档的 WAL 日志。
2.8 启动备库
1 |
[pg93@redhat6 ~]$ pg_ctl start -D $PGDATA |
备注:数据库能启来,但查看日志,报以下错误:
2.9 csv 日志
1 |
[pg93@redhat6 pg_log]$ tail -f postgresql-2013-07-02_062642.csv |
备注:目标的错误已重现,在主库的 $PGDATA/pg_xlog 目录里已找不到 000000010000000100000022 文件了,因为 XLOG 文件已被循环使用覆盖了,但在归档目录 /archive/pg93 里可以找到。
2.10 复制主库归档目录的 WAL 到备节点
1 |
[pg93@redhatB pg93]$ scp /archive/pg93/* pg93@192.168.1.35:/archive/pg93 |
备注:这时把主节点上归档目录的 WAL 文件复制到备节点的归档目录。
2.11 修改备库 recovery.conf 文件的以下参数
1 |
restore_command = 'cp /archive/pg93/%f %p' |
备注:其它参数略, 参考 PostgreSQL:使用 pg_basebackup 搭建流复制环境
2.12 重启备库
1 |
[pg93@redhat6 pg_root]$ pg_ctl stop -m fast -D $PGDATA |
2.13 查看备库日志
1 |
[pg93@redhat6 pg_log]$ tail -f postgresql-2013-07-02_063606.csv |
备注:此时备库从归档目录取到所需的 WAL 后开始拼命追主库,直到看到上面日志的最后一行信息时表示已完全追上主库。
验证
3.1 主库
1 |
[pg93@redhatB ~]$ psql |
3.2 备库
1 |
[pg93@redhat6 pg_root]$ psql |
备注:此时在备库停掉过程中新增的数据也已经同步到备库了,恢复成功。
总结
-
对于比较繁忙的库,建议给 pg_xlog 分配较大的存储,从而能保留较多的 WAL 文件,在备节点
停机维护后,能够获得更多的停库时间。 -
对于更繁忙的大数据库,例如 TB 级,如果没有足够的存储长期开启归档,那么至少在备节点需要
停库维护时的这段时间把归档开启,否则当备库启来后追不上主库时,TB 级库重做 standby 的代
价是可想而知。参考
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/237994.html