PostgreSQL 因主库表空间错乱_缺少软链接、从库配置问题,导致主从复制故障【修复过程】
修复后目录结构/var/lib/pgsql/15/ ├── data/# PGDATA 主目录│ ├── pg_tblspc/ │ │ └──24610-/var/lib/pgsql/15/pg_tps# 符号链接│ ├── base/# 默认表空间数据│ ├── global/# 系统表│ └──...其他系统目录 ├── pg_tps/# 表空间 mydemotbs 的实际存储位置│ └── PG_15_202209061/ │ ├──16388/# 某个数据库的数据│ └──24847/# db_666 的数据└── archive/# WAL 归档一、前提pg_basebackup-h192.168.x.x-Urep-D/var/lib/pgsql/15/data-Fp-Xs-P-R执行以上命令从主库拉取数据搭建主从复制总是失败。从库日志报错2026-07-0720:00:46 CST[13082]:user,db,app,clientLOG: database system was interrupted;last known up at2026-07-0719:53:31 CST cp: cannotstat‘/var/lib/pgsql/15/archive/00000011.history’: No suchfileor directory2026-07-0720:00:46 CST[13082]:user,db,app,clientFATAL: recovery target timeline17does not exist二、根据日志报错先排查修复主库报错主库日志报错2026-07-0717:38:57 CST[17670]:user,db,app,clientDETAIL: The database subdirectorypg_tblspc/24610/PG_15_202209061/24847is missing.排查过程现象表空间文件 /var/lib/pgsql/15/pg_tps 和 /var/lib/pgsql/15//var/lib/pgsql/15/ 之间缺少软链接且各个表空间文件下都有重复数据后续会导致严重问题。1、停止主库systemctl stop postgresql-152、删除各表空间目录下多余文件和目录只保留数据最全的表空间文件3、根据日志报错进入数据目录创建软链接cd/var/lib/pgsql/15/dataln-s/var/lib/pgsql/15/pg_tps pg_tblspc/24610# 软链接结果$ ll data/pg_tblspc lrwxrwxrwx1postgres postgres24Jul719:3924610-/var/lib/pgsql/15/pg_tps4、重启主库验证systemctl start postgresql-15# 查看日志tail-50/var/lib/pgsql/15/data/log/*.log# 验证 db_666psql-Upostgres-c\cdb_666psql-Upostgres-cSELECT count(*)FROM pg_tables WHERE schemanamepublic三、修复从库1、从库同目录创建表空间文件mkdir-p/var/lib/pgsql/15/pg_tps2、清理从库旧数据rm-rf/var/lib/pgsql/15/data/*rm-rf/var/lib/pgsql/15/archive/*3、从主库拉取数据pg_basebackup-h192.168.x.x-Urep-D/var/lib/pgsql/15/data-Fp-Xs-P-R4、修改postgresql.conf# 设置为空restore_command5、重启从库报错systemctl start postgresql-15.service从库日志报错2026-07-0720:00:46 CST[13082]:user,db,app,clientLOG: database system was interrupted;last known up at2026-07-0719:53:31 CST cp: cannotstat‘/var/lib/pgsql/15/archive/00000011.history’: No suchfileor directory2026-07-0720:00:46 CST[13082]:user,db,app,clientFATAL: recovery target timeline17does not exist6、排查过程1. 查看主库当前的 timeline# 在从库执行# 1. 查看 postgresql.auto.conf 内容[postgrespg05 data]$catpostgresql.auto.conf l# Do not edit this file manually!# It will be overwritten by the ALTER SYSTEM command.checkpoint_completion_target0.9primary_conninfouserrep password123456 channel_bindingprefer host192.168.6.9 port5432 sslmodeprefer sslcompression0 sslsni1 ssl_min_protocol_versionTLSv1.2 gssencmodeprefer krbsrvnamepostgres target_session_attrsany# 2. .conf 里是否有 restore_commandgreprestore_commandpostgresql.confgreprecovery_target_timelinepostgresql.conf# 3. 查看 standby.signal 是否存在[postgrespg05 data]$ls-lastandby.signal -rw-r-----1postgres postgres0Jul719:54 standby.signal# 4. 查看 recovery.signalPG12 如果有的话[postgrespg05 data]$ls-larecovery.signal ls: cannot access recovery.signal: No suchfileor directory# 5. 检查 postgresql.conf 里是否有 restore_command[postgrespg05 data]$greprestore_commandpostgresql.conf restore_command# command to use to restore an archived logfile segment[postgrespg05 data]$greprecovery_target_timelinepostgresql.conf#recovery_target_timeline latest # current, latest, or timeline ID# 1. 查找所有包含 restore_command 的配置文件[postgrespg05 data]$grep-rrestore_command/var/lib/pgsql/15/data/2/dev/null postgresql.conf 中 restore_command 的实际生效值 psql-Upostgres-cSHOW restore_command;2/dev/null||echo无法连接/var/lib/pgsql/15/data/pg_rman_recovery.conf:restore_commandcp /var/lib/pgsql/15/archive/%f %p/var/lib/pgsql/15/data/postgresql.conf-bak20260706:#restore_command # command to use to restore an archived logfile segment/var/lib/pgsql/15/data/postgresql.conf-bak20251025:#restore_command # command to use to restore an archived logfile segment/var/lib/pgsql/15/data/postgresql.conf: restore_command# command to use to restore an archived logfile segment# 2. 检查是否使用了 include 指令引入了外部配置[postgrespg05 data]$grep^includepostgresql.conf includepg_rman_recovery.conf# added by pg_rman 1.3.15# 3. 查看 postgresql.conf 中 restore_command 的实际生效值[postgrespg05 data]$ psql-Upostgres-cSHOW restore_command;2/dev/null||echo无法连接结果无法连接根本原因# postgresql.conf 里有一行includepg_rman_recovery.conf# added by pg_rman 1.3.15# 而这个 pg_rman_recovery.conf 文件里设置了restore_commandcp /var/lib/pgsql/15/archive/%f %p这就是问题所在 虽然你在 postgresql.conf 里设置了 restore_command但 include 指令在后面引用了 pg_rman_recovery.conf覆盖了你前面的设置。# PostgreSQL 的配置加载顺序是postgresql.conf → include 的文件 → postgresql.auto.conf。所以 pg_rman_recovery.conf 里的 restore_command 最终生效了。7、修复步骤cd/var/lib/pgsql/15/data# 备份 postgresql.confcppostgresql.conf postgresql.conf.bak# 注释掉 include 行sed-is/^include/#include/gpostgresql.conf# 或者直接编辑vipostgresql.conf# 找到下面这行在前面加 # 注释掉# include pg_rman_recovery.conf # added by pg_rman 1.3.15# 重命名或删除 pg_rman_recovery.conf可选## 重命名让 PostgreSQL 找不到它mvpg_rman_recovery.conf pg_rman_recovery.conf.disabled# 重置 postgresql.auto.confcatpostgresql.auto.confEOF primary_conninfo userrep password123456 host192.168.6.9 port5432 sslmodeprefer recovery_target_timeline latest EOF# 删除所有 .history 文件cd/var/lib/pgsql/15/datafind.-name*.history-typef-deleterm-fpg_wal/*.history# 清空 archive 目录rm-rf/var/lib/pgsql/15/archive/*# 启动从库systemctl start postgresql-15# 查看日志,验证修复是否成功tail-100/var/lib/pgsql/15/data/log/*.log# 启动成功后应该看到类似这样的日志LOG: database system was shut down at... LOG: entering standby mode LOG: started streaming WAL from primary at... LOG: consistent recovery state reached at...补充关于 pg_rmanpg_rman 是一个 PostgreSQL 备份工具它生成的 pg_rman_recovery.conf 文件通常用于从归档恢复。但在流复制从库场景下不需要这个配置因为从库通过流复制直接从主库接收 WAL。 如果以后要用 pg_rman 做备份恢复记得恢复完成后要把 include 行重新打开。8、验证主从复制1. 检查从库# 查看从库日志tail-50/var/lib/pgsql/15/data/log/*.log# 检查是否处于恢复模式psql-Upostgres-cSELECT pg_is_in_recovery();# 应返回 t# 查看流复制状态psql-Upostgres-cSELECT * FROM pg_stat_wal_receiver;# 在主库查看复制连接psql-Upostgres-cSELECT application_name, state, sync_state, write_lag FROM pg_stat_replication;2. 主库最终确认# 主库健康检查psql-Upostgres-c\l|grepdb_666 psql-Upostgres-cSELECT version();SELECT application_name, client_addr, state, sync_state FROM pg_stat_replication;application_name|client_addr|state|sync_state ------------------------------------------------------- walreceiver|192.168.x.x|streaming|async# 检查磁盘使用情况确保没有不必要的副本du-sh/var/lib/pgsql/15/data/pg_tblspc/24610/du-sh/var/lib/pgsql/15/pg_tps/du-sh/var/lib/pgsql/15/data/pg_tps/2/dev/null# 如果存在可以删除

相关新闻

BUUCTF reserve3

BUUCTF reserve3

考点:base64编码1.进入ida,分析代码,看到flag先经过sub_4110BE处理存入v4,v4在复制到destination,循环处理destination,将destination每个字符的字符值加上其下标再赋值回destination,最后与str2对比是否一…

2026/7/8 2:15:25 阅读更多 →
02类型转换与值类型引用类型(C#上位机方向基础夯实)

02类型转换与值类型引用类型(C#上位机方向基础夯实)

知识点一:值类型 vs 引用类型的赋值差异核心结论:值类型赋值是复制数据,引用类型赋值是复制地址。代码验证:// 值类型:int int a 10; int b a; // 把10拷贝一份给b a 20; Console.WriteLine(b); // 10 —— a的修改…

2026/7/8 2:15:25 阅读更多 →
Gemini 3.1 Pro 国内上手全攻略:从入门到实战,程序员看这一篇就够了`

Gemini 3.1 Pro 国内上手全攻略:从入门到实战,程序员看这一篇就够了`

这两年,大模型工具更新得非常快。很多人刚听说一个新模型,转头就会问一句:“国内到底能不能用?值不值得折腾?” 最近,不少开发者开始关注 Gemini 3.1 Pro。原因很直接:一方面,它在代…

2026/7/8 2:13:24 阅读更多 →

最新新闻

量化派:构建物理AI通用技术底座,开启“卖能力”产业拐点

量化派:构建物理AI通用技术底座,开启“卖能力”产业拐点

量化派探索物理世界生产力,引领物理AI新趋势大语言模型探索了数字世界的生产力,而物理AI正在重新探索物理世界的生产力。量化派不卖机器人本体,也不卖单一解决方案,而是售卖让机器人理解物理世界的通用能力层——物理世界基础模型…

2026/7/8 3:19:46 阅读更多 →
房地产顾问如何突破单一业务模式转型为家族资产配置顾问?

房地产顾问如何突破单一业务模式转型为家族资产配置顾问?

房产中介的传统业务模式高度依赖单套物业的成交。交易一完成,客户关系往往随之结束。当客户手里积累到第二套、第三套房产,开始考虑跨境持有、子女教育与婚姻资产保护时,单一经纪人的知识储备常常触及天花板。客户的问题从"买哪套房子&q…

2026/7/8 3:19:46 阅读更多 →
计网-如何理解冲突域和广播域

计网-如何理解冲突域和广播域

如何理解冲突域和广播域 1. 冲突域 (Collision Domain) 核心定义: 在一个网络中,如果两台设备同时发送数据会导致信号在物理介质上发生碰撞(冲突),那么这些设备就处于同一个冲突域。 通俗理解: 想象一条单车…

2026/7/8 3:17:45 阅读更多 →
不是接口调不通,而是链路没拆清:Dify RAG、向量引擎与 timeout 排查实战

不是接口调不通,而是链路没拆清:Dify RAG、向量引擎与 timeout 排查实战

很多人第一次把 Dify 接进业务系统时,问题通常会被问得很直接:Dify 用什么 API 接口? 如果只是跑通一个简单 Demo,这个问题并不复杂。聊天应用调用聊天消息接口,工作流应用调用工作流运行接口,知识库管理调…

2026/7/8 3:15:45 阅读更多 →
2026无线充赛道洗牌!Qi认证才是品牌合规底气与终端成交利器

2026无线充赛道洗牌!Qi认证才是品牌合规底气与终端成交利器

01 Qi认证,是无线充行业的硬性准入壁垒很多从业者误以为无线充入行门槛低、随便贴牌就能卖,实则不然。WPC无线充电联盟对Qi认证有着极其严苛的审核标准,绝非普通质检证书可比:✅ 品牌资质、工厂品控、生产线合规全方位审核&#x…

2026/7/8 3:11:44 阅读更多 →
三款热门随身WiFi用了三个月:格行、波导、华为,谁的信号先垮、流量先虚?

三款热门随身WiFi用了三个月:格行、波导、华为,谁的信号先垮、流量先虚?

随身WiFi新机到手,测速数据往往都很漂亮,但真正拉开产品差距的,是长期使用后的真实表现。使用一两个月后,信号是否持续稳定、流量是否偷偷虚标提速、机身发热是否加剧、会不会频繁断流,才是决定日常体验的核心关键。本…

2026/7/8 3:09:44 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