环境
系统平台:银河麒麟 (X86_64)
版本:9.0
症状
此问题在如下版本和安装环境出现:
安装包:
hgdb-ee-9.0.1.000-build2401091440-28098d3-linux.x86_64.bin
OS版本:
银河麒麟服务器版V10sp3
复现步骤:
在业务库中创建plpython3u插件
create extension plpython3u ;
使用plpython3u创建对应函数时:
create or replace function public.convert_gbk_to_utf8(bytes bytea)
returns text
Language plpython3u
as $function$
"""
将GBK字节数组转化为uTF8文本
"""
#-*-coding:utf-8 -*-
def convert_gbk_to_utf8(bytes):
return bytes.decode(encoding='gbk', errors='replace')
return convert_gbk_to_utf8(bytes)
$function$
;
对应会话进程会出现:
服务器意外地关闭了联接
这种现象通常意味着服务器在处理请求之前
或者正在处理请求的时候意外中止
与服务器的连接已断开,正在试图重置: 完成。
hgdb-enterprise-9.0.1
问题原因
检查插件所依赖的库文件,发现该版本为python 3.11:
[highgo@localhost ~]$ ldd /home/highgo/hgdb-enterprise-9.0.1/lib/postgresql/plpython3.so
linux-vdso.so.1 (0x00007fff9f55a000)
libpython3.11.so.1.0 => /home/highgo/hgdb-enterprise-9.0.1/lib/postgresql/../libpython3.11.so.1.0 (0x00001553b7f89000) <--该版本依赖于python 3.11版本
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00001553b7f4d000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00001553b7d95000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00001553b7d90000)
libutil.so.1 => /usr/lib64/libutil.so.1 (0x00001553b7d8b000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00001553b7c08000)
/lib64/ld-linux-x86-64.so.2 (0x00001553b8956000)
检查银河麒麟服务器版V10sp3自带版本为python3.7 :
[root@localhost ~]# find / -name libpython3*
/usr/lib64/libpython3.7m.so.1.0
/usr/lib64/libpython3.so
/usr/lib64/libpython3.7m.so
问题原因为系统自带python环境与插件所需的3.6版本不同。
解决方案
申请对应python版本plpython3u对应插件包并进行替换。 该步骤使用数据库安装用户highgo执行:
1、卸载原有plpython3u插件
drop extension plpython3u ;
2、备份原有lib、share、include目录
cd $HGDB_HOME
tar -czvf old_release.tar.gz lib share include
3、解压释放新插件
tar -xvf new_release.tar.gz -C $HGDB_HOME
4、需要重启数据库(可选,一些情况下可能需要重新读取操作系统lib库文件)
pg_ctl restart
5、重新安装插件
create extension plpython3u
重新创建对应plpython3u函数,问题应当得到解决。