PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

LỖI:không thể truy cập tệp “$ libdir / plpython2” - LỖI:không thể truy cập tệp “$ libdir / plpython3”

Lỗi ở trên được mô tả về gửi thư PG vì nó không thể TẠO NGÔN NGỮ plpython2u / plpython3u trên PG9.3Beta.

Error:
postgres=# create language plpython3u;
ERROR: could not access file "$libdir/plpython3": No such file or directory

postgres=# create language plpython2u;
ERROR: could not access file "$libdir/plpython2": No such file or directory

Trước khi thực hiện một số nghiên cứu về các lỗi trên, tôi đọc liên kết tài liệu PG bên dưới về cách PostgreSQL cho phép tạo plpython langage và cách chúng nên được định cấu hình.

http://www.postgresql.org/docs/9.3/static/plpython-python23.html

Rõ ràng từ liên kết ở trên, bạn cần phải biên dịch nhị phân hai lần nếu bạn cần cả plpython2u &plpython3u. AFAIK, ActivePython 2.7.x cho plpython2u và 3.2.x cho plpython3u có thể được định cấu hình trên PG 9.2.x mà không gặp bất kỳ khó khăn nào, nhưng tôi chưa bao giờ thử sử dụng PG 9.3Beta2. Vì vậy, được cân nhắc để thử và phân tích lỗi tại sao và cách nó có thể được sửa chữa, trước tiên, tôi bắt đầu cài đặt nguồn bằng cách thiết lập đường dẫn cơ sở với ActivePython 3.2. (Liên kết tải xuống ActivePython http://www.activestate.com/activepython/downloads)

[root@localhost postgresql-9.3beta1]# export PATH=/opt/ActivePython-3.2/bin:$PATH
[root@localhost postgresql-9.3beta1]# ./configure --prefix=/usr/local/pg93b --with-python

Biên dịch không thành công và hiển thị lỗi trong tệp Config.log là:

make[3]: Entering directory `/usr/local/src/postgresql-9.3beta1/src/pl/plpython'
*** Cannot build PL/Python because libpython is not a shared library.
*** You might have to rebuild your Python installation. Refer to
make[3]: Leaving directory `/usr/local/src/postgresql-9.3beta1/src/pl/plpython'

Trong tài liệu PG, chúng tôi có hướng dẫn rõ ràng về lỗi trên và lý do tại sao nó xảy ra, plpython sẽ là một thư viện được chia sẻ trên hầu hết các nền tảng, nhưng trên một số nền tảng, chúng tôi cần đặc biệt buộc trình biên dịch là python từ thư viện được chia sẻ. Đối với điều đó, bạn có thể tiếp tục đến / src / pl / python / Makefile để thay đổi hoặc nêu cụ thể “shared_libpython =yes” trong khi biên dịch.

Quá trình biên dịch nguồn sẽ kiểm tra hai tệp khi bạn sử dụng –with-python là “python” &“python-config”. Mặc dù tôi có ActivePython-3.2 trong đường dẫn cơ sở của mình, nhưng trình biên dịch vẫn không tìm thấy chúng “python” &“python-conifg”

[root@localhost postgresql-9.3beta1]# which python
/usr/local/bin/python
[root@localhost postgresql-9.3beta1]# which python-config
/usr/local/bin/python-config

Đó là bởi vì, trong ActivePython 3.2, tên tệp sẽ là, “python” là “python3” và “python-config” là “python3-config” do đó trình biên dịch trỏ đến cái cũ thay vì mới. Tại thời điểm này, Asif Naeem (Cảm ơn bạn đã có cái nhìn sâu sắc) từ Nhà phát triển cốt lõi của chúng tôi. Nhóm đã xác nhận tôi giả mạo các tệp ActivePython-3.2 hiện có dưới dạng python &python-config. Nó gần giống như một cuộc tấn công từ anh ta, vì vậy tôi đã sao chép các tệp đó thành:

cd /opt/ActivePython-3.2/bin
cp python3-config python-config
cp python3 python

Được rồi, bây giờ tôi có thể thấy điều đó trong đường dẫn cơ sở của mình.

[root@localhost postgresql-9.3beta1]# export PATH=/opt/ActivePython-3.2/bin:$PATH
[root@localhost postgresql-9.3beta1]# which python
/opt/ActivePython-3.2/bin/python
[root@localhost postgresql-9.3beta1]# which python-config
/opt/ActivePython-3.2/bin/python-config

Tôi đã biên dịch lại nguồn PG bằng –with-python sau khi thay đổi và cũng buộc trình biên dịch chọn SHARED_LIBPYTHON bằng cách sử dụng “shared_libpython”.

./configure --prefix=/usr/local/pg93b3 --with-python
make shared_libpython=yes
make shared_libpython=yes install

Các bước này sẽ biên dịch hiệu quả PG9.3Beta với các thư viện ActivePython-3.2. Bây giờ, hãy tạo ngôn ngữ plpython3u:

-bash-4.1$ psql -p 4444
psql (9.3beta1)
Type "help" for help.

postgres=# create language plpython3u;
The connection to the server was lost. Attempting reset: Failed.
!>
!>

Rất tiếc, điều này thật kỳ lạ, tại sao nó lại bị lỗi .. Trong tình huống này, $ PGDATA / pg_log là những người bạn của bạn để hiểu rõ hơn về sự cố. Đây là thông tin nhật ký của máy chủ cơ sở dữ liệu về sự cố:

2013-07-13 22:08:37 IST-31208-postgres-postgres :LOG: statement: create language plpython3u;
Could not find platform independent libraries
Could not find platform dependent libraries
Consider setting $PYTHONHOME to [:]
Fatal Python error: Py_Initialize: Unable to get the locale encoding

Được. Tôi đã bỏ lỡ thiết lập đường dẫn python, điều này rất quan trọng khi bạn đang làm việc với ngôn ngữ python hoặc perl trên cơ sở dữ liệu của mình.
Tôi đã đặt PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH trước khi bắt đầu cụm.

export PYTHONHOME=/opt/ActivePython-3.2/
export PYTHONPATH=/opt/ActivePython-3.2/bin:$PATH
export LD_LIBRARY_PATH=/opt/ActivePython-3.2/lib:$LD_LIBRARY_PATH

/usr/local/pg93b3/bin/pg_ctl -D /usr/local/pg93b3/data/ start

-bash-4.1$ psql -p 4444
psql (9.3beta1)

Type "help" for help.

postgres=# create language plpython3u;
CREATE LANGUAGE

Tuyệt vời… Nó đã tạo plpython3u với ActivePython-3.2.

Nếu bạn muốn plpython2u cũng cài đặt tương tự. Không chỉnh sửa như chúng tôi đã làm cho ActivePython-3.2, chỉ cần có một bản sao của ActivePython-2.7 và đặt nó trong đường dẫn cơ sở và biên dịch lại nguồn.

export PATH=/opt/ActivePython-2.7/bin:$PATH
./configure --prefix=/usr/local/pg93b2 --with-python
make shared_libpython=yes
make shared_libpython=yes install


export PYTHONHOME=/opt/ActivePython-2.7/
export PYTHONPATH=/opt/ActivePython-2.7/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/pg93b2/lib
export LD_LIBRARY_PATH=/opt/ActivePython-2.7/lib:$LD_LIBRARY_PATH

-bash-4.1$ ./psql -p 4444
psql (9.3beta2)
Type "help" for help.

postgres=#
postgres=# create language plpython2u;
CREATE LANGUAGE

Nhận xét &Sửa chữa được hoan nghênh nhất.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để bạn làm toán ngày mà bỏ qua năm?

  2. Điểm chuẩn Postgres-XL

  3. Chỉ mục một phần không được sử dụng trong mệnh đề ON CONFLICT khi thực hiện nâng cấp trong Postgresql

  4. Một cách mới để cá nhân hóa việc giám sát PostgreSQL của bạn với Prometheus

  5. CHỌN hoặc CHÈN trong một hàm có khuynh hướng gặp phải các điều kiện về chủng tộc không?