【MySQL】複数の SQL ファイルを順に自動実行する安全な方法と活用例
データベースの移行作業や初期データの投入といった場面で、複数の SQL ファイルを MySQL に流し込む必要があるケースは少なくありません。
特に、大量の INSERT
文がファイル単位で分かれている場合、1つずつ手動で mysql コマンドに渡すのは非効率で、ミスの温床にもなります。
この記事では、複数の SQL ファイルを自動かつ安全に MySQL に実行していく方法について解説します。
Unix系シェル環境で利用可能な find
, xargs
, mysql
コマンドを組み合わせることで、再現性と保守性の高いデータ投入フローを構築できます。
今回は、複数の AWS アカウント間で、データを移行したい場面に遭遇したので、即席で mysqldump したデータを移行してみました。
複数の SQL ファイルを対象にしたい理由とは
たとえば、以下のようなシナリオを想定してみましょう。
- 初期データをカテゴリー別・テーブル別にファイルに分けて管理している
- アプリケーションの開発環境を毎回同じ状態に初期化したい
- データマイグレーションにおいて、処理順序を意識しつつ段階的に投入したい
このような場合、1ファイルずつ mysql -u user -p database < file.sql
を繰り返すのは現実的ではありません。
そこで、SQL ファイル群を自動で読み取り、1つずつ mysql に流し込むバッチ的な処理が役立ちます。
安全で拡張性の高いワンライナー
以下は、.sql
ファイルを安全に順番に処理するためのワンライナーです。
find /path/to/sql_dir -type f -name '*.sql' -print0 | xargs -0 -I{} sh -c 'mysql --defaults-file=/path/to/.my.cnf your_database < "{}"'
解説:
find
コマンドで、指定ディレクトリ内の.sql
ファイルだけを再帰的に抽出-print0
によって、スペースや特殊文字を含むファイル名にも対応xargs -0
により、NULL 区切りでファイルを1つずつ処理sh -c
を使って< "{}"
という入力リダイレクト構文を安全に使えるようにしている--defaults-file
オプションにより、MySQL の認証情報を.my.cnf
ファイルに分離してセキュアに管理
この方法であれば、意図せぬファイルを処理するリスクも低く、スクリプトや CI/CD の中でも安心して活用できます。
実務での活用例
この手法は、以下のような用途に非常に有効です:
- 開発環境の初期セットアップ
各テーブルやモジュールごとに分けた.sql
ファイルを順に投入することで、整合性の取れた初期状態を簡単に再現できます。 - 段階的なデータ移行
古いシステムからのデータエクスポートをファイル単位で整理し、そのまま新しい環境へ順次移行するフローに組み込めます。 - 運用タスクの自動化
毎月定例で投入するマスターデータやテンプレート情報などを.sql
にしておけば、自動で実行する仕組みを簡単に構築できます。
失敗しないための注意点
- ファイル名の順序が重要な場合は、
find
の出力をsort
に通すことで制御可能です。 - MySQL のエラー出力を確認したい場合は、
--verbose --show-warnings
オプションを付けることでログが見やすくなります。 .my.cnf
ファイルのパーミッションは600
に設定することで、認証情報の漏洩リスクを防げます。
まとめ
複数の SQL ファイルを MySQL に順番に投入する必要がある場面では、find
と xargs
を組み合わせたワンライナーが非常に強力です。
安全性を確保しつつ、手作業を最小化できるため、開発・運用の効率が大きく向上します。
とくに .my.cnf
による認証情報の分離は、セキュアな運用にも寄与する重要なポイントです。
SQL ファイルの処理が必要なワークフローに、この方法をぜひ取り入れてみてください。