You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用硬链接执行pg_upgrade后存双表空间目录的PG15升级疑问

PostgreSQL 升级疑问:从PG12升级至PG15时表空间文件的处理

背景

此前使用--link硬链接选项将PostgreSQL 11升级到PostgreSQL 12,数据库表空间位于/ssd目录下。因数据库体量庞大,采用硬链接避免存储空间翻倍,但升级后未移除旧集群。

数月后计划升级至PostgreSQL 15时,发现/ssd目录下的PG_11_201809051与PG_12_201909212两个目录仍被使用,部分文件修改日期较新,且两个目录的文件互有缺失。

核心问题

升级至PG15时,是否会自动从两个旧目录中获取内容并整合到/ssd下的新PG_15目录?若不能,需采取哪些措施确保升级成功并移除旧集群?

相关配置及目录信息

表空间配置

temp_tablespaces = 'ssd'

表空间创建语句

CREATE TABLESPACE ssd OWNER postgres LOCATION '/ssd';

目录结构

$ ls -lh /data/pg12/pg_tblspc/
total 0
lrwxrwxrwx. 1 postgres postgres 4 Jun 16  2023 16412 -> /ssd
$ ls -lh /ssd/
total 0
drwx------. 2 postgres postgres  6 Mar  6  2021 lost+found
drwx------. 4 postgres postgres 36 May 26  2023 PG_11_201809051
drwx------. 4 postgres postgres 36 Jun 17  2023 PG_12_201909212
$ tree -d /ssd  
/ssd
 ├── lost+found
 ├── PG_11_201809051
 │   ├── 16420
 │   └── pgsql_tmp
 └── PG_12_201909212
     ├── 16414
     └── pgsql_tmp

解答

1. 升级至PG15不会自动整合两个旧目录内容

pg_upgrade仅依赖当前运行的PG12集群的元数据和文件系统完成升级,不会主动识别或整合PG11遗留的表空间目录。PG12的元数据只指向自身版本的表空间文件(PG_12_201909212),对PG11的目录完全无感知。而两个目录文件互有缺失的情况说明,PG12运行期间已有数据文件被修改、新增或删除,PG11目录的内容已不是有效数据,无法被升级工具利用。

2. 确保升级成功并移除旧集群的操作步骤

步骤1:清理并验证PG12表空间状态

  • 对PG12集群执行全量清理,确保数据文件处于最新状态:
    psql -d your_database -c "VACUUM FULL; ANALYZE;"
    
  • 检查PG12中所有使用ssd表空间的对象,确认存储位置:
    -- 检查表
    SELECT tablename, relfilenode FROM pg_tables WHERE tablespace = 'ssd';
    -- 检查索引
    SELECT indexname, relfilenode FROM pg_indexes JOIN pg_class ON indexname = relname WHERE reltablespace = (SELECT oid FROM pg_tablespace WHERE spcname = 'ssd');
    
  • 验证PG11目录下16420子目录对应的对象是否有效:
    SELECT relname, relkind FROM pg_class WHERE relfilenode = 16420;
    
    如果查询无结果,说明该目录是残留文件,可安全删除。

步骤2:备份PG12集群

升级前必须做全量物理备份,避免数据丢失:

pg_basebackup -D /path/to/backup -U postgres -Ft -z -P

步骤3:执行PG15升级

  • 若继续使用--link选项节省空间,需确保PG12表空间文件无其他进程占用,且PG11残留目录已清理完毕。
  • 执行升级命令(替换路径为实际安装路径):
    pg_upgrade \
      -b /usr/pgsql-12/bin \
      -B /usr/pgsql-15/bin \
      -d /data/pg12 \
      -D /data/pg15 \
      -o "-c config_file=/data/pg12/postgresql.conf" \
      -O "-c config_file=/data/pg15/postgresql.conf" \
      --link
    
  • 升级完成后,检查/ssd下新增的PG_15_xxxxxxxxx目录(版本后缀以实际为准),确认数据文件已正确链接。

步骤4:验证PG15集群可用性

  • 启动PG15集群,校验数据完整性:
    systemctl start postgresql-15
    psql -d your_database -c "SELECT count(*) FROM your_core_table;"
    
  • 确认表空间配置生效:
    SHOW temp_tablespaces;
    SELECT spcname, spclocation FROM pg_tablespace WHERE spcname = 'ssd';
    

步骤5:移除旧集群及残留目录

  • 确认PG15运行正常后,停止PG12集群并删除相关文件:
    systemctl stop postgresql-12
    rm -rf /data/pg12
    rm -rf /ssd/PG_11_201809051 /ssd/PG_12_201909212
    

内容的提问来源于stack exchange,提问作者Keith2709

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:24:55