[pgpool-general-jp: 1284] Re: pgpool-IIについて質問です。

Yugo Nagata nagata @ sraoss.co.jp
2014年 6月 13日 (金) 13:47:38 JST


長田です。

(宛先に、pgpool-general-jp が含まれていなかったので再送します。)

On Fri, 6 Jun 2014 23:08:51 +0900
切磋琢麿 <sessat7 @ gmail.com> wrote:

> 長田様
> 
> 井上です。回答くださりありがとうございます。
> 
> > 特に geometry 型だとダメだという制限はありません。
> > 実際に使った *.sql ファイルと、実際に行った操作、および出力されたエラーメッセージを提示いただければ、
> > 解析させていただくことが可能です。
> 
> やったことを、SQLの内容を示しながら書きたいと思います。すべて、pgpool-IIのインストールされた、親のサーバでの設定です。子サーバはPostGIS導入済みで、テンプレートもあります。
> 
> 1.まず、template_postgisという、PostGIS対応のテンプレートから、Postgresqlを起動させ、posygresになって、
> $createdb -T template_postgis -U postgres -O postgres pgpool
> として、postgis対応のpgpoolデータベースを作りました。
> 
> 2.次に、system_db.sqlと、dblink.sqlをpgpoolに、あぷらいします。
> $psql -f /usr/local/pgpool/share/pgpool-II/system_db.sql pgpool
> これを行うと、エラーとスキーマとテーブルができたというメッセージが出ます。もう一度同じ操作をします。なぜかというと、エラーが出なくなるからです。(当たり前かもしれませんが・・・)

どのようなエラーが出ますか?
もしかしたら、何か関係あるかもしれません。

