Ludiaを使ったPostgreSQL環境下でpg_dumpによるdumpファイルをrestoreする際のメモ

pg_dumpで作成されたdumpファイルを別のマシンへrestoreした際にハマったので、メモしておく。

使ってたLudiaのバージョンが、0.8.0とまぁ相当古いこともあって、この情報はあんまり役立たないかも。

Ludiaを使ったIndexは、restoreした際には、なくなってしまうので、再度CREATE INDEXしてあげる必要がある。

が、しかし、再生成すると以下のエラーが発生してしまう。

sample=# CREATE INDEX ludia_idx_m_person ON m_person USING fulltext(name);
ERROR:  cache lookup failed for function 70186

ってことで、Ludiaセットアップ後に実行するpgsenna2.sqlを再実行することにした。

$ psql -f ./pgsenna2.sql sample
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
psql:./pgsenna2.sql:91: ERROR:  duplicate key violates unique constraint "pg_am_name_index"
psql:./pgsenna2.sql:93: ERROR:  duplicate key violates unique constraint "pg_am_name_index"
psql:./pgsenna2.sql:102: ERROR:  operator @@ already exists
psql:./pgsenna2.sql:107: ERROR:  operator class "text_ops" for access method "fulltext" already exists
psql:./pgsenna2.sql:112: ERROR:  operator class "text_ops" for access method "fulltextb" already exists

ってことで、以下のSQLを実行した。(pgsenna2.sqlのエラーが出た行のSQL文を参考に実行した)

BEGIN;
-- 一度削除する
DELETE FROM pg_am WHERE amname IN ('fulltext', 'fulltextb');
-- もう一度作成する
INSERT INTO pg_am VALUES('fulltext','1','1','1','f','f','t','t','f','pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getmulti','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','pgs2build','pgs2bulkdelete','-','pgs2costestimate');
INSERT INTO pg_am VALUES('fulltextb','1','1','1','f','f','t','t','f','pgs2insert','pgs2beginscan','pgs2gettuple','pgs2getmulti','pgs2rescan','pgs2endscan','pgs2markpos','pgs2restrpos','pgs2buildb','pgs2bulkdelete','-','pgs2costestimate');
COMMIT;

次にCREATE OPERATOR CLASSを実行する。(これもpgsenna2.sqlに記述された内容をそのまま)

CREATE OPERATOR CLASS text_ops
    DEFAULT FOR TYPE text USING fulltext AS
        OPERATOR        1       @@ ,
        FUNCTION        1       pgs2nop (text);

CREATE OPERATOR CLASS text_ops
    DEFAULT FOR TYPE text USING fulltextb AS
        OPERATOR        1       @@ ,
        FUNCTION        1       pgs2nop (text);

もう一度、CREATE INDEXを実行する。

sample=# CREATE INDEX ludia_idx_m_person ON m_person USING fulltext(name);
CREATE INDEX

以上で無事に検索できるようになった。

sample=# select name from m_person where name @@ '*E10,9*D+ 宮崎';
            name            
----------------------------
 宮崎香蓮
 宮崎恭一
 宮崎瑶希
 宮崎ますみ
 宮崎将
 宮崎修平
 宮崎あおい
 宮崎淑子
(以下、略)