*当サイトのリンクにはAmazonアソシエイトやアフィリエイトリンクが含まれております。

Mattermostのデータベースを MYSQL から PostgreSQL に移管する

Mattermost使ってますか?

私が以前勤めており、今で契約という形で保守など諸々お手伝いしている地方企業で活用しており、
そもそも私が導入してしまった責任から保守を行っています。
MattermostがVer11くらいでMYSQLのサポート止めると公式発表していますので移管方法を模索しました。
そんな何度も何度もチャレンジしてようやく移管に辿り着いたフローを公開です。

広告

そんなワケで私の環境。

私の環境

環境は以下の通り
OS:ubuntu22.04
MYSQL:Ver 8.0.39
Mattermost:9.10.1

バージョンが違うとやる事変わる可能性あり。

ちなみに公式のフロー通りにやっても上手く行かなくて、色々参考にしたり、
AIに聞いたりで凄い大変でした。
そもそも PostgreSQL の知識が無さ過ぎてマジで分からなかった。

以下は参考にさせて頂いたサイト様。
Mattermostを『v7.8.0@MySQL』から『v8.1.2@PostgreSQL』に移行
公式:Migration guidelines from MySQL to PostgreSQL

ではフローを紹介。

以下に出てくる
<'mmuser'>と<'mmuser-password'>は置き換えて下さい。

Mattermost停止


# systemctl stop mattermost

PostgreSQLインスト

Ver14も何度も試したのですがどうしても上手く行かなかった。
スキーマの問題っぽいけど解決方法を分からんでした。

なのでpostgresql-15を選択です。


# apt install -y postgresql-common
# /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
# apt update
# apt -y install postgresql-15

SQLにDB作ったり色々


# sudo -u postgres psql
postgres=# CREATE DATABASE mattermost;
postgres=# CREATE USER <mmuser> WITH PASSWORD '<mmuser-password>';
postgres=# GRANT ALL ON DATABASE mattermost TO <mmuser>;
postgres=# ALTER DATABASE mattermost OWNER TO <mmuser>;
postgres=# GRANT USAGE, CREATE ON SCHEMA PUBLIC TO <mmuser>;
postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to <mmuser>;
postgres=# GRANT USAGE, CREATE ON SCHEMA PUBLIC TO <mmuser>;
postgres=# ALTER DATABASE mattermost SET search_path TO public;
postgres=# \q

そんで確認


# psql -h localhost -U <mmuser> -d mattermost

pg_hba.confの変更


//pg_hba.confを探す
# find / -name pg_hba.conf 2> /dev/null

//pg_hba.conf 変更
# nano /etc/postgresql/15/main/pg_hba.conf
local   all             all                                     trust ※peerをtrustに変更
host    all             all             127.0.0.1/32            trust ※scram-sha-256をtrustに変更
host    all             all             ::1/128                 trust ※scram-sha-256をtrustに変更

# systemctl reload postgresql

GOインスト


# sudo snap install go --classic

//パスを通す
# export PATH="$HOME/go/bin:$PATH"

ターゲットデータベースの準備


# go install github.com/mattermost/morph/cmd/morph@v1

# git clone -b release-9.10 https://github.com/mattermost/mattermost-server.git --depth=1
# morph apply up --driver postgres --dsn "postgres://<mmuser>:<mmuser-password>@localhost:5432/mattermost?sslmode=disable" --path ./mattermost-server/server/channels/db/migrations/postgres --number -1

migration-assistのインスト


# go install github.com/mattermost/migration-assist/cmd/migration-assist@latest

pgloaderインストール

pgloaderはソースから入れないとエラーしました。
MySQLバージョンが8じゃ無ければ、aptでも行けるのかも??


# git clone https://github.com/dimitri/pgloader.git
# apt-get install sbcl unzip libsqlite3-dev make curl gawk freetds-dev libzip-dev
# cd pgloader
# make pgloader
# cd ~

MySQL8だと以下の設定変更も必要


# nano /etc/mysql/mysql.conf.d/mysqld.cnf

//以下を追加
default-authentication-plugin=mysql_native_password


