使用硬链接执行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
相关产品推荐
相关产品推荐

