1. 程式人生 > >postgis在postgres-xl上使用出錯

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 官方, 見