DjangoBrothers BLOG ✍️

2020/10/31

このエントリーをはてなブックマークに追加
Django データベース

Djangoでデータベースのバックアップを取る方法&外部ストレージとの連携方法

Djangoでデータベースのバックアップを取る方法です。

MySQLやPostgreSQLのバックアップ機能を使う方法もあると思いますが、今回はdjango-dbbackupというライブラリを使います。

ライブラリのバージョン

Django==3.1.2
django-dbbackup==3.3.0

説明する内容は以下の通り。

  • django-dbbackupを使ってDBのバックアップを取る方法
  • django-dbbackupを使ってメディアファイルのバックアップを取る方法
  • バックアップファイルの保存先をGoogle Cloud Storageに設定する方法

以下のようなモデルのデータのバックアップを取る想定です。

models.py

class Article(models.Model):

    title = models.CharField(max_length=50)
    text = models.TextField()
    picture = models.FileField(upload_to="pictures")

データベースのバックアップ

まずは必要なライブラリをインストールします。

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

$ pip3 install django-dbbackup==3.3.0

次に、settings.pyを更新します。

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    ...

    'dbbackup',  # django-dbbackup 追加
]


# 追加
DBBACKUP_STORAGE = 'django.core.files.storage.FileSystemStorage'
# BASE_DIR/backups/にバックアップファイルを保存する設定
DBBACKUP_STORAGE_OPTIONS = {'location': os.path.join(BASE_DIR, 'backups')}

これで設定は完了です。

試しにAdmin画面からインスタンスをいくつか作った上で、バックアップを取ってみましょう。

バックアップを取るコマンド

$ python manage.py dbbackup 

バックアップのコマンドを打つとAre you sure you want to continue?と聞かれると思うのでYを打ちます。すると、backupsディレクトリにバックアップファイルが作成されることが確認できると思います。

ファイル名を指定してバックアップを取ることも可能です。

ファイル名を指定してバックアップを取る

$ python manage.py dbbackup -o 初めてのバックアップファイル.dump

次に、Admin画面からデータを削除します。その上で、リストアしてデータを復元してみましょう。

リストアするコマンド

$ python manage.py dbrestore

上記コマンドで、データが復元できます。ファイル名を指定してリストアすることも可能です。

ファイル名を指定してリストアする

$ python manage.py dbrestore -i 初めてのバックアップファイル.dump

メディアファイルのバックアップ

続いて、メディアファイルのバックアップを取る方法です。

models.pysetttings.pyの設定はこんな感じです。

models.py

class Article(models.Model):

    title = models.CharField(max_length=50)
    text = models.TextField()
    picture = models.FileField(upload_to="pictures")

settings.py

import os

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

以下画像のようにファイルをアップロードすると、BASE_DIR/media/pictures/に画像が保存されます。

画像が保存されたことを確認した上で、バックアップをとります。

メディアファイルのバックアップを取るコマンド

$ python manage.py mediabackup

すると、backupsディレクトリに拡張子がtarのバックアップファイルが保存されます。

リストアも試してみます。一度、ファイルが保存されているmediaディレクトリを削除します。

mediaディレクトリを削除

$ rm -r media

続いて、メディアファイルのリストアコマンドを打ちます。

メディアファイルのリストアをするコマンド

$ python manage.py mediarestore

mediaディレクトリとその中のファイルが復元されていることが確認できるはずです。

バックアップファイルの保存先をGoogleCloudStorageに設定する方法

ここまでの例では、Djangoプロジェクト内にバックアップファイルを保存していましたが、Amazon S3DropBoxなどの外部ストレージに保存することもできます。

今回はGoogle Cloud Storageに保存する方法を紹介します。

まずは django-storagesgoogle-cloud-storageをインストールします。

django-storagesとgoogle-cloud-storageインストール

$ pip3 install django-storages
$ pip3 install google-cloud-storage

続いてDBBACKUP_STORAGEDBBACKUP_STORAGE_OPTIONSを以下のように書き換えます。

settings.py

DBBACKUP_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
DBBACKUP_STORAGE_OPTIONS = {"bucket_name": "自分のバケット名(後述)"}

ここからは、django-storagesのドキュメントを参考にして、バケットの作成バケットにアクセスするための鍵を取得します。

まず、サービスアカウントキーを作成します。プロジェクトがない場合はプロジェクトを新規作成します。

↓サービスアカウントキー作成画面

↓プロジェクト作成画面

最終的に「作成」をクリックしてJSONがパソコンにダウンロードされればOKです。

ダウンロードしたJSONファイルへのパスを、環境変数GOOGLE_APPLICATION_CREDENTIALSに設定します。仮にですが、JSONファイルがDesktopに保存されてあると仮定すると、以下のように設定します(もしくはenvファイルなどを使った設定でもOKです)。

環境変数 GOOGLE_APPLICATION_CREDENTIALSを設定

$ export GOOGLE_APPLICATION_CREDENTIALS=~/Desktop/<ダウンロードしたファイル名>.json

Google Cloud Platformの「Storage」からバケットを作成します。

作成したバケット名を、settings.pyのbucket_nameの値として記載します。

ここまでの設定が完了すると、Google Cloud Storageとの連携ができて先ほどと同じコマンドでバックアップやリストアができるようになります。

保存するファイル数を制限する

定期的にバックアップコマンドを実行していると、どんどんファイルが溜まっていくことになります。

DBBACKUP_CLEANUP_KEEPで保存するファイルの上限数を指定できます。

settings.py

# 最新の3つのファイルを保存(それより古いものは順番に破棄)する設定
DBBACKUP_CLEANUP_KEEP = 3

# メディアのバックアップファイルも同様の設定
DBBACKUP_CLEANUP_KEEP_MEDIA = 3

コマンド実行時には、--cleanオプションをつける必要があります。

古いファイルは削除してバックアップを取る

$ python manage.py dbbackup --clean