# mysql -u root -p -h localhost mattermost
mysql> ALTER USER '<mmuser>'@'localhost' IDENTIFIED WITH mysql_native_password BY '<mmuser-password>';
mysql> \q

# systemctl restart mysql

migration-assistで準備


# migration-assist mysql "<mmuser>:<mmuser-password>@tcp(localhost:3306)/mattermost"
2024-08-08 06:30:52 pinging mysql...
2024-08-08 06:30:52 connected to mysql successfully...
2024-08-08 06:30:52 running checks for artifacts...
2024-08-08 06:30:52 4 checks been made, all good for artifacts
2024-08-08 06:30:52 running checks for unicode...
2024-08-08 06:30:53 11 checks been made, all good for unicode
2024-08-08 06:30:53 running checks for varchar...
2024-08-08 06:30:53 8 checks been made, all good for varchar
2024-08-08 06:30:53 running checks for varchar-extended...
2024-08-08 06:30:53 a fix is required for: linkmetadata.url
2024-08-08 06:30:53 12 checks been made, 1 fix(es) is required for varchar-extended

私はこんな感じで一番下に何か出たので再度オプション入れて実行


# migration-assist mysql "<mmuser>:<mmuser-password>@tcp(localhost:3306)/mattermost" --fix-varchar
2024-08-08 06:33:28 pinging mysql...
2024-08-08 06:33:28 connected to mysql successfully...
2024-08-08 06:33:28 running checks for artifacts...
2024-08-08 06:33:28 4 checks been made, all good for artifacts
2024-08-08 06:33:28 running checks for unicode...
2024-08-08 06:33:28 11 checks been made, all good for unicode
2024-08-08 06:33:28 running checks for varchar...
2024-08-08 06:33:28 8 checks been made, all good for varchar
2024-08-08 06:33:28 running checks for varchar-extended...
2024-08-08 06:33:28 a fix is required for: linkmetadata.url
2024-08-08 06:33:28 the fix query has been executed successfully.
2024-08-08 06:33:28 12 checks been made, all good for varchar-extended


# migration-assist pgloader --mysql="<mmuser>:<mmuser-password>@tcp(localhost:3306)/mattermost" --postgres="postgres://<mmuser>:<mmuser-password>@localhost:5432/mattermost" > migration.load
2024-08-10 14:39:22 pinging postgres...
2024-08-10 14:39:22 connected to postgres successfully.

これでpgloader用のファイルが出来るみたい。

移管作業


# ./pgloader/build/bin/pgloader migration.load > migration.log

心配な人はmigration.logを見る。
見るとそれはそれで心配になるけど。

データ比較

参考サイト様のスクリプトを丸っとコピーさせて頂きました。
マジ感謝。


# nano check_record_counts.sh


#!/bin/bash

# MySQLの接続情報
MYSQL_USER="<mmuser>"
MYSQL_PASSWORD="<mmuser-password>"
MYSQL_DATABASE="mattermost"

# PostgreSQLの接続情報
PG_USER="<mmuser>"
PG_PASSWORD="<mmuser-password>"
PG_DATABASE="mattermost"

# 差分をチェックするテーブルのリスト
TABLES=("Status" "Audits" "Sessions" "Jobs" "Threads" "FileInfo")

for table in "${TABLES[@]}"; do
    # PostgreSQLのテーブル名は小文字
    pg_table=$(echo $table | tr '[:upper:]' '[:lower:]')
    
    # MySQLとPostgreSQLのそれぞれのテーブルのレコード数を取得
    mysql_count=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -D$MYSQL_DATABASE -Bse "SELECT COUNT(*) FROM $table;")
    pg_count=$(PGPASSWORD=$PG_PASSWORD psql -U $PG_USER -d $PG_DATABASE -t -c "SELECT COUNT(*) FROM public.$pg_table;")

    # 差分を表示
    if [ "$mysql_count" -ne "$pg_count" ]; then
        echo "Table $table: MySQL has $mysql_count records, PostgreSQL has $pg_count records."
    else
        echo "Table $table: Record counts match ($mysql_count)."
    fi
done


