我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!

由于博客中有大量代码,通过页面浏览效果更佳。

今天这个故障感觉有点奇怪,突然PG就报归档日志错误了。我们都知道PG的归档操作是非常的灵活,完全可以由用户自定义,也是自定义灵活,所以引发了很多故障,有些隐患及时发现了,有些隐患只有在出现重大故障时才能发现,就如本次这个故障,如果没有提示归档失败,后续数据库如果要事故时,就会遇到归档日志文件损坏,数据库无法恢复的重大事故,所以我们常常会说一句话:系统没有隐患,可能是由于自己能力不足没有发现,但并不代表系统没有隐患。

1 故障现象

后台日志文件提示归档失败,原因是归档命令返回1的错误,通过重试多少还是失败

2025-07-28 18:27:34.147 CST,,,29398,,68874fdc.72d6,13,,2025-07-28 18:24:28 CST,,0,LOG,00000,"archive command failed with exit code 1","The failed archive command was: test ! -f /postgresql/archive/1721/000000080000002600000006 && cp pg_wal/000000080000002600000006 /postgresql/archive/1721/000000080000002600000006",,,,,,,"pgarch_archiveXlog, pgarch.c:589","","archiver",,0
2025-07-28 18:27:35.151 CST,,,29398,,68874fdc.72d6,14,,2025-07-28 18:24:28 CST,,0,LOG,00000,"archive command failed with exit code 1","The failed archive command was: test ! -f /postgresql/archive/1721/000000080000002600000006 && cp pg_wal/000000080000002600000006 /postgresql/archive/1721/000000080000002600000006",,,,,,,"pgarch_archiveXlog, pgarch.c:589","","archiver",,0
2025-07-28 18:27:36.155 CST,,,29398,,68874fdc.72d6,15,,2025-07-28 18:24:28 CST,,0,LOG,00000,"archive command failed with exit code 1","The failed archive command was: test ! -f /postgresql/archive/1721/000000080000002600000006 && cp pg_wal/000000080000002600000006 /postgresql/archive/1721/000000080000002600000006",,,,,,,"pgarch_archiveXlog, pgarch.c:589","","archiver",,0
2025-07-28 18:27:36.155 CST,,,29398,,68874fdc.72d6,16,,2025-07-28 18:24:28 CST,,0,WARNING,01000,"archiving write-ahead log file ""000000080000002600000006"" failed too many times, will try again later",,,,,,,,"pgarch_ArchiverCopyLoop, pgarch.c:486","","archiver",,0

这里提示次数很多,稍后再试了。

2 故障分析

2.1 查询统计信息

在archiver的视图中可以看到报错的次数,上次报错的wal文件及报错时间。

postgres_1721@postgres > SELECT * FROM pg_stat_archiver;
archived_count | last_archived_wal | last_archived_time | failed_count | last_failed_wal | last_failed_time | stats_reset
----------------+--------------------------+-------------------------------+--------------+--------------------------+-------------------------------+-------------------------------
31 | 000000080000002A00000004 | 2025-07-28 21:15:14.949197+08 | 2704 | 000000080000002600000006 | 2025-07-28 21:12:59.153555+08 | 2025-07-28 06:15:08.470418+08

2.2 确认备份命令错误

手动执行备份命令,确认备份命令是否报错

[root@pgc ~]# test ! -f /postgresql/archive/1721/000000080000002600000006 && cp pg_wal/000000080000002600000006 /postgresql/archive/1721/000000080000002600000006
[root@pgc ~]# echo $?
1

这里看到整个命令返回1的错误,说明跟数据库后台日志报错一样。

查看归档日志文件已经存在了。

[root@pgc ~]# ls -l  /postgresql/archive/1721/000000080000002600000006
-rw-------. 1 postgres postgres 136314880 Jul 28 05:42 /postgresql/archive/1721/000000080000002600000006

但是通过下面文件看到数据库并没有更新archvie_status文件,因为归档未完成。

[postgres@pgc pg_wal]$ ls -l $PGDATA/pg_wal/archive_status/000000080000002600000006*
-rw-------. 1 postgres postgres 0 Jul 28 05:42 archive_status/000000080000002600000006.ready

这里看到归档日志文件存在,但是数据库认为没有归档,那就只有一种情况,归档过程是触发了,但是归档还未完成就结束了,所以导致文件存在,但是状态文件未更新。

2.3 判断归档文件是否一致

通过操作系统的md5命令计算归档日志文件和wal文件收一致

