Windows10下PostgreSQL11执行plpython3u函数触发服务崩溃报错
故障现象
- 运行环境:Windows 10 操作系统、PostgreSQL 11 数据库、Python 3.7(版本匹配PostgreSQL 11官方文档对plpython3u的版本要求)
- 前置操作:已执行
CREATE EXTENSION plpython3u;完成扩展创建,已配置相关环境变量 - 故障表现:执行任意指定
LANGUAGE plpython3u的查询时,数据库服务直接崩溃;客户端弹出连接丢失提示,内容为「应用已丢失数据库连接,可能原因包括:空闲连接被强制断开、应用服务器或数据库服务器被重启、用户会话超时,询问是否继续并建立新会话」 - 测试用函数创建语句:
CREATE OR REPLACE FUNCTION func( file_name character varying) RETURNS text AS $BODY$ return "aa" $BODY$ LANGUAGE plpython3u VOLATILE COST 100;
- 日志核心报错信息:
Fatal Python error: initfsencoding: unable to load the file system codec ModuleNotFoundError: No module named 'encodings' 服务进程(PID 3592)因0xC0000409异常被终止
故障根因
报错No module named 'encodings'是Python解释器启动阶段无法加载标准库文件导致的。Windows环境下PostgreSQL默认以系统服务身份运行,默认不会读取当前登录用户的用户级环境变量,plpython3u扩展加载时调用的Python 3.7运行时拿不到正确的安装路径,找不到标准库下的encodings模块触发致命初始化错误,最终导致Postgres服务进程异常终止,抛出0xC0000409异常。
修复步骤
- 先确认本地Python 3.7的实际安装路径,默认路径一般为
C:\Python37,打开该路径确认存在Lib\encodings目录,且目录内文件完整无缺失。如果安装Python时选择了「仅为当前用户安装」,建议先重装Python,选择「为所有用户安装」,避免后续权限问题。 - 打开Windows系统环境变量配置面板(此电脑右键-属性-高级系统设置-环境变量-系统变量),新增/修改以下系统级配置:
- 新增系统变量,变量名填
PYTHONHOME,变量值填Python 3.7的安装根目录(比如C:\Python37) - 编辑系统变量
Path,新增两个条目:C:\Python37、C:\Python37\DLLs
- 新增系统变量,变量名填
- 按下
Win+R输入services.msc打开服务管理器,找到postgresql-x64-11服务,右键选择重启,等待服务完全启动。 - 重新连接数据库,执行之前的函数创建语句,再调用
select func('test');做验证,正常返回aa即为修复完成。
注意:如果配置完环境变量重启服务后仍然报相同错误,右键Python 3.7安装根目录,打开「属性-安全」选项卡,给
LOCAL SERVICE、NETWORK SERVICE两个系统账户添加读取、读取和执行、列出文件夹内容的权限,避免服务账户权限不足无法访问Python标准库文件。
内容的提问来源于stack exchange,提问作者эдик ерошов
相关产品推荐
相关产品推荐