# chmod 755 check_record_counts.sh
# ./check_record_counts.sh 2>/dev/null
Table Status: Record counts match (54).
Table Audits: Record counts match (20033).
Table Sessions: Record counts match (65).
Table Jobs: Record counts match (152026).
Table Threads: Record counts match (810).
Table FileInfo: Record counts match (6280).

マッチしてます。

boardsの移管


# migration-assist pgloader boards --mysql="<mmuser>:<mmuser-password>@tcp(localhost:3306)/mattermost" --postgres="postgres://<mmuser>:<mmuser-password>@localhost:5432/mattermost" > boards.load
2024-08-10 15:21:57 pinging postgres...
2024-08-10 15:21:57 connected to postgres successfully.

以下でpgloader実行


# ./pgloader/build/bin/pgloader boards.load > boards.log

config.json変更

mattermostの設定ファイルをPostgreSQLに向けます。


# nano /opt/mattermost/config/config.json


//以下の部分を変える
"DriverName": "postgres",
"DataSource": "postgres://<mmuser>:<mmuser-password>@localhost:5432/mattermost?sslmode=disable",

起動確認


# systemctl start mattermost
# systemctl status mattermost
● mattermost.service - Mattermost
     Loaded: loaded (/lib/systemd/system/mattermost.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-08-10 15:14:19 JST; 17min ago
   Main PID: 8724 (mattermost)
      Tasks: 52 (limit: 2309)
     Memory: 265.8M
        CPU: 15.500s
     CGroup: /system.slice/mattermost.service
             ├─8724 /opt/mattermost/bin/mattermost
             ├─8740 plugins/com.mattermost.plugin-channel-export/server/dist/plugin-linux-amd64
             ├─8747 plugins/com.mattermost.apps/server/dist/plugin-linux-amd64
             ├─8754 plugins/com.mattermost.calls/server/dist/plugin-linux-amd64
             ├─8765 plugins/focalboard/server/dist/plugin-linux-amd64
             └─8789 plugins/com.mattermost.nps/server/dist/plugin-linux-amd64

サービス変更

MySQLが紐付いてるので変えます。


# systemctl stop mattermost

# nano /lib/systemd/system/mattermost.service

[Unit]
Description=Mattermost
After=network.target
After=postgresql.service
BindsTo=postgresql.service
[Service]
Type=notify
ExecStart=/opt/mattermost/bin/mattermost
TimeoutStartSec=3600
KillMode=mixed
Restart=always
RestartSec=10
WorkingDirectory=/opt/mattermost
User=mattermost
Group=mattermost
LimitNOFILE=49152
[Install]
WantedBy=postgresql.service

# systemctl daemon-reload
# systemctl enable mattermost
# systemctl start mattermost

MYSQL削除


# apt-get remove --purge mysql-server* mysql-common
# rm -r /etc/mysql
# rm -r /var/lib/mysql

# reboot

ここまでで移管作業完了です。
playbooksは私の環境では使っていませんでしたので、そこは無しです。
以下はオマケ的な作業。

migration-assist と morph の削除


rm -r /root/go/pkg/mod/github.com/mattermost
rm -r /root/go/bin/migration-assist
rm -r /root/go/bin/morph

PostgreSQL のバックアップとリストア

仕事で使っているので万が一クラッシュして私が怒られるの嫌なので毎日定期バックアップをS3に送っています。
その際リストア出来ないとお話にならないのでやってみました。

バックアップ


pg_dump -Fc -h YOUR_HOST -U YOUR_USER -d YOUR_DBNAME > backup.dump

リストア


pg_restore --clean -h YOUR_HOST -p YOUR_PORT -U YOUR_USER -d YOUR_DBNAME backup.dump

これを実行してちゃんとリストア出来たのを確認しました。
これで安心。

まとめ

ワタクシ、とある地方企業のサーバー管理やWEBサイト管理&開発全般を専属契約で月25万、ボーナス無しで請け負っている底辺フリーエンジニアですので、
役に立ったら寄付とか、お仕事くれると凄く嬉しいです。

寄付して欲しいなギフトカード

私営業出来ませんので・・・

ではでは


おすすめのコンテンツ

広告

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください