PostgreSQL升级求助:日志重复及Windows下无法写入日志错误
我来分享下针对你遇到的这两个PostgreSQL升级问题的排查思路和可能的解决方向,毕竟从8.4跳到9.5跨度不小,踩坑是难免的😅
关于升级后出现少量日志重复的问题
从PostgreSQL 8.4到9.5,日志系统做了不少迭代优化,少量日志重复大概率和版本间的日志配置差异或升级过程的临时逻辑有关,你可以从这几个方向排查:
- 对比新旧版本的
postgresql.conf中日志相关配置:重点看log_destination、logging_collector、log_directory、log_line_prefix这些参数,比如旧版本可能用了syslog+stderr双输出,新版本默认只保留一种,但升级时没同步修改配置,导致部分日志被重复记录 - 定位重复日志的来源:检查重复的日志内容,看是
pg_upgrade工具本身的输出重复,还是PostgreSQL服务启动后的后台进程(比如archiver、stats collector)日志重复。如果是前者,可能是verbose模式下的正常重复(比如你提供的成功日志里就重复了Running in verbose mode),但如果是服务运行后的日志重复,就要看日志收集器的配置是否冲突 - 查阅9.5.2的Release Notes:里面提到过日志系统的一些变更,比如
logging_collector的行为优化,可能和旧版本的配置不兼容导致重复输出
关于Windows下“无法写入日志”的错误
这个问题在Windows环境下大多和权限、路径格式或文件占用有关,既然现有方案无效,不妨试试这些更底层的排查步骤:
- 检查运行权限:PostgreSQL服务默认用
Network Service账户运行,升级时pg_upgrade工具可能也会继承这个账户的权限。你需要确认:- 新旧数据目录、新版本的bin目录的读写权限是否对
Network Service开放 - 如果手动指定了日志路径,这个路径的权限也要给足(可以右键文件夹→属性→安全→添加
Network Service并赋予读写权限)
- 新旧数据目录、新版本的bin目录的读写权限是否对
- 规避路径空格/特殊字符:如果你的安装路径带空格(比如
C:\Program Files\PostgreSQL),pg_upgrade在解析路径时可能出现转义问题。试试用Windows短路径替代,比如把C:\Program Files换成C:\Progra~1,再重新执行升级命令 - 确保日志文件未被占用:Windows下如果有任何程序(比如记事本、日志分析工具)打开了
pg_upgrade_internal.log或相关临时日志文件,会直接导致写入失败。升级前一定要关闭所有可能占用日志文件的程序 - 手动指定日志路径:不要依赖默认生成的日志路径,升级时用
--logfile参数指定一个你完全可控的路径,比如:
"C:\Program Files\PostgreSQL\9.5\bin\pg_upgrade.exe" ^ --old-datadir="C:\Program Files\PostgreSQL\8.4\data" ^ --new-datadir="C:\Program Files\PostgreSQL\9.5\data" ^ --old-bindir="C:\Program Files\PostgreSQL\8.4\bin" ^ --new-bindir="C:\Program Files\PostgreSQL\9.5\bin" ^ --verbose ^ --logfile="D:\pg_upgrade_logs\upgrade.log"
- 检查系统临时目录:
pg_upgrade会用到Windows的临时目录(%TEMP%),确认这个目录有足够空间,且Network Service账户有读写权限
另外,跨大版本升级前,一定要先备份好旧数据目录,避免操作失误导致数据丢失。如果还是不行,可以尝试关闭Windows的UAC(用户账户控制)后再执行升级,排除权限拦截的可能。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

