問題
PleromaのサーバーをUbuntu 20.04からUbuntu 22.04へと移行しようと思ったが、PostgreSQLのデータベースのバックアップからリストアするところで止まってしまって、うまく行かなかった。
環境
- Pleromaのバージョン: v2.6.0
- 元サーバ
- 移行先サーバ
試行1: 公式サイトの手順通りに
Pleromaの公式サイトにバックアップとリストアの手順がかかれている。
最初はこれに従ってやってみた。
まず、移行先の新サーバで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 -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.sql
をnano
で開いて編集しようとしたら、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 -f /home/nixeneko/share/pleroma_dev_replaced.sql
その後、コメントアウトした行のSQL文だけ個別に実行する。
sudo -Hu postgres psql -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);"
これでデータベースが移行できたようだ。