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系のPostgreSQLを yum 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に設定。これにて完了。