こんにちは、相戸ゆづなです!
ひとり鯖を運用していて思うのが「データベースのバックアップしておかないと怖いな」と日々感じます。
ということで今回は「postgreSQLで作成されたMisskey・Calckeyデータベースをバックアップする方法」を備忘録として残しておきます。
Misskeyは動作未確認ですが、多分行けるはず。(保存ファイル名変更はやる必要あるけど)
また、ブログ執筆者自身もあまりサーバーインフラ周りをよく理解してないので、その辺もご了承ください。
(サーバーインフラ歴:数か月の民)
追記ログ
- 2023/07/25:手動バックアップの項目でいくつか追加・リンクの形式を修正
バックアップ準備(ディレクトリ作成)
バックアップをする前にディレクトリの作成、ついでにパーミッションも変更しておきます。
$ sudo mkdir /var/backup
$ sudo chmod 777 /var/backup
手動で行う場合
アップデートやメンテナンスを行う前に手動で取って置く用。
下記コマンドをTera Tarmなどに入力したら「/var/backup/」ディレクトリ内にできてるはず。
$ sudo -u postgres pg_dumpall | gzip -c > /var/backup/calckey$(date +%Y%m%d%H%M)-backup.gz
2023/07/25 追記
could not change directory to “/root”: Permission deniedが出る
上記の記事を見て、エラーのこと書き忘れたと気づきました。申し訳ない。
今私の環境で試したところ、下記の結果になりました。
- root権限:エラー表記あり
- sudu権限を渡した一般ユーザーA:エラー表記なし
多分「/var/backup」を作ったユーザーに権限があって、そのユーザーでバックアップコマンドを打たないとアクセス権限エラーが出るっぽいですね。
ただ、エラーを吐いててもバックアップ自体はできてるのでヨシ!でもいいと思いますけれども(よくない)
バックアップ時の挙動・バックアップファイル確認について
上記のエラー文を吐いても吐かなくてもバックアップファイルができてることがあります。
(バックアップしたよというコメントが出ないので、できていることに気づかない)
なので、一度FTPソフトで/var/backup/
ディレクトリで確認するか、下記のコマンドを入力してファイルがあるか確認してください。
$ ls -l /var/backup
この時、ファイルの容量も確認しておくと吉。
一件ファイルができてるように見えても、データベースバックアップに作成失敗してて、データ容量がすっかすっかになってることがあります。

こんな感じにね(白目)
解説
sudo -u postgres
ユーザーをpostgresに変更します。
pg_dumpall
データベースをすべてバックアップします。
gzip -c
ファイルをgzip形式で保存します。
gzipは$ sudo apt install gzip
で要インストールなので、注意。
/var/backup/calckey$(date +%Y%m%d%H%M)-backup.gz
ディレクトリとファイル名です。
この形式では/var/backup/
にcalckey202307200123-backup.gz
というファイルができます。
202307200123
は出力した日付になるため、基本的にファイル名が重複しないはず。
cronで自動化する
結論
/etc/cron.d
内にdbackup
ファイルを作成、Vimでdbackup
ファイルを開きます。
$ sudo vi /etc/cron.d/dbackup
ファイルを開いたら、下記の項目を記入して保存します。
SHELL=/bin/sh
MAILTO=""
0 2 * * * postgres pg_dumpall | gzip -c > /var/backup/calckey$(date +\%Y\%m\%d\%H\%M)-backup.gz
Vimについてはこのサイト見ながらやってみてください。(ぶん投げ)
【超初心者向け】Vim(Vi)でなんとかファイル編集する方法 | Y Lab Desk
ファイルを保存したら、パーミッションの変更とcronの再起動を行います。
$ sudo chmod 644 /etc/cron.d/dbackup
$ sudo systemctl restart cron
cron解説
SHELL=/bin/sh
おまじない的に入れてます(完全に理解してない)
多分なくても行けそう。
MAILTO=””
cronを実行した時、logに(CRON) info (No MTA installed, discarding output)
が出てたので、エラーをなくすために入れました。
多分MTAなどを入れてるなら、エラーはでないはず。
0 2 * * *
日時指定。
左から「分/時/日/月/曜日」になっていて、この設定では毎日午前2時(サーバーの時刻)に設定されています。
毎日0時に指定したい場合は0 0 * * *
、毎日17時30なら30 17 * * *
と設定すればOK。
詳しい時刻記入仕様はここを見てください(ぶん投げ2回目)
cronの日時指定を、基礎から学ぶ(分,時,日,月,曜日の指定、◯分ごと、月末起動、など) – YoheiM .NET
余談ですが、ちなみにサーバーが日本のタイムゾーンじゃない場合があります(とくに海外サーバー)
私が使っているのはNYだったので13時間ほどズレているので、NYの時刻で時間設定をする必要があります。
なので一度「date」コマンドを使ってサーバーの時刻を確認しとくといいかもしれません。
calckey$(date +\%Y\%m\%d\%H\%M)-backup.gz
出力のファイル名になります。
コマンド自体は手動コマンドとほぼ同じで、書き方が若干違います。
%の前に\が入ってる=Cronの仕様上、書き方を変える必要があり、ファイル名を変えたい場合は気を付けましょう。
それ以外
基本主導のコマンドと同じなので解説略。
指定した日付より前のバックアップを削除する
上記のcronのままだと毎日延々とバックアップファイルを作ってしまい、ストレージを圧迫してしまいます。
それを防ぐためにも、指定した日付より前(ここでは14日間)のバックアップファイルを削除するcronを作成しておきます。
dbackup
ファイルの最終行に下記の項目追加して、cronを再起動すればOK。
5 2 * * * root find /var/backup -name '*.gz' -mtime +14 -delete
cron解説
5 2 * * *
時刻。負荷軽減のためにバックアップの時間より数分遅く設定してあります。
root
root権限で実行します。
find /var/backup -name ‘*.gz’
/var/backup
内にある「*.gz」ファイルを探します。
-mtime +14 -delete
14日より前に作成したファイルを削除します。