> $psql -f /usr/local/pgpool/share/pgpool-II/system_db.sql pgpool
> $psql -c 'CREATE EXTENSION dblink' pgpool
> $psgl -f /home/ni_define.sql pgpool
> という風にします。
> 
> ni_define.sql
> 
> INSERT INTO pgpool_catalog.dist_def VALUES (
>  'test02',
>  'public',
>  'sample',
>  'id',
>  ARRAY['point', 'id', 'stone_name', 'country_code', 'handsign',
> 'stone_type_code', 'get_time', 'lon', 'lat'],
>  ARRAY['geometry', 'integer', 'character varying(160)', 'integer',
> 'character varying(100)', 'character varying(4)', 'timestamp without time
> zone', 'double precision', 'double precision'],
>  'pgpool_catalog.dist_rule'
> );
> CREATE OR REPLACE FUNCTION pgpool_catalog.dist_rule (val INTEGER)
> RETURNS INTEGER AS
> $$ SELECT $1 % 2 $$
> LANGUAGE SQL;
> 
> と、しました。
> 
> 3.そして、pgpoolを起動します。
> 
> $pgpool -n &
> $createdb -p 9999 sample
> $psql -p 9999 sample
> sample=#\i /home/ni_table.sql
> 
> ni_table.sql
> CREATE TABLE sample(
>  point PUBLIC.GEOMETRY(Point,4326),
>  id INTEGER,
>  stone_name CHARACTER VARYING(160),
>  country_code INTEGER,
>  hand_sign CHARACTER VARYING(100),
>  stone_type_code CHARACTER VARYING(4),
>  get_time TIMESTAMP WITHOUT TIME ZONE NOT NULL,
>  lon DOUBLE PRECISION,
>  lat DOUBLE PRECISION,
> );
> 
> この段階で、
> 
> psql:/home/ni_table.sql:16:ERROR:type "geometry" does not exist
> 
> LINE 2:  point GEOMETRY(Point,4326),
> 
>               ^
> というエラーになります。

コマンドラインを見る限り、psql で sample データベースに接続しているようですが、
sample データベースに GEOMETRY 型は存在していますか?

上に

> $createdb -T template_postgis -U postgres -O postgres pgpool
> として、postgis対応のpgpoolデータベースを作りました。

とありましたが、PosgGIS テンプレートを元に作られているのは pgpool データベースだけで、
もしかしたら、sample データベースには PostGIS の型は存在していないのではないでしょうか。

ご確認ください。

> 
> ちなみに、1.と2.を入れ替えても同じ結果でした。
> さらに、CREATE TABLEにある、POINT.GEOMETRYをGEOMETRYだけにしても同じエラーになりました。
> 
> 本来ならこの、テーブルができれば、
> 
> ni_insert.sql
> INSERT INTO sample (id,stone_name, country_code, handsign, stone_type_code,
> get_time, lon, lat)
> VALUES('412419141','ZHELINGYU02088','412','0','30','2013-10-27
> 20:42:33','121.825306667','28.111486667');
> INSERT INTO sample (id,stone_name, country_code, handsign, stone_type_code,
> get_time, lon, lat)
> VALUES('412419182','ZHELINGYU69155','412','0','30','2013-10-27
> 20:39:44','121.8008','28.21099');
> 〜省略〜
> 
> ni_update_geom.sql
> UPDATE sample
> SET point=ST_GeomFromText('point(' || lon || ' ' || lat || ')',4326);
> 
> として、pointのGEOMETRYを、入れるつもりでした。
> 
> 
> 
> 
> > >
> 次に、INSERTするデータに、空白(つまりカラムが空)の場合、パラレルクエリでは、INSERTできなかったのですが、空白がないデータしか対応していないのでしょうか。
> >
> > 具体的にはどのようなSQLクエリでしょうか。
> >
> 
> iti_insert.sql
> INSERT INTO sample (id,stone_name, country_code, handsign, stone_type_code,
> get_time, lon, lat)
> VALUES('412419141','ZHELINGYU02088','412','','30','2013-10-27
> 20:42:33','121.825306667','28.111486667');
> INSERT INTO sample (id,stone_name, country_code, handsign, stone_type_code,
> get_time, lon, lat)
> VALUES('412419182','ZHELINGYU69155','412','','30','2013-10-27
> 20:39:44','121.8008','28.21099');
> 〜省略〜
> 
> のように、,'',という部分がある場合です。

'' は単純に「空の文字列」であり、これによって INSERT ができなくなるということはありません。
具体的に「INSERT できない」とはどのような現象でしょうか。もしエラーメッセージが
でるのであれば、その内容を教えてください。

> 
> 最後に、また質問で申し訳ないのですが、
> 
> ni_CSV.csv
> 412419322,ZHELINGYU56030,412,,30,2013-10-27
> 20:35:08,122.097573333,28.266843333
> 412419391,ZHELINGYU02020,412,,30,2013-10-27
> 20:04:03,121.989426667,28.283713333
> 412419420,XING GUANG 6,412,AOWDU,70,2013-10-27
> 20:44:21,121.751631667,29.97596
> 412419450,ZHOU HAI JING 9,412,,30,2013-10-27
> 20:43:13,122.040743333,30.169996667
> 412419490,NING BO HAI LI 803,412,,,2013-10-27
> 20:43:22,121.71257,29.021236667
> 
>> 
> ni_stones.sql
> COPY sample (id, stone_name, country_code, handsign, stone_type_code,
> get_time, lon, lat) FROM '/home/ni_CSV.csv' DELIMITERS ',' CSV HEADER;
> 
> のような、SQLで入れようとしたのですができませんでした。
> COPYが使えないのかと、思っていました。実際は可能なのでしょうか。私はこれをしようとして、エラーになりました。残念ながら、エラーログは残っていません。

COPY 文自体には問題がないように見えます。どのようなエラーがでるでしょうか。

なお、パラレルモードではファイルからの COPY には対応していません。
(分割されず、すべてのバックエンドに値が挿入されます。)
COPY FROM STDIN と COPY TO STDOUT のみ対応しています。 
http://www.pgpool.net/docs/latest/pgpool-ja.html#ng_copy


> 
> よろしくお願いいたします。
> 
> 井上
> 
> (アーカイブに載ってなかったので、再送です。)
> 
> 
> 2014年5月30日 18:25 Yugo Nagata <nagata @ sraoss.co.jp>:
> 
> > 長田です。
> >
> >
> > On Mon, 26 May 2014 19:16:33 +0900
> > Inoue Takuma <sessat7 @ gmail.com> wrote:
> >
> > > よろしくお願いいたします。井上です。この内容を見て少しでもわかる方おられましたら、ご教授願います。
> > >
> > > pgpool-IIのパラレルクエリが、geometry型を含むデータベースに、対応しているのか。ということです。
> > > system_db.sql
> > > dblink.sql
> > > user.sql(これは自分で作る。)
> > >
> > を、PostGISテンプレートから作った、データベースに適用して、usr.sqlの中に定義したデータベースを、pgpool経由で、データベースを作り、接続します。そして、geometry項目を含む、テーブルを、user.sqlに定義したように作ろうとすると、geometry型が存在しない。dist_defテーブルに、geometry型はない。というエラーになり、テーブルが作れません。
> > >
> > パラレルクエリのシステムデータベースに、PostGISの、テンプレート作成時の手順で設定してもダメでした。やはり対応していないのでしょうか。またこの場合、UPDATEが必要なのですが、それも対応しているのかよろしくお願いいたします。
> >
> > 特に geometry 型だとダメだという制限はありません。
> > 実際に使った *.sql ファイルと、実際に行った操作、および出力されたエラーメッセージを提示いただければ、
> > 解析させていただくことが可能です。
> >
> > >
> > >
> > >
> > 次に、INSERTするデータに、空白(つまりカラムが空)の場合、パラレルクエリでは、INSERTできなかったのですが、空白がないデータしか対応していないのでしょうか。
> >
> > 具体的にはどのようなSQLクエリでしょうか。
> >
> > >
> > > それと、ANYELEMENTのところですが、CHARACTER VARINGを使って、最初の質問の、
> > >
> > > $$ SELECT $1 % 2 $$
> >
> > character varing 型に % 演算子はないのでできません。
> >
> > >
> > > というのはできるのでしょうか。
> > >
> > >
> > > 最後に、
> > >
> > > CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_rule (val CHARACTER
> > VARING(8))RETURN INTEGER AS'
> > > SELECT CASE WHEN $1=pgpool THEN 0
> > > WHEN $1=Postgres THEN 1
> > > ELSE 2
> > > END'LANGUAGE SQL;
> > >
> > > というのは、ありでしょうか。これも3分割できると思うのです。よろしくお願いいたします。
> >
> > あり、です。ただし文字列の比較なので
> >
> >  SELECT CASE WHEN $1='pgpool' THEN 0
> >  WHEN $1='Postgres' THEN 1
> >
> > と、シングルクォーテーション '' でくくってあげる必要があります。
> >
> > >
> > >
> > >
> > > 環境は、postgresql9.3.4 pgpool-II1.3です。
> > > なぜこの組み合わせかというと、リリースされたすべてのバージョンを試した中で、私が安定しているように感じたからです。
> > >
> > > 質問しようかどうしようかかなり迷ったのですが、一人で考えていてもどうしようもないように思えたので、長文になりましたが、このメールを書きました。
> > >
> > > よろしくお願いいたします。
> > >
> > > 井上
> > >
> > >
> > >
> >
> > --
> > Yugo Nagata <nagata @ sraoss.co.jp>
> >


-- 
Yugo Nagata <nagata @ sraoss.co.jp>


pgpool-general-jp メーリングリストの案内