🦔

Pleasanter のデータベースを pg 15 -> 16 にアップグレードするのでリストア方法を確実にする

2023/12/12に公開

これは2023 個人アドベントカレンダーの 2 日目の記事です。

tl;dr

  • Pleasanter のバックエンド DB を postgresql 16 にする
  • バックアップとリストア手順を確認する

あらかじめバックアップを安全に保管していることをご確認ください。
なお、当方の手元ではデータベースもコンテナ環境で実行しております。

流れ

  1. バックアップ取得
  2. 既存コンテナの削除
  3. コンテナ起動
  4. リストア

の流れでやっていきます。

なお本家のユーザマニュアルのバックアップリストアのページを単に「マニュアル」として引用します。

バックアップ取得

まっさらなコンテナに論理バックアップを移行したいので、マニュアルが言うところの「異なる環境へリストアを行う場合」相当の処置が必要となります。

個人的には通常は平文形式でバックアップしているのですが、マニュアルではカスタム形式とされていたので一旦そのようにしました。

なお、マニュアルでは記載が省略されていますが、多くの環境で少なくとも -U オプションでユーザを指定しないとエラーになるのでご注意ください[1]

pg_dumpall -h 'データベースのホスト' -p 5432 -U postgres --roles-only > role.dmp
pg_dump -h 'データベースのホスト' -p 5432 -U postgres -d "Implem.Pleasanter" -Fc > data.dmp

データベースのオーナーやリード権限の設定によっては postgres ユーザではなく "Implem.Pleasanter_Owner" ユーザとしてダンプする必要があるかもしれないことにご注意ください。

コンテナ削除

  • docker volueme ls をして postgresql サーバの data ディレクトリにマウントしている docker ボリュームを削除しました。
  • docker image ls をして、以前に pull していた postgres:latest を削除しました。
    • Dockerfile などで postgres:16.1 などとバージョンをもつタグを指定してもよいかと思います。

リストア

マニュアルに添ってやってみます。

前提として、コンテナにローカルのディレクトリをバインドして、コンテナ内から dump が見えるようにしました。そのうえで postgresql サーバのあるコンテナ内でリストアをしています。

データベースの作成

docker exec -it 'データベースサーバ' /bin/bash
psql -U postgres -c 'create database "Implem.Pleasanter";'
CREATE DATABASE
psql -U postgres -c 'create extension if not exists pg_trgm;'
CREATE EXTENSION
psql -U postgres
psql (16.1 (Debian 16.1-1.pgdg120+1))
"help"でヘルプを表示します。

Implem.Pleasanter=# \l
                                                                      データベース一覧
       名前        |  所有者  | エンコーディング | ロケールプロバイダー |  照合順序   | Ctype(変換演算子) | ICUロケール | ICUルール: |     アクセス権限
-------------------+----------+------------------+----------------------+-------------+-------------------+-------------+------------+-----------------------
 Implem.Pleasanter | postgres | UTF8             | libc                 | ja_JP.UTF-8 | ja_JP.UTF-8       |             |            |
 postgres          | postgres | UTF8             | libc                 | ja_JP.UTF-8 | ja_JP.UTF-8       |             |            |
 template0         | postgres | UTF8             | libc                 | ja_JP.UTF-8 | ja_JP.UTF-8       |             |            | =c/postgres          +
                   |          |                  |                      |             |                   |             |            | postgres=CTc/postgres
 template1         | postgres | UTF8             | libc                 | ja_JP.UTF-8 | ja_JP.UTF-8       |             |            | =c/postgres          +
                   |          |                  |                      |             |                   |             |            | postgres=CTc/postgres
(4)

postgres=# \dx
                                      インストール済みの拡張一覧
  名前   | バージョン |  スキーマ  |                               説明
---------+------------+------------+-------------------------------------------------------------------
 pg_trgm | 1.6        | public     | text similarity measurement and index searching based on trigrams
 plpgsql | 1.0        | pg_catalog | PL/pgSQL procedural language
(2)

postgres=# \c "Implem.Pleasanter"
データベース"Implem.Pleasanter"にユーザー"postgres"として接続しました。
Implem.Pleasanter=# \dx
                    インストール済みの拡張一覧
  名前   | バージョン |  スキーマ  |             説明
---------+------------+------------+------------------------------
 plpgsql | 1.0        | pg_catalog | PL/pgSQL procedural language
(1)

Implem.Pleasanter=# exit

このとおりマニュアルの方法では "Implem.Pleasanter" データベースに pg_trgm の拡張機能が作られず、全文検索に支障があります。よって、正しくは

psql -U postgres -c 'create database "Implem.Pleasanter";'
psql -U postgres -c 'create extension if not exists pg_trgm;' -d "Implem.Pleasanter";

とする必要があります。

ダンプのリストア

ここでも -U オプションでユーザを指定して実行します。

psql -f role.dmp -U postgres
pg_restore -d "Implem.Pleasanter" data.dmp -U postgres

まとめ

  • これまで環境移行のときは CodeDefiner でデータベースロールを作成してから、データベースを drop して、リストアしていた。
    • 公式に、ロールをダンプして移行してよいとなると、データベース外ではロールのみに依存し、かつ仕様が維持されることが明確になったので非常に助かる。
      • 単に CREATE ROLE をする SQL をコンテナの初期化スクリプトとして作ればいいので、ダンプを戻すだけで良いことになる。
  • その他の tips として SysLogs テーブルはサイズが大きくなりがちで、移行後に積極的に参照する必要がないので、完全なダンプをとったあとにテーブルを TRUNCATE して、ダンプを取り直して移行すると移行にかかる時間が短くなると期待できます。
脚注
  1. データベースサーバのログオンユーザとして postgres ユーザを利用していればマニュアルのままでも通ります。しかし、そのような運用はあまり一般的でないと思います。 ↩︎

GitHubで編集を提案

Discussion