PostgreSQL升级时出现段错误:是否与内存相关?如何解决?
PostGIS+PostgreSQL升级段错误(libc.so.6)解决步骤
1. 排查PostGIS兼容性与依赖问题
- 确认PG14的PostGIS是针对该版本编译的官方包:执行
dpkg -l | grep postgis查看包信息,避免使用Ubuntu默认仓库中与PG版本不匹配的PostGIS包。若来源不符,卸载现有PG14的PostGIS后重新安装:apt purge postgresql-14-postgis-3 && apt install postgresql-14-postgis-3。 - 检查两个版本PostGIS的完整性:
- 连接PG10执行:
psql -U postgres -d your_db -c "SELECT postgis_full_version();",确认是3.2.3的完整版本。 - 连接PG14执行相同命令,确认PostGIS 3.4.0正常加载。
- 连接PG10执行:
- 清理冲突依赖:如果手动安装过GDAL/GEOS库,执行
apt purge libgdal* libgeos*后重新安装PG14对应的依赖包,避免版本不兼容导致的底层调用错误。
2. 绕过pg_upgrade全表分析阶段的段错误
段错误出现在"Analyzing all rows"阶段,多为PostGIS空间类型统计时的内存异常,可通过以下方式规避:
- 升级前在PG10数据库中调整PostGIS扩展的统计逻辑:
ALTER EXTENSION postgis SET SCHEMA pg_catalog; ANALYZE pg_catalog.geometry; ALTER EXTENSION postgis SET SCHEMA public; - 执行pg_upgrade时拆分分析阶段,避免一次性处理所有空间数据:
pg_upgrade --old-datadir=/var/lib/postgresql/10/main --new-datadir=/var/lib/postgresql/14/main \ --old-bindir=/usr/lib/postgresql/10/bin --new-bindir=/usr/lib/postgresql/14/bin \ --old-options="-c autovacuum=off" --new-options="-c autovacuum=off" \ --analyze-in-stages
3. 优化内存配置(适配32G服务器)
不合理的内存分配可能触发libc段错误,临时调整两个集群的postgresql.conf:
shared_buffers = 8GB work_mem = 64MB maintenance_work_mem = 2GB autovacuum = off
修改后重启两个集群:systemctl restart postgresql@10-main postgresql@14-main
4. 核心转储定位深层问题(可选)
若以上步骤无效,生成核心转储定位段错误具体位置:
- 临时放开核心转储限制:
ulimit -c unlimited - 重新执行pg_upgrade,失败后找到当前目录或
/var/lib/postgresql/下的core文件 - 用gdb分析调用栈:
gdb /usr/lib/postgresql/14/bin/postgres core,执行bt查看段错误触发的函数链,重点关注PostGIS相关调用。
5. 备选方案:逻辑升级(pg_dump/pg_restore)
如果pg_upgrade始终无法绕过错误,改用逻辑升级,稳定性更高:
- 导出PG10空间数据库:
pg_dump -U postgres -d your_spatial_db -F d -f /tmp/pg10_dump_dir --no-owner --no-privileges - 在PG14中创建空数据库并初始化PostGIS:
CREATE DATABASE your_spatial_db; \c your_spatial_db CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology; -- 按需启用 - 导入数据并更新统计:
导入完成后执行pg_restore -U postgres -d your_spatial_db /tmp/pg10_dump_dir --no-owner --no-privilegesANALYZE;更新数据库统计信息。
内容的提问来源于stack exchange,提问作者NonReformed Bayesianist
相关产品推荐
相关产品推荐

