
< >で囲まれた部分は、自分の環境に合わせる必要がある。その際は< >は記載せずに取り除いてね。
#!/bin/bash
# データベースから指定されたテーブルをバックアップし、
# 1万行ごとにデータを分割してCSVファイルにエクスポートするスクリプト。
# ディレクトリの定義
projectDirectory="</プロジェクトのルートディレクトリ>" #ホストOS(コンテナの外の実機OS)のアプリのルートディレクトリ
backupDirectory="</バックアップ先>" #ホストOS(コンテナの外の実機OS)におけるバックアップデータ保存先
timestamp=$(date +%Y%m%d%H%M) # 現在のタイムスタンプを取得
# バックアップディレクトリが存在しない場合は作成
mkdir -p ${backupDirectory}
cd $projectDirectory # プロジェクトディレクトリに移動
# バックアップ対象のテーブル名を配列に格納
tables=("<カラム1>" "<カラム2>" "<カラム3>" "<カラム4>")
# 各テーブルに対するバックアップ処理
for table in "${tables[@]}"; do
# テーブルの総行数を取得
totalRows=$(/usr/bin/docker-compose exec -T <MySQLのコンテナ名> bash -c "mysql -u <データベースユーザー名> <データベースパスワード> <データベース名> -e 'SELECT COUNT(*) FROM $table'" | tail -n 1)
# 1万行ごとにデータを分割してエクスポート
for start in $(seq 0 10000 $((totalRows-1))); do
fileName="${timestamp}_${table}_part$(($start / 10000 + 1)).csv"
filePath="/tmp/$fileName"
# MySQLコマンドを実行し、出力をCSV形式に変換
/usr/bin/docker-compose exec -T <MySQLのコンテナ名> bash -c "mysql -u <データベースユーザー名> <データベースパスワード> <データベース名> -e 'SELECT * FROM $table LIMIT $start, 10000' | sed 's/,//g; s/\"//g; s/\t/,/g' > $filePath"
# CSVファイルをコンテナからホストマシンにコピー
/usr/bin/docker cp $(docker-compose ps -q <MySQLのコンテナ名>):$filePath ${backupDirectory}/$fileName
# コンテナ内の一時ファイルを削除
/usr/bin/docker-compose exec -T <MySQLのコンテナ名> bash -c "rm $filePath"
echo "Exported $table part $(($start / 10000 + 1))" # 処理の進行状況を表示
done
done
# 30日以上前に生成されたバックアップファイルを削除
deletespan=30
find ${backupDirectory} -name "*backup*" -type f -mtime +${deletespan} -delete
echo "Job done." # 処理完了のメッセージを表示
MySQLのコンテナ名はdocker-compoes.yml
にて確認可能
db:
build: ./infra/mysql
volumes:
- db-store:/var/lib/mysql
上記の場合db
だね。
仕様
- バックアップファイルの命名規則:
- バックアップファイルの名前は
<タイムスタンプ>_<テーブル名>_part<パート番号>.csv
という形式で命名されます。 - ここで、
<タイムスタンプ>
はYYYYMMDDHHMM
の形式、<テーブル名>
はバックアップ対象のテーブル名、<パート番号>
は1万行ごとのデータ分割のパート番号を表します。
- バックアップファイルの名前は
- バックアップファイルの作成と分割:
- バックアップは、指定したテーブルのデータを1万行ごとに分割して行います。
- 各分割は個別のCSVファイルとして保存され、CSVファイルはタブをカンマに変換し、各フィールドからカンマとダブルクオートを削除する処理が行われます。
- バックアップファイルの保存:
- バックアップファイルは、指定されたバックアップディレクトリに保存されます。
- バックアップファイルの削除:
- スクリプトは、指定された日数(このスクリプトでは30日)以上前に生成されたバックアップファイルを自動で削除します。
注意点
このコードのままだとデータベースのパスワードがハードコーディングされており、あまり良くないので
隠しファイル等から参照するようにした方がいい。