2017/10/21

[Mastodon]バックアップとデータを飛ばした後のリストア方法


はじめに

Mastodon も v2.0.0 が出てますます勢いづいてきたと思われる今日この頃、みなさんいかにお過ごしでしょうか。

さて、私も v1.6.1 から v2.0.0 にバージョンアップしようとしたら失敗してしまいました。原因は不明なのですが、500エラーが返って来るようになり、ソースコードのバージョンも上がりませんでした。

そこでバックアップから v1.6.1 へ切り戻し(リストア)をしたのですが、なかなか苦労したのでその方法を載せておきます。

その前に。

バージョンアップの前には必ずバックアップを取りましょう!

お兄さんとの約束だよ?

なお、環境は さくらVPS の CentOS7 で Non-Docker です。さくらVPS にはスナップショット機能がないので大変です。その分、安くて性能のいいサーバーを借りることができるのですけどね。

バージョンアップ前のバックアップ

バージョンアップ前には必ず PostgreSQL のデータベースのバックアップを取りましょう。

バックアップの方法が分からない?でも、意外と方法は簡単なのです。

例えば、mastodon ユーザーでログインして ~/backup ディレクトリにバックアップを取るには以下のようにします。デフォルト設定しているなら、データベースユーザー名もデータベース名もこれでバックアップできると思います。

$ su - mastodon
$ mkdir dbbackup
$ cd dbbackup
$ pg_dump --username=postgres --no-owner mastodon_production > prefix.`date +%Y%m%d_%H%M%S`.pgdump

で、このバックアップでなにを行っているというと、データベースの定義とデータをスクリプト形式でファイルに書き出してバックアップしています。なので、リストアの際、データベースにテーブルなどが残っているとうまく動作しません。

 

バージョンアップに失敗してしまった。さてどうする?

バージョンアップに失敗すると、普通のユーザーでは原因を究明して解決するのは至難の業です。

Mastodon はかなり巨大なシステムでもありますしね。

ここは一度、古いバージョンに戻して様子を見て再度チャレンジするようにしましょう。

ここで焦って、db:migrate なんてすると私みたいにデータを飛ばすことになるのでご注意ください。

 

データベースのリストアの方法

データベースをリストアするには、古いバージョンのMastodonのデータベース定義に戻す必要がありますが、メジャーバージョンアップともなるとデータベースの定義も更新されてしまいますね。

まあ、リストアするにはデータベースを削除してバックアップスクリプトからデータベースを復元するので問題はありません。

では、データベースを削除してみましょう。データベースユーザーはデフォルトの postgres ユーザーとします。

では、postgres ユーザーに切り替えて Mastodon のデータベースを削除してみましょう。

$ su - postgres
$ pdsql

これで、以下のように入力待ちになれば PostgreSQL にログインできています。

postgres=#

さて、では drop database でデータベースを削除してみましょう。デフォルトでは mastodon_production が Mastodon のデフォルトデータベース名です。

postgres=# drop database mastodon_production;
ERROR:  database "mastodon_production" is being accessed by other users
DETAIL:  There are 18 other sessions using the database.

おや?ユーザーに接続されていると言ってデータベースを削除することができません。この時の削除方法を探すのに苦労しましたが、以下のコマンドを実行すればコネクションを切断することができます。

SELECT pg_terminate_backend(pid)
 FROM pg_stat_activity
WHERE datname = 'mastodon_production'
 AND pid <> pg_backend_pid();

PostgreSQL のバージョンが 9.2 以前だと以下のようにコマンドを実行しないといけないようなので参考までに。

SELECT pg_terminate_backend(procpid)
 FROM pg_stat_activity
WHERE datname = 'mastodon_production'
  AND procpid <> pg_backend_pid();

コネクションの接続を切断することができたら、速攻でデータベースをもう一度削除してみましょう。今度はうまくいくはずです。時間をあけると再接続されるためご注意ください。

さて、データベースを削除したら今度はデータベースを再作成します。

postgres=# create database mastodon_production;

これでデータベースをリストアする準備が完了しました。

では実際にデータベースをバックアップからリストアしてみましょう。バックアップファイル名は日時になっているので適宜読み替えてください。

$ su - mastodon
$ cd ~/dbbackup
$ psql mastodon_production < prefix.20171021_140045.pgdump

リストアはコマンド一行で完了します。簡単ですね。

 

Mastodon の切り戻し

Mastodon のデータベースをリストアしたのでデータベース定義が v1.6..1 に戻っているので、Mastodon のモジュール類も v1.6.1 に戻してあげる必要があります。

これは以下のようにコマンドを打つことでできます。

$ cd ~/live
$ git checkout v1.6.1
$ bundle install
$ yarn install
$ RAILS_ENV=production bundle exec rails assets:precompile
$ sudo systemctl restart mastodon-*

これでバージョンを v1.6.1 に切り戻すことができたので、実際にサーバーにアクセスして確認してみてください。

 

おわりに

Mastodon を維持運営していく上でバージョンアップ時のバックアップ・リストアの方法は必須の内容なのですが、なぜかまとまった情報がないのと実際に自分で試行錯誤してうまくいったので記事にしてみました。

この記事がみなさんのお役に立てば幸いです。


スポンサーリンク


このエントリーをはてなブックマークに追加




Twitter ではブログにはない、いろんな情報を発信しています。


コメント

コメントを書く



プロフィール

  • 名前:fnya
    経歴:
    SE としての経験は15年以上。様々な言語と環境で業務系システム開発を行い、セキュリティ対策などもしていました。現在は趣味SE。

    Twitter では、ブログでは取り上げない情報も公開しています。


    ブログについて

    このブログは、IT、スマートフォン、タブレット、システム開発などに関するさまざまな話題を取り上げたり、雑感などをつづっています。


    >>ブログ詳細
    >>自作ツール
    >>運営サイト
    >>Windows 10 まとめ

    Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから