Djangoのデータベースのバックアップをスケジュール化する

お疲れ様です。前回はDjangoのライブラリを使って簡単にDBのバックアップを取る方法を説明しました。

しかし、これを毎回手作業で行うのも面倒ですので、このタスクをスケジュール化する方法を紹介していきたいと思います。

今日の環境

  • 前回の記事で説明したdjango-dbbackupのライブラリがインストールされている状態
  • Ubuntu22.04(OSはあまり関係ないです)
  • Python3

ライブラリのインストール

では、下記のコマンドでdjango-crontabをインストールしていきます。LinuxかMacを使ったことがある人はなじみがあるかもしれません。タスクスケジューラーのDjango版です。

詳しい説明はこちらを見てください。

pip install django-crontab

#必要に応じてpip freeze > requirements.txt

次に、Djangoのプロジェクトファイルのsettings.pyのアプリの場所にこのライブラリを登録します。

INSTALLED_APPS = (
    'django_crontab',
    ...
)

cron.pyファイルの作成

では、タスクをスケジュール化するためのPythonファイルを作成します。

ファイル名をcron.pyでプロジェクトフォルダに作成しましょう。

cron_job.pyに仮のファンクションを入れておきます。

def backup_scheduled_job():
  pass

では、settings.pyに戻りこのスケジュールのタスクのファンクションを教えてあげます。

CRONJOBS = [
    ('*/5 * * * *', 'myapp.cron.my_scheduled_job')
]

#例2 ファンクションをインポート
#*****のところでスケジュールの時間を指定(今は五分ごとに設定)

CRONJOBS = [
    ('*/5 * * * *', 'djangoapi.cron.backup_scheduled_job')
]

cronjobを初めて使う人は*****の部分にどの数字を入れて、毎分、毎週とかでタスクをスケジュール化したいのか調べましょう。

このサイトが分かりやすいと思いました。

このサイトから見ても分かるように1****は毎分タスクを実行させることになります。

タスクの詳細を設定する

では、先ほどのcron.pyに戻り、タスクの内容を書いていきます。

from django.core.management import call_command

def backup_scheduled_job():
    try:
        call_command('dbbackup')
    except:
        pass

crontabのタスクを追加する

では、先ほど作成したタスクをDjangoに教えてあげます。

python manage.py crontab add

で、1分ほど待つと、バックアップファイルが作成されました!

タスクを削除したい場合は下記のコマンドになります。

python manage.py crontab remove

これで、settings.pyに設定されているcrontabのタスクがすべてスケジュールから外されます。

リストアをスケジュールしたい場合

リストアの場合は、本当にリストアしますか?というプロンプト(質問)が聞かれるのでそれをバイパスしてあげる必要があります。

def restore_scheduled_job():
    try:
        call_command('dbrestore', '--noinput')
    except:
        pass

これで、先ほどと同じようにスケジュールを設定すると、毎分データベースがリストアされます。

お疲れさまでした。