logo

備忘録】Docker-Compose上に動いているデータベースの定期バックアップ【初心者】

投稿日2024-02-16

更新日2024-05-03

Picture of the logo

タグ一覧

目次(タップして移動)

タイトルのとおり、Docker-Compose上に動いているMysql(またはMariadb)のバックアップを取る手順について備忘録も兼ねて書き残しておきます。ちなみに、主の環境はubuntu+docker+mariadbです。mysqlかmariadbかは好みによって好きな方を選んで構いません。

1 docker-compose.ymlの記述と起動

version: '3'
# サンプル用用ymlファイル
services:
  # MySQL
  db:
    image: mysql:latest
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: パスワード
      MYSQL_DATABASE: db名
      MYSQL_USER: ユーザー名
      MYSQL_PASSWORD: パスワード
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306

    restart: always

特別な記述は一切無い最低限のシンプルなサンプルコードです。実際の運用は用途や状況に合わせて書き換えて下さい。公開するポートも3306からは変えても良いかもしれません。

上記の設定でdocker-compose up -dしたと仮定します。

ダンプファイルの保存

通常、mysqlの保存はダンプファイルという形でバックアップが取られます。ここではdocker-compose内で動いているmysqlに対し、ホスト側からバックアップを取るシェルスクリプトを用意します。

#!/bin/bash

# バックアップを保存するディレクトリ
backup_dir="/path/to/backup/directory"

# 日付を取得してファイル名に使用する形式(YYYYMMDD)
date=$(date +"%Y%m%d")

# バックアップファイル名
backup_file="db_backup_$date.sql"

# docker-compose exec コマンドで mysqldump を実行し、バックアップを取得
docker-compose exec db mysqldump -uユーザー名 -pパスワード データベース名 > "$backup_dir/$backup_file"

# バックアップが成功した場合のメッセージ
echo "バックアップが正常に作成されました: $backup_file"

# 最新の5つのバックアップファイルのみ残す
cd "$backup_dir"
ls -t | tail -n +6 | xargs -I {} rm --

# 残ったバックアップファイルの数を表示
echo "残っているバックアップファイル数: $(ls -1 | wc -l)"

ファイルパスやファイル名の命名規則、ユーザー名パスワードなどは自分の環境や状況に合わせて書き換えて下さい。バックアップは最新の5件を残すようにしているので6件目以降を削除するようにしています。仮に10件残すのであれば11件目以降を削除するように適宜書き換えて下さい。

シェルスクリプトが出来上がったら一度テストして問題ないようであればcrontabで毎日0時0分に実行とすれば一日一回バックアップが取られるようになります。時間は0時0分でなくとも構いませんが。

出来れば他のストレージに

今回はお試しなので同じサーバ(またはPC)上に保存ですが、可能な人はAWS S3などの別の場所に保存するようにした方が良いでしょう。

保存されたダンプファイルからデータベースを復元する

万が一、データベースが致命的なダメージを受けた時はバックアップデータの出番です(一生に一回あるかどうかって話だと思いますが)。バックアップされたダンプファイルからデータベースとして復元するまでの手順も書き残しておきます。

#!/bin/bash

# バックアップファイルのパス
backup_file="/path/to/backup/directory/file_name.sql"

# Docker Compose を使用して MySQL コンテナ内でデータベースをリストア
docker-compose exec -T db mysql -uユーザー名 -pパスワード データベース名 < "$backup_file"

# リストアが完了した場合のメッセージ
echo "バックアップファイルからデータベースをリストアしました。"

子のスクリプトでdocker-compose上に動くmysqlを復元する事が出来るでしょう。こちらもファイルパス、ファイル名やユーザー名パスワード等は環境に合わせて書き換えて下さい。バックアップを使う機会はほとんど無いと思いますがお守り代わりに覚えておくといいでしょう。






このサイトをシェアする