postgis在postgres-xl上使用出錯
問題1
外掛 postgis--2.4.5 在 postgres-xl-10alpha2 使用,執行命令"create extension postgis",
在內部執行sql檔案內容的過程中,在執行insert into spatial_ref_sys 操作 報 spatial_ref_sys 檢視不存在。
分析發現檢視spatial_ref_sys 是在sql檔案前面建立的,為什麼後面執行插入資料報不存在呢?
原因分析
create view 只在coordinator上建立,而不在datanode 上建立。
這樣如果建立的函式的相關內容包含檢視則會無法建立。
示例:
create table tx1(id int);
create view v1 as select id from tx1;
CREATE OR REPLACE FUNCTION ADDN(a INT,b INT) RETURNS boolean AS
$$
SELECT COALESCE((select true from v1), false)
$$ LANGUAGE 'sql' STABLE
COST 100;
ERROR: 42P01: relation "v1" does not exist
LOCATION: pgxc_node_report_error, execRemote.c:6413
那應該是這個問題了,問題修改也比較清晰,在coordinator上執行create view時會現在本地執行,然後再根據情況看是不是需要傳送到遠端(datanode)上執行(直接呼叫相應的函式將plantree傳送過去), 那麼這個view 應該沒去執行該去遠端執行的操作。
該問題修改:
1. 應該修改的位置在函式 ProcessUtilityPost 中,將create view對應的程式碼下面的 要去的遠端節點只在coordinator上執行改為在所有節點上執行即可。
2.需要修改drop view/alter view 對應的遠端節點,需要修改函式 ExecUtilityFindNodesRelkind
這個是我發給pgxl bug郵件列表的內容:
根據回覆在最新的postgres-xl版本已經解決了,我的郵箱卻收不到回覆郵件,有點奇怪,只能在歸檔路徑中查看了, 更新了xl程式碼確實已經修改了。
問題2
postgis--2.4.0版本在postgres-xl上執行“create extension postgis” 報:
db1=# create extension postgis;
ERROR: Fail to process utility query on remote node.
DETAIL: ERROR: type "gidx" does not exist
將問題簡化為
CREATE OR REPLACE FUNCTION gidx_in(cstring)
RETURNS gidx
AS '$libdir/postgis-2.4','gidx_in'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION gidx_out(gidx)
RETURNS cstring
AS '$libdir/postgis-2.4','gidx_out'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
CREATE OR REPLACE FUNCTION overlaps_geog(gidx, gidx)
RETURNS boolean
AS '$libdir/postgis-2.4','gserialized_gidx_gidx_overlaps'
LANGUAGE 'c' IMMUTABLE STRICT;
CREATE TYPE gidx (
internallength = variable,
input = gidx_in,
output = gidx_out,
storage = plain,
alignment = double
);
do language plpgsql $$
declare
begin
IF NOT EXISTS(SELECT 1 from pg_operator WHERE oprname = '&&' AND
oprleft::regtype::text LIKE '%gidx') THEN
CREATE OPERATOR && (
LEFTARG = gidx,
RIGHTARG = gidx,
PROCEDURE = overlaps_geog,
COMMUTATOR = &&
);
end if;
end $$;
將上面的內容放在檔案編譯生成的share資料夾相關路徑下
/home/wln/install/install_102/share/postgresql/extension/postgis--2.4.0.sql
這樣仍能夠重現問題(原來的這個檔案有4萬多行)
原因分析
現象:直接psql -f 該檔案沒問題,而通過create extension postgis 在coordinator上呼叫函式CreateExtension去執行execute_sql_string卻出現問題,有點奇怪。
定位分析,外掛執行流程為:
1. 先在本地coordinator上執行create extension 語句(在pg_extension表中插入一行資料)
然後執行該外掛對應的sql檔案即上面的postgis--2.4.0.sql檔案的內容
2. 將create extension 語句下發到遠端(各個datanode上), 每個datanode在本節點執行CreateExtension函式並執行外掛對應的sql檔案即上面的postgis--2.4.0.sql檔案的內容。
現在出現問題的原因:coordinator執行postgis--2.4.0.sql檔案內容時,如create table 語句是不會再下發到各個datanode上的,但是像儲存過程、insert語句仍會下發到datanode上去執行,這樣在coordinator執行上面檔案內容的儲存過程語句時,此時coordinator 上是已經建立了type gidx的,但是此時coordinator上 還沒開始下發create extension語句到datanode,所以此時datanode上是沒有這個型別的,所以datanode 接收儲存過程並去執行是必然報錯的。
根據現有的分散式資料庫postgre-xl 處理外掛邏輯見函式CreateExtension,外掛對應的sql檔案,如果內部使用了儲存過程,則極其容易引起錯誤(涉及物件在coordinator上datanode上執行create extension先後順序),如果使用了insert into 也會出現問題(如果insert的物件在前面建立則該語句下發到datanode上其表物件此時還未建立)。
針對postgis在postgres-xl的問題,可以使用下面方法進行處理:
1. 規避,在外掛對應的sql檔案內容不要使用儲存過程及insert操作, insert 操作可以放在create extension後手動執行。
2. 修復該問題,修改postgres-xl處理外掛的現有邏輯:在coordiantor本地執行時,根據語句情況進行下發操作,這樣在coordinator上和datanode上可以看作同步操作,不存在現在coordinator上執行完sql檔案內容然後datanode再去執行這個sql檔案內容;create extension語句下發到datanode上執行時只執行在pg_extension表插入一行記錄操作,不再去執行sql檔案內容。
已試著修改,同時提交給了postgres-xl 官方, 見