にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

PleromaのサーバーをUbuntu 20.04→22.04に移行する際、データベースのマイグレーションでこける

問題

PleromaのサーバーをUbuntu 20.04からUbuntu 22.04へと移行しようと思ったが、PostgreSQLのデータベースのバックアップからリストアするところで止まってしまって、うまく行かなかった。

環境

  • Pleromaのバージョン: v2.6.0
  • 元サーバ
  • 移行先サーバ

試行1: 公式サイトの手順通りに

Pleromaの公式サイトにバックアップとリストアの手順がかかれている。

最初はこれに従ってやってみた。
データベース名はpleroma_devとする。


まず、移行先の新サーバでPleromaをセットアップを行い、データベースを作成するところまでやった。

sudo -Hu postgres psql -f /opt/pleroma/config/setup_db.psql


旧サーバーでデータベースをバックアップした)。

sudo service pleroma stop
sudo -Hu postgres pg_dump -d pleroma_dev -v --format=custom -f /home/nixeneko/share/pleroma_dev.pgdump


新サーバーにバックアップデータを移動した後、データベースをリストアした。

sudo -Hu postgres pg_restore -d pleroma_dev -v -1 /home/nixeneko/share/pleroma_dev.pgdump

このコマンドは、しばらくは動いていたが、

pg_restore: creating INDEX "public.activities_visibility_index"

と出たまま動かなくなり、1時間たっても変わらなかったので、強制終了することになった。

試行2: SQLプレーンテキストでバックアップ

--format=customではだめなのかもしれないので、--format=plainでバックアップしてリストアを行うことにした。


元サーバーでバックアップする。

sudo -Hu postgres pg_dump -d pleroma_dev -v --format=plain -f /home/nixeneko/share/pleroma_dev.sql


新サーバーでレストアを行う(すでにデータベースを作成していたので消してから再度作成している)。

sudo -Hu postgres psql -c 'DROP DATABASE pleroma_dev;'
sudo -Hu postgres psql -c 'DROP USER pleroma'
sudo -Hu postgres psql -f /opt/pleroma/config/setup_db.psql
sudo -Hu postgres psql -a -d pleroma_dev -f /home/nixeneko/share/pleroma_dev.sql

すると、

CREATE INDEX activities_visibility_index ON public.activities USING btree (public.activity_visibility(actor, recipients, data), id DESC NULLS LAST) WHERE ((data ->> 'type'::text) = 'Create'::text);

とか表示されたまま動かなくなってしまった。そのため今回も強制終了した。

助けてインターネット

ネットを探したら同じところで引っかかっている人がいた。

この記事によると、SQL文の書かれたファイルの中で、実行時に引っかかっているCREATE INDEX activities_visibility_indexと書かれた行だけをコメントアウトして実行する。その後で、コメントアウトした部分のSQL文を個別に実行するとうまく行ったとのことである。

解決策

そのようにやってみる。


旧サーバでバックアップ

sudo service pleroma stop
sudo -Hu postgres pg_dump -d pleroma_dev -v --format=plain -f /home/nixeneko/share/pleroma_dev.sql


新サーバーへバックアップファイルを移動し、編集する。pleroma_dev.sqlnanoで開いて編集しようとしたら、killedされてしまった。6GB近くあるファイルをnanoで編集するのはできないようだ(メモリ1GBだし…)。

仕方ないので、コマンドを使って編集することになる。まず、

cat pleroma_dev.sql  | grep -n activities_visibility_index

で行数を特定。今回は6377738行目だと判明したので、sedを使ってその行のコメントアウトを行う(行頭に--をつける)。

sed -e "6377738s/^/-- /g" pleroma_dev.sql  > pleroma_dev_replaced.sql


次に、置換した結果を使ってデータベースをリストアする。

sudo -Hu postgres psql -c 'DROP DATABASE pleroma_dev;'
sudo -Hu postgres psql -c 'DROP USER pleroma'
sudo -Hu postgres psql -f config/setup_db.psql
sudo -Hu postgres psql -a -d pleroma_dev -f /home/nixeneko/share/pleroma_dev_replaced.sql


その後、コメントアウトした行のSQL文だけ個別に実行する。

sudo -Hu postgres psql -d pleroma_dev -c "CREATE INDEX activities_visibility_index ON public.activities USING btree (public.activity_visibility(actor, recipients, data), id DESC NULLS LAST) WHERE ((data ->> 'type'::text) = 'Create'::text);"


これでデータベースが移行できたようだ。