【问题标题】:Postgres database crash when installing plpython安装plpython时Postgres数据库崩溃
【发布时间】:2012-08-17 17:26:33
【问题描述】:

我正在尝试在我的 Postgres 9.1 中安装 plpython,但它使服务器崩溃:

postgres@dataserver1:~> /opt/postgres/9.1/bin/psql -d mydb
psql.bin (9.1.4)
Type "help" for help.

mydb=# create language 'plpythonu';
The connection to the server was lost. Attempting reset: Failed.

我已经安装了 python 2.6.8 并且处理程序在系统中声明是正确的:

select tmplname, tmplhandler, tmpllibrary from pg_pltemplate where tmplname like 'plpython%'

"plpythonu"  | "plpython_call_handler"  | "$libdir/plpython2"
"plpython2u" | "plpython2_call_handler" | "$libdir/plpython2"

并且处理程序安装在$libdir中:

postgres@dataserver1:~> ll /opt/postgres/9.1/lib/postgresql/plpython*
-rwxr-xr-x 1 root root 6686333 Aug 17 14:27 /opt/postgres/9.1/lib/postgresql/plpython2.so

任何关于这方面的线索都会被欣赏

编辑

我尝试创建扩展 plpythonu、plpython2u 和 plpython3u,但它们都使服务器崩溃。

阅读了一些文档,我发现了 \dx 命令来列出已安装的扩展:

mydb=# \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

所以我猜唯一安装的扩展是 plpgsql。

mydb=# select name, installed_version from pg_available_extensions where name like '%python%';
    name    | installed_version
------------+-------------------
 plpython2u |
 plpython3u |
 plpythonu  |
(3 rows)

和我的扩展目录:

postgres@dataserver1:/opt/postgres/9.1/share/postgresql/extension> ll *python*
-rw-r--r-- 1 root root 351 Aug 20 17:32 plpython2u--1.0.sql
-rw-r--r-- 1 root root 196 Aug 20 17:32 plpython2u.control
-rw-r--r-- 1 root root 402 Aug 20 17:32 plpython2u--unpackaged--1.0.sql
-rw-r--r-- 1 root root 351 Jun  1 02:54 plpython3u--1.0.sql
-rw-r--r-- 1 root root 196 Jun  1 02:54 plpython3u.control
-rw-r--r-- 1 root root 402 Jun  1 02:54 plpython3u--unpackaged--1.0.sql
-rw-r--r-- 1 root root 347 Aug 20 17:32 plpythonu--1.0.sql
-rw-r--r-- 1 root root 194 Aug 20 17:32 plpythonu.control
-rw-r--r-- 1 root root 393 Aug 20 17:32 plpythonu--unpackaged--1.0.sql

编辑

我在 Linux SuSE 上运行,但明白你的意思。

在我的 postgres 安装中,pl-lang 库位于 .../postgres/9.1/lib/postgres。里面有plpython2.so和plpython3.so

检查这些文件的动态链接库:

alfonso@dataserver1:/opt/postgres/9.1/lib/postgresql> sudo ldd plpython2.so
        linux-vdso.so.1 =>  (0x00007fff5e945000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f64064df000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f64062da000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f64060d7000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f6405e5e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f6405ae9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6406b2e000)

没有引用任何python库,plpython3.so也没有

但是我已经安装了 python 2.6 和 python 3.2。请注意,我希望安装 python 2 的扩展。

是的,CREATE EXTENSION 仍然崩溃:

mydb=# create extension plpython2u;
The connection to the server was lost. Attempting reset: Failed.
!> \q

【问题讨论】:

    标签: postgresql-9.1 plpython


    【解决方案1】:

    注意:从 PostgreSQL 9.1 开始,大多数过程语言已被制成“扩展”,因此应使用 CREATE EXTENSION 而不是 CREATE LANGUAGE 安装。直接使用 CREATE LANGUAGE 现在应该仅限于扩展安装脚本。如果您的数据库中有“裸”语言,可能是升级的结果,您可以使用 CREATE EXTENSION langname FROM unpackaged 将其转换为扩展。

    在特定数据库中安装 PL/Python:

    从 shell 命令行使用 createlang plpythonu dbname

    注意

    createlang 已弃用,可能会在未来的 PostgreSQL 版本中删除。建议直接使用 CREATE EXTENSION 命令。

    http://www.postgresql.org/docs/9.1/static/plpython.html

    编辑

    一步一步

    下载 postgresql-9.1.5-1-windows.exe 并安装。

    首先让我们看看已经有什么。

    mydb=# SELECT * FROM pg_available_extensions
    mydb-# WHERE name LIKE '%python%' ORDER BY name;
        name    | default_version | installed_version |                  comment
    
    ------------+-----------------+-------------------+-------------------------------------------
     plpython2u | 1.0             |                   | PL/Python2U untrusted procedural language
     plpython3u | 1.0             |                   | PL/Python3U untrusted procedural language
     plpythonu  | 1.0             |                   | PL/PythonU untrusted procedural language
    (3 Zeilen)
    

    没有安装!!

    查看lib文件夹,只有一个。

    ....\PostgreSQL\9.1\lib\plpython3.dll.

    所以我必须尝试安装plpython3u。

    mydb=# CREATE EXTENSION plpython3u;
    ERROR:  unknown error »$libdir/plpython3.dll«
    

    plpython3.dll肯定有问题。

    查看 plpython3.dll 有对 python32.dll 的引用。

    ......
    
    Export Table:
      Name:                          plpython3.dll
      Time Date Stamp:               0x502B366A (15.08.2012 06:40:58)
      Version:                       0.00
      Ordinal Base:                  1
      Number of Functions:           9
      Number of Names:               9
    
      Ordinal   Entry Point   Name
            1   0x00001005    Pg_magic_func
            2   0x00001019    PyInit_plpy
            3   0x0000101E    _PG_init
            4   0x00001023    pg_finfo_plpython3_call_handler
            5   0x0000100F    pg_finfo_plpython3_inline_handler
            6   0x0000100A    pg_finfo_plpython3_validator
            7   0x00001028    plpython3_call_handler
            8   0x00001014    plpython3_inline_handler
            9   0x0000102D    plpython3_validator
    
    Import Table:
      libintl-8.dll
        Import Adress Table:                0x00016628
        Import Name Table:                  0x0001617C
        Time Date Stamp:                    0x00000000
        Index of first forwarder reference: 0x00000000
    
        0x000169E4        28   libintl_dngettext
        0x000169D0        27   libintl_dgettext
    
      **python32.dll**
        Import Adress Table:                0x0001686C
        Import Name Table:                  0x000163C0
        Time Date Stamp:                    0x00000000
        Index of first forwarder reference: 0x00000000
      ....
    
    • 我下载并安装了 python-3.2.3.msi。我只找到 python3.dll
    • 将 python3.dll 复制到 ....\PostgreSQL\9.1\lib 并将其重命名为 python32.dll

    返回我输入的 SQL Shell

    mydb=# CREATE EXTENSION plpython3u FROM unpackaged;
    

    我收到了消息

    CREATE EXTENSION
    

    寻找结果:

    mydb=# SELECT * FROM pg_available_extensions
    mydb-# WHERE name LIKE '%python%' ORDER BY name;
    

    这就是plpython3u

    的installed_version 1.0

    我也可以在 PgAdmin III 中看到它

    希望有帮助!

    编辑:

    手动试试

    第一步

    mydb=# 创建程序语言 plpython2u;

    第 2 步

    mydb=# COMMENT ON PROCEDURAL LANGUAGE plpython2u IS 'PL/Python2U untrusted procedural language';

    第 3 步

    mydb=# CREATE EXTENSION plpython2u FROM unpackaged;

    使用 Python 2.6.5 测试

    【讨论】:

    • 谢谢!更新了问题。
    • 感谢@moskito-x 的所有支持。创建扩展给我这个错误:“语言“plpython2u”不存在”这条消息是我可以从哪里寻找的见解,因为似乎没有其他人遇到这个问题。
    • 是的。那是最初的问题: mydb=# CREATE PROCEDURAL LANGUAGE plpython2u;与服务器的连接已丢失。尝试重置:失败。 !> \q
    • 没有。找不到 python 可执行文件的任何路径。也许这就是问题
    【解决方案2】:

    在 WIN 8.1 64 位上安装了带有 Python 2.7 的 Postgres 9.0。 仅供参考:这是我设法解决的方法 错误:无法加载库“C:/Program Files/PostgreSQL/9.0/lib/plpython.dll” 跑步时 创建语言plpythonu;在 pgAdmin 中

    • 从 EnterpriseDB 安装 Postgresql 9.0 后,路径 C:\Program Files\PostgreSQL\9.0\lib 应包含文件“plppython.dll”
    • 用依赖walker之类的程序检查这个文件发现它缺少一个python26.dll
    • 如果您查看 C:\windows\system32 目录,您应该会找到一个文件 python27.dll
    • 创建 python27.dll 的副本 -> python26.dll
    • 确保 C:\windows\system32 在 PATH 变量中
    • 运行创建语言plpythonu;我是 pgAdmin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      相关资源
      最近更新 更多