初のQiita記事です。どうぞお手柔らかに
前置き長いので目的
docker-composeで個別のDumpファイル(ってかSQL)を、初期化時にまとめてbashでレストアしたい!
以上記事終了。
というわけにもいかず、まぁdocker-composeでMySQL環境構築はみなさん当たり前にやってるかと思います。
まぁなんで、何番煎じの記事なんじゃという話ではあるんですが。
Amazon Aurora MySQLを使っているのですが、なんらかの理由で全データをローカルで見たいとなるんです。--all-databases
でdumpを取得してレストアしてみたものの、権限周りもセットでバックアップされる関係もあってレストア直後は接続できますが、コンテナを一度落とすと接続できなくなるという残念な結果になります。
(ローカルでやるとMySQLぶっ壊れるので、必ずdocker使いましょう。私は壊しました。)
よってDBごとに個別でdumpを取得して、個別にレストアする必要があります。
で、この個別のDumpファイル(ってかSQLなんですけど)を、初期化時にまとめてレストアしたいんじゃ!ってのが今回の目的です。
まぁ細かいことは他の記事に移譲します。私もそこを参考にしました。
先駆者はとても偉大ですね。本当に尊敬します。ありがとうございます。
まぁdumpに付けられた名前をそのままDBの名前として使いたいが本当の目的。
結局なにかって、初期化時に走るbashスクリプトを書いただけです。
あとは参考文献をもとに構成されてます。
sqlディレクトリにDB単位のdumpファイルつっこんで、docker-compose up -d --build
するだけです。
本当はSQLのIF分とか使えやとかヒアドキュメントでかけやとか言われてしまいそうだしconfにパスワード書けとか言われそうだけどヘーキヘーキ(あかん)
その辺うまく書き換えてください。
docker-compose でMySQL環境簡単構築を参考にしているのですが、以下のコードは記事で言えばinit-database.shファイルの中身です。
ファイルの階層とかも気にしてください。
とりあえず誰かの役に立てれば幸いです。
#!/bin/bash
#MySQL
DB_HOST=localhost
DB_USER="任意のユーザー"
DB_PASS="任意のパスワード"
DB_PORT="任意のポート"
CURRENT=$(cd $(dirname $0);pwd)
files="${CURRENT}/sql/*"
#配列作成
array=()
for filepath in $files; do
echo $filepath
#変数$filepathの中身を配列に追加
array+=("$filepath")
done
# Dump Databases
for e in ${array[@]}; do
name=`basename $e .sql`
echo $name
dbname=\``echo ${name}`\`
echo $dbname
mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -e "CREATE DATABASE $dbname;"
mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" ${name} < ${e}
done
【参考文献】
Aurora MySQLでリストア権限のあるDBを個別にダンプするスクリプト
docker-compose でMySQL環境簡単構築