親愛なるジョンからの手紙

雑記です。ゲームとか漫画とかプログラミングとか。

KnowledgeのDBをH2DBからPostgreSQLへ移行した際のメモとかやったこととか

概要

弊社はナレッジベースにKnowledgeを利用しております。

Knowledge https://information-knowledge.support-project.org/ja/

そのKnowledgeのDBを組み込みDBからPostgreSQLに移行しました。 その際にハマった点がいくつかあったので、備忘録の意味も込めて書いたものの転載がこちらになります。

環境

CentOS 6(VirtualBox)

なんで6系なんだろうね。まあいいか。プライベートだし。

一発移行できなかった原因

  • Knowledge側が想定するPostgreSQLのバージョンが9.3以降だったが、実環境のバージョンが8系だった。(今の最新バージョンだと9.6以上くらいになってるはず。なんにしろKnowledge公式はpostgresqlの動作確認済バージョンをreadmeに書くべきな気がする)
  • PostgreSQLの認証方式がidentだったため、id - password認証が通っていなかった。

修正手順

バックアップ

何はともあれバックアップ。 VirtualBox経由でマシンを立ち上げていると、スナップショット一発でバックアップが取れるので、スナップショットだけ取って終了。 https://pc-karuma.net/virtualbox-snapshot/

ログ確認

まずはログの確認。 Knowledgeはすべてのログを$TOMCAT_ROOT/logs/catalina.outに吐き出すので、lessとかtail -fとかで適当に見て原因を確定させます。

ログを読む限り、一部のSQLが構文ミスだよ、となっていたので、PostgreSQLのバージョン違いと確信。 githubのissueから探して同様の症状が出ているものもあったので、とりあえずPostgreSQLのバージョンアップを試してみる。

既存のDBのバックアップ

PostgreSQLのdump_allを利用してバックアップ。 バックアップファイルは適当なところに置いておきます。 レストア時にsudoで動かすと怒られたので、postgresにsuしてからやった方がいいかも。

コマンドは以下の感じで。

pg_dumpall -o -f /path/to/temp/dump.sql

PostgreSQLのアップグレード

CentOS6系でPostgreSQL9系をダウンロードするためには、yumの標準リポジトリでは取れないので、既にインストールしてある8系のPostgreSQLyum removeしてから作業開始。

手順はほぼ下記URLのまま。 標準リポジトリからpostgresqlの利用を禁じて、PostgreSQLの対象バージョンのrpmを追加し、あとはlist grepしつつ必要なライブラリを落とすだけ。 今回はPostgreSQL-Serverだけ落としています。 https://weblabo.oscasierra.net/postgresql-installing-postgresql9-centos6-1/

なお、今回使用したrpmはPostgreSQL9.3 以下のCentOS6 x86_64です。 https://yum.postgresql.org/repopackages.php#pg93

また、この方法で行うとService名にバージョン数値がついたり、データ周りの情報が/var/pgsql/9.3/data以下となったりで、ググって出てきたコマンドをコピペ駆動できなくなったりします。注意。

PostgreSQLのアクセス制御

yumから落としたばかりのPostgreSQLはアクセス制御がident方式になっているので、ログイン中のユーザーが一致しないと入れません。 作業するにもアプリからアクセスするにも面倒なので、md5認証にしてしまいます。

https://www.dbonline.jp/postgresql/ini/index2.html

hba.confファイルを弄ったら、次はpostgres.confでlisten対象を変更。 ひとまずワイルドカードで対応しました。別に公開してないからね、ええやろ。多分localhostでもいけるんやないか。知らんけど。

変更が終わったらservice postgresql-9.3 restartで認証を認識させます。

DBのレストア

以下コマンドで行えます。 このときsudoすると怒られるので、postgresql用のユーザーで行うと吉。

psql -f dump.sql

あとはKnowledgeで利用するユーザーでログインして、認証が通ったか、Knowledgeで利用するDBが作成されているか、そのユーザーにDBを触る権利があるかなどをpg_shadow等で確認しつつ準備完了です。

KnowledgeのPostgreSQL移行

Knowledgeに管理者ユーザーでログインし、システム設定→データベースの接続先変更から、各設定値を入力。接続先変更が有効になったら、組み込みDBで~DBにコピーを行って完了です。

max connectionはひとまずJDBCのデフォルト値である100に設定。これにて完了。