MySQLで、シェルスクリプトからバッチ処理でSQLを実行する方法

シェルスクリプトからSQL文を実行する場合はこのようにします。

batch.sqlファイルに実行したいSQL文をあらかじめ書いておいて、
mysql -h host -u username -ppassword dbname < batch.sql
(↑ -pの直後に続けてパスワードを書きます。)

SQL文をインラインで書いて実行することもできます。
mysql -h host -u user -ppassword dbname -e "INSERT INTO users (id, nickname) values (1, 'DQNEO');"

これを応用すれば、「データベースを初期化」→「テーブル作成」→「初期データ投入」のような作業を自動化することができます。
SQL文の中でシェル変数が使えるので非常に便利です。

以下に実際の応用例を示します。

サンプルコード

db_init.sh
#!/bin/sh

# このスクリプト(db_init.sh)のディレクトリの絶対パスを取得
DIR=$(cd $(dirname $0); pwd)

# テーブル作成SQL
SQL_CREATE=$DIR/create_tables.sql

# 初期データインポート用のCSVファイル
CSV_RECORDS=$DIR/records.csv
CSV_KAMOKUS=$DIR/kamokus.csv

# MySQLをバッチモードで実行するコマンド
CMD_MYSQL="mysql -u dqneo -phimitsu kakeibo"

# テーブル作成SQL(外部ファイル)を実行
$CMD_MYSQL < $SQL_CREATE

# INSERT文を直接実行
$CMD_MYSQL -e "INSERT INTO users (id, nickname, created_on) values (1, 'DQNEO', now());"

# CSVデータをインポートする
$CMD_MYSQL -e " LOAD DATA LOCAL INFILE '$CSV_RECORDS' INTO TABLE records FIELDS TERMINATED BY ',' ENCLOSED BY '\'' "
$CMD_MYSQL -e  "LOAD DATA LOCAL INFILE '$CSV_KAMOKUS' INTO TABLE kamokus FIELDS TERMINATED BY ',' "

# これが意外と便利。
# ヒアドキュメントで複数のSQL文を一括で実行する
#
$CMD_MYSQL <<EOF
update records set user_id = '1' ;
update kamokus set created_on = now();
update records set kasi_id = kasi_id + 50;
update records set user_id = '1' ;
update records set kari_id = 41 where kari_id = 0;
update kamokus set id = 41 where id = 0;
EOF


非常に便利なので一度試してみてはいかがでしょうか?
参考
MySQL :: MySQL 5.1 Reference Manual :: 3.5 Using mysql in Batch Mode
カテゴリ:

人気記事