由於 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,胡亂處理是會出事的~
沒有留言:
張貼留言