MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2018年2月7日 星期三

PostgreSQL 底下的 PL/Python 使用注意事項之一

以下是先前確認 PL/Python 功能時,發現的地雷。在此紀錄一下~


由於 PL/Python 在 PostgreSQL 裡面是 Un-trusted Procedure Language,它會
PostgreSQL 在一個 Session 啟動之時,會預設工作目錄在 $PGDATA 中,並從位置出發,存取各個「相對路徑」的表格資料。

像是 Python 或是 R 這類的 Script 語言,都有提供變更工作目錄的功能。然而,當 Python 或是 R 被 PostgreSQL 程序所呼叫,也就是作為 Procedural Language 的後端時,這樣的功能就會影響到 Postgres 的運作 ...

下面是一個簡單的 PL/Python,裡面切換了工作目錄
create or replace function chdir_py_test()
returns text as
$$
import os
os.chdir('/tmp');
return os.getcwd();
$$ language plpython3u;

下面狀況,發生了當前登入的 Session 內無法查資料的狀況 ...
[enterprisedb@epas96 ~]$ psql
psql.bin (9.6.5.10)
Type "help" for help.

edb=# select chdir_py_test();
 chdir_py_test 
---------------
 /tmp
(1 row)

edb=# select * from emp;
ERROR:  could not open file "base/15185/16391": No such file or directory
edb=# \q

以下的情況嚴重一點:發生了 Session Crash 的狀況;不過 PostgreSQL 資料庫本身沒事~
[enterprisedb@epas96 ~]$ psql
psql.bin (9.6.5.10)
Type "help" for help.

edb=# select * from emp;
 empno | ename  |    job    | mgr  |      hiredate      |   sal   |  comm   | deptno 
-------+--------+-----------+------+--------------------+---------+---------+--------
  7369 | SMITH  | CLERK     | 7902 | 17-DEC-80 00:00:00 |  800.00 |         |     20
  7499 | ALLEN  | SALESMAN  | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30
  7521 | WARD   | SALESMAN  | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30
  7566 | JONES  | MANAGER   | 7839 | 02-APR-81 00:00:00 | 2975.00 |         |     20
  7654 | MARTIN | SALESMAN  | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30
  7698 | BLAKE  | MANAGER   | 7839 | 01-MAY-81 00:00:00 | 2850.00 |         |     30
  7782 | CLARK  | MANAGER   | 7839 | 09-JUN-81 00:00:00 | 2450.00 |         |     10
  7788 | SCOTT  | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |         |     20
  7839 | KING   | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |         |     10
  7844 | TURNER | SALESMAN  | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30
  7876 | ADAMS  | CLERK     | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20
  7900 | JAMES  | CLERK     | 7698 | 03-DEC-81 00:00:00 |  950.00 |         |     30
  7902 | FORD   | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |         |     20
  7934 | MILLER | CLERK     | 7782 | 23-JAN-82 00:00:00 | 1300.00 |         |     10
(14 rows)

edb=# drop function chdir_py_test();
PANIC:  could not create file "pg_xlog/xlogtemp.1484": 沒有此一檔案或目錄
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
!> \q
[enterprisedb@epas96 ~]$

若是在 Greenplum 4.x 裡面的話,會比較不保險;不過在後續引進的 PL/Container 功能,把 PL/Python 運作的 Python 程序與資料,比較保障了安全。

結論:請勿在 PL/PythonU 裡面呼叫 os.chdir() 函數,手冊中已經說明,PL/PythonU 是 Untrust Procedural Language,胡亂處理是會出事的~

沒有留言:

張貼留言