DBの復元によって容量が圧迫される
問題の調査や分析をする際にバックアップされたファイルを復元することがあるのですが、今までは、
- S3から対象のバックアップファイルをダウンロードしてくる
- ローカルのMySQLに復元する
ということを行なっていました。問題調査や分析後に復元したDBを削除し忘れるとどんどん容量が圧迫されてしまいます。さらにはダウンロードしたバックアップファイルの削除も忘れるとさらに圧迫されてしまいます。
Dockerを使って復元してみる
方針
- バックアップファイルはpython(boto3)を使ってダウンロード
- MySQLの公式イメージを用いて指定の位置にバックアップファイルを配置
マルチステージビルトが便利
マルチステージビルドとはDockerfileにFROM
を複数記述できるようなもので、FROM
ごとに新しいビルドが開始されるようなものです。(詳しくは公式ページ)
今回作成したDockerfile
は以下の通り
FROM python:3.7 AS get-stage
WORKDIR /app
COPY ./requirements.txt /app
RUN pip install --no-cache-dir -r requirements.txt
COPY ./get_dumps.py /app
RUN python get_dumps.py
FROM mysql:5.7
WORKDIR /app
ENV MYSQL_ROOT_PASSWORD=<your password> \
MYSQL_DATABASE=<database name>
COPY --from=get-stage /app/backup.sql.gz /docker-entrypoint-initdb.d
get_dumps.py
ではboto3
を用いてs3から指定のバックアップファイル(backup.sql.gz
)をダウンロードしています。
Point
AS
でターゲット名を指定し、後に起動するイメージへ出力したファイルをコピー- 初期データ投入のために
/docker-entrypoint-initdb.d
にバックアップファイルを配置
起動して接続
起動する
$ docker image build -t restore-mysql
$ docker run --name restore-mysql-container -p 13306:3306 -d restore-db
接続してみる
$ mysql -u root -h 127.0.0.1 -P 13306 -p <database name>
終わりに
Dockerを使うことで、ローカルを汚さずDBを復元することができました。現状、バックアップファイルの指定はget_dumps.py
を手動で書き換えることでしかできません。今後はバックアップファイルの指定も簡単にできるようにしたいと思っています。
コメント