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.py
やsetttings.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 S3やDropBoxなどの外部ストレージに保存することもできます。
今回はGoogle Cloud Storageに保存する方法を紹介します。
まずは django-storages
とgoogle-cloud-storage
をインストールします。
django-storagesとgoogle-cloud-storageインストール
$ pip3 install django-storages
$ pip3 install google-cloud-storage
続いてDBBACKUP_STORAGE
とDBBACKUP_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