[postgres@pgc pg_wal]$ md5sum /postgresql/archive/1721/000000080000002600000006
c16ac4d138a77800e3972343afc4d708 /postgresql/archive/1721/000000080000002600000006
[postgres@pgc pg_wal]$ md5sum 000000080000002600000006
b08d89927693e56987b73eaedaadce31 000000080000002600000006

这里看到归档日志文件跟wal的md5数据不一致,跟上面说的现象一模一样

3,解决方案

删除归档路径中的文件即可:

确定后续归档是否正常,这里看到文件已经完成归档了。

-rw-------. 1 postgres postgres 0 Jul 28 05:42 /postgresql/pgdata/14/15/1721/pg_wal/archive_status/000000080000002600000006.done

这里看到文件修改的时间为当前

  File: /postgresql/pgdata/14/15/1721/pg_wal/archive_status/000000080000002600000006.done
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 422963830 Links: 1
Access: (0600/-rw-------) Uid: ( 601/postgres) Gid: ( 601/postgres)
Context: unconfined_u:object_r:default_t:s0
Access: 2025-07-28 05:42:46.005917972 +0800
Modify: 2025-07-28 05:42:46.005917972 +0800
Change: 2025-07-28 21:13:59.538470918 +0800
Birth: 2025-07-28 05:42:46.005917972 +0800

pg_stat_archiver的状态还没有更新,需要等待一段时间才会更新

postgres_1721@postgres > SELECT * FROM pg_stat_archiver;
archived_count | last_archived_wal | last_archived_time | failed_count | last_failed_wal | last_failed_time | stats_reset
----------------+--------------------------+-------------------------------+--------------+--------------------------+-------------------------------+-------------------------------
46 | 000000080000002C00000003 | 2025-07-28 21:17:39.769599+08 | 2704 | 000000080000002600000006 | 2025-07-28 21:12:59.153555+08 | 2025-07-28 06:15:08.470418+08
(1 row)

手动触发归档操作,确保归档日志生成就可以了。

ls -l $PGARCH/

4,故障原因

为什么会出现归档日志写入一半后就终止了呢?是由于之前数据库在归档过程中,磁盘空间耗尽,数据库异常宕机,所以引发了归档日志写入一半就退出了。当删除历史归档日志后,数据库恢复正常,但是由于归档日志在操作系统上存在,所以引发了后续归档失败。

感觉PG在做归档时并没有校验归档目录空间是否有足够的空间存放当前归档文件,如果有做校验,那么可以在归档前就关闭数据库,此时就不会出现这种情况。当然这个文件要解决也是非常简单的,自己写一个脚本,在复制之前判断文件是否存在,存在就计算md5的值,判断是否一致,一致就退出,不一致就复制。

如下所示:

[postgres@pgc pg_wal]$ pg_archive.sh $PGARCH 000000080000002C00000000 $PGDATA/pg_wal/000000080000002C00000000
WAL file 000000080000002C00000000 already archived with matching MD5. Skipping. [postgres@pgc pg_wal]$ pg_archive.sh $PGDATA 000000080000002C00000000 $PGDATA/pg_wal/000000080000002C00000000
WAL file 000000080000002C00000000 not archived yet. Archiving now.

如果需要获取脚本,请直接叫我微信:18081072613,我拉你入群,群里面有我所有的脚本分享。

5,总结

灵活的归档日志配置给了我们可以操作的空间,但是对我们的技术要求和经验也会更高,所有的技术都需要我们自己来严格把关,不然很可能弄出“花瓶”的环境,看着运行很好,其实有很大的隐患。

------------------作者介绍-----------------------

姓名:黄廷忠

现就职:Oracle中国高级服务团队

曾就职:OceanBase、云和恩墨、东方龙马等

电话、微信、QQ:18081072613

个人博客: (http://www.htz.pw)

CSDN地址: (https://blog.csdn.net/wwwhtzpw)

博客园地址: (https://www.cnblogs.com/www-htz-pw)


PG故障处理:PG归档未做空间计算导致宕机,系统恢复后归档仍然失败的故障案例分析的更多相关文章

  1. 归档日志空间满导致DB启动失败

    现象 登录失败 告警日志: 由此可知,归档日志空间已满 解决方式: 一.增大归档日志空间 1.启动数据库至nomount [oracle@CentOS ~]$ sqlplus / as sysdba ...

  2. openstack高可用集群20-openstack计算节点宕机迁移方案

    openstack计算节点宕机迁移方案   情景一:/var/lib/nova/instances/ 目录不共享的处理方法(类似手动迁移云主机到其他节点)

  3. Centos7.5调试/etc/sysctl.conf文件导致宕机

    今天安装greenplus数据库,需要调试一个核心文件/etc/sysctl.conf文件,结果导致系统异常宕机,出现的问题就是使用任何命令都不能输出正确的结果,只有这个显示: 不知道是什么原因,ls ...

  4. Hadoop 服务SYS CPU过高导致宕机问题

    最近某hadoop集群多次出现机器宕机,现象为瞬间机器的sys cpu增长至100%,机器无法登录.只能硬件重启,ganglia cpu信息如下: 首先怀疑有用户启动了比较奇葩的job,导致不合理的系 ...

  5. ORA-04031错误导致宕机案例分析

    今天遇到一起ORACLE数据库宕机案例,下面是对这起数据库宕机案例的原因进行分析.解读.分析过程中顺便记录一下这个案例的前因后果,攒点经验值,培养一下分析.解决问题的能力. 案例环境:   操作系统 ...

  6. 计算节点宕机了怎么办?- 每天5分钟玩转 OpenStack(43)

    Rebuild 可以恢复损坏的 instance. 那如果是宿主机坏了怎么办呢? 比如硬件故障或者断电造成整台计算节点无法工作,该节点上运行的 instance 如何恢复呢? 用 Shelve 或者 ...

  7. O043、计算节点宕机了怎么办

    参考https://www.cnblogs.com/CloudMan6/p/5562131.html   Rebuild 可以恢复损坏的instance .那如果是宿主机坏了怎么办呢?比如硬件故障或者 ...

  8. VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结

    转帖:http://blog.csdn.net/whygosofar/article/details/2821875 MSDN中对于在不同的配置下Link的LIB作了说明: C Runtime Lib ...

  9. AZURE云上 mkfs.ext4 /dev/sdc 导致宕机问题解决纪实

    )开机启动挂载配置 [root@pldb2 ~]# vim /etc/fstab You have new mail in /var/spool/mail/root [root@pldb2 ~]# m ...

  10. 关于解决Tomcat服务器Connection reset by peer 导致的宕机

    org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer at ...

随机推荐

  1. Alembic迁移脚本:让数据库变身时间旅行者

    title: Alembic迁移脚本:让数据库变身时间旅行者 date: 2025/05/09 13:08:18 updated: 2025/05/09 13:08:18 author: cmdrag ...

  2. springAI实现一个MCP-Server

    mcp Model Context Protocol(MCP)模型上下文协议(如下图所示)是 Anthropic 发布的一种标准化协议,使得 Agent 智能体应用可以更快捷地与下游异构的数据或者工具 ...

  3. MFC单文档应用程序引入GDI+

    在MFC中引入GDI+,步骤如下: 1.在需要用到GDI+的文件中添加GDI+文件 1 #include <gdiplus.h> 2 using namespace Gdiplus; 2. ...

  4. RPC实战与核心原理之业务分组

    业务分组:如何隔离流量 回顾 RPC 中常用的保护手段"熔断限流" 熔断是调用方为了避免在调用过程中,服务提供方出现问题的时候,自身资源被耗尽的一种保护行为: 而限流则是服务提供方 ...

  5. 2025第一届轩辕杯Misc详解

    Terminal Hacker 一步到位 flag{Cysay_terminal_game_hacked_successfully} 哇哇哇瓦 foremost分离 GekkoYoru 随波逐流检测, ...

  6. ComfyUI+通义万相 Wan2.1系列生成视频教程

    一.Wan2.1系列 Wan2.1 系列是阿里巴巴通义实验室推出的开源视频生成模型套件,共有 4 个模型,包括文生视频的 Wan2.1-T2V-1.3B 和 Wan2.1-T2V-14B,以及图生视频 ...

  7. VSCode配置c++环境速通

    工作目录: (需要自己创建的文件) Build 文件夹下储存编译后的二进制文件 in 和 out 为文本文件,作为运行程序的输入和输出 所有 *.cpp 源码文件和 test.cpp 文件一样,放在工 ...

  8. Kali Linux 从入门到实战:系统详解与工具指南

    Kali Linux 从入门到实战:系统详解与工具指南 1. Kali Linux 简介 Kali Linux 是一款基于 Debian 的 Linux 发行版,专为 渗透测试 和 网络安全审计 设计 ...

  9. JVM垃圾回收机制常见算法

       在探讨Java垃圾回收机制之前,我们首先应该记住一个单词:Stop-the-World.Stop-the-world意味着 JVM由于要执行GC而停止了应用程序的执行,并且这种情形会在任何一种G ...

  10. C++项目属性配置Tips

    1.项目属性->VC++目录->包含目录 & 库目录 这里的"包含目录"."库目录"编辑之后是全局的: 2.项目属性->C/C++-& ...