尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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# 如果存在可以删除
RELATED

相关推荐

什么是 JSON 验证工具?

什么是 JSON 验证工具?

什么是 JSON 验证工具? JSON 验证工具用于检查 JSON 数据的语法是否正确。JSON 语法非常严格——多了一个逗号、少了一个引号、括号不匹配都会导致解析失败。在开发中,99% 的 JSON 相关 Bug 都源于格式错误。验证工具能帮你秒级定位这些问题。 逐步操作…

📅 2026/9/1 22:18:54
Selenium IDE使用指南四(代码导出)

Selenium IDE使用指南四(代码导出)

入门 您可以通过右键单击测试或套件,选择Export,选择目标语言,然后单击,将测试或套件的测试导出到WebDriver代码Export。 这会将包含导出的目标语言代码的文件保存到浏览器的下载目录中。 原产地跟踪代码注释 导出时&#xff0…

📅 2026/9/1 22:24:13
如何用uBlock Origin在5分钟内彻底净化你的浏览器体验:终极广告拦截指南

如何用uBlock Origin在5分钟内彻底净化你的浏览器体验:终极广告拦截指南

如何用uBlock Origin在5分钟内彻底净化你的浏览器体验:终极广告拦截指南 【免费下载链接】uBlock uBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean. 项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock 你是否厌倦了网…

📅 2026/10/23 12:14:28
MORE NEWS

更多资讯

📰

AI驱动的行为溯源逆向工具:从用户操作直达原生指令

1. 这不是“反编译工具”,而是一套行为驱动的AI逆向工作流你有没有遇到过这样的场景:某款桌面应用在点击“导出PDF”按钮时,会突然弹出一个奇怪的系统级对话框,要求访问剪贴板;或者某个移动端App在后台运行时&#xff…

📰

2026年顶级球鞋代理服务评测与行业趋势

1. 球鞋代理行业现状与价值解析 2026年的球鞋市场正在经历一场前所未有的变革。随着运动文化在全球范围内的持续升温,限量版球鞋的收藏价值已经超越了其实用功能,成为年轻消费群体身份认同的重要符号。在这个背景下,球鞋代理服务已经从简单的…

📰

Vue电商项目实战:百货购物网站开发全解析

1. 项目概述:基于Vue的百货购物网站设计与实现百货购物网站作为典型的B2C电商平台,其核心功能模块包括商品展示、购物车管理、订单处理、支付对接和用户中心。采用Vue作为前端框架的优势在于其组件化开发模式和响应式数据绑定特性,能够高效构…

📰

SaaS架构下AI服务的流量治理与熔断机制实践

1. SaaS架构下AI服务的流量治理挑战 在SaaS(Software as a Service)模式下提供AI服务时,多租户共享同一套基础设施的特性会带来独特的流量管理难题。我去年负责过一个智能客服SaaS平台的架构升级,当时就遇到过某个企业客户突发流量…

📰

Python数据结构在蓝桥杯竞赛中的高效应用

1. Python数据结构在蓝桥杯中的核心地位蓝桥杯作为国内最具影响力的IT类赛事之一,其Python组竞赛对数据结构掌握程度的要求逐年提高。根据近五年的真题分析,列表(List)、字典(Dict)、集合(Set)和字符串(String)这四种基础数据结构的使用频率合计占比超过…

📰

Kubernetes网络插件选型与生产环境部署实战

1. Kubernetes集群部署方案选型 在生产环境中部署Kubernetes集群时,kubespray作为官方推荐的部署工具之一,相比kubeadm等方案具有显著优势。我最近在一个金融项目中使用kubespray部署了生产级Kubernetes集群,这里分享下网络插件选型的实战经验…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