シェルスクリプトでDocker環境のMysqlの任意のカラムのデータをCSVで書き出す

< >で囲まれた部分は、自分の環境に合わせる必要がある。その際は< >は記載せずに取り除いてね。

#!/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だね。

仕様

  1. バックアップファイルの命名規則:
    • バックアップファイルの名前は<タイムスタンプ>_<テーブル名>_part<パート番号>.csvという形式で命名されます。
    • ここで、<タイムスタンプ>YYYYMMDDHHMMの形式、<テーブル名>はバックアップ対象のテーブル名、<パート番号>は1万行ごとのデータ分割のパート番号を表します。
  2. バックアップファイルの作成と分割:
    • バックアップは、指定したテーブルのデータを1万行ごとに分割して行います。
    • 各分割は個別のCSVファイルとして保存され、CSVファイルはタブをカンマに変換し、各フィールドからカンマとダブルクオートを削除する処理が行われます。
  3. バックアップファイルの保存:
    • バックアップファイルは、指定されたバックアップディレクトリに保存されます。
  4. バックアップファイルの削除:
    • スクリプトは、指定された日数(このスクリプトでは30日)以上前に生成されたバックアップファイルを自動で削除します。

注意点

このコードのままだとデータベースのパスワードがハードコーディングされており、あまり良くないので

隠しファイル等から参照するようにした方がいい。

無制限に質問可能なプログラミングスクール!

万が一転職できない場合は、転職保障全額返金できるコースもあり!!

無制限のメンター質問対応

 

DMMウェブキャンプでプログラミングを学習しませんか?

独学より成長スピードをブーストさせましょう!

 

まずは無料相談から!

おすすめの記事