MySQL

 

シェルスクリプトからMySQLを実行

シェルスクリプトから、MySQLの色々なコマンドを実行します。それぞれトランザクションが有効か無効かについてもまとめます。これらを全て把握すると、linuxサーバ上でのMySQLの操作が速く効率よく行えるようになります。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告
mysql -uroot -e "show tables"

-eオプションはトランザクションに注意。

以下はトランザクションは効いていません。

mysql -uroot -e "begin;"
date
mysql -uroot -e "insert into hoge values(1, 2, 3);"
date
mysql -uroot -e "commit;"

トランザクションが効かない理由は簡単です。

mysqlコマンド毎にコネクションが切れているからです。

従って、-eオプションでトランザクションを有効にするには、以下のようにワンライナーにするしかありません。

mysql -uroot -e "begin; insert into hoge values(1, 2, 3); commit;"

bashの変数をSQLに埋め込む事も可能です。以下は引数で渡したテーブルのカラム一覧を出力する例です。

#!/bin/sh
schema=$1
sql="select table_name, column_name from information_schema.columns where table_schema = '$schema';"
mysql -uroot information_schema -e "$sql"
mysql -uroot test < hoge.sql

SQLファイルの場合、SQLファイル内でのみトランザクションが有効です。

例えば以下のように複数回に分けてもトランザクションはファイル毎にしか有効になりません。

mysql -uroot test < begin.sql
mysql -uroot test < hoge.sql
mysql -uroot test < commit.sql

この場合もトランザクションが効かない理由は簡単です。

やはりmysqlコマンド毎にコネクションが切れているからです。

-eオプションと違ってbashの変数をSQLに埋め込む事はできません。

mysql -uroot -D$schema <<EOF
begin;
select table_name, column_name from information_schema.columns where table_schema = "$schema";
insert into hoge values(1, $name3);
commit;
EOF

こんな感じでEOF内はトランザクションも有効で、bashの変数も渡せます

sourceコマンドは、mysqlにログインした後に、SQLファイルを読み込むコマンドです。

ヒアドキュメントとsourceを組み合わせてトランザクションが効くか実験してみます。

まず以下のテーブルを用意します。

create table t (id int, primary key(id)) engine=innodb;

続いて以下のinsert文のSQLファイルを用意。

insert into t values(1), (2), (3), (4);

続いて以下のシェルスクリプトを用意します。

#!/bin/sh
mysql -uroot test <<EOF
begin;
source insert.sql
source insert.sql
commit;
EOF

複数回insert.sqlを実行してわざと「Duplicate entry '1' for key 'PRIMARY'」を起こします。

$ ./test.sh
$ mysql -uroot test

mysql> select * from t;
Empty set (0.00 sec)

なんと、トランザクションが効いています。

ちゃんとtテーブルへのinsertがrollbackされて、データが0件になりました。

それぞれの機能比較です。

トランザクション bashの変数を渡せるか
-e -eの引数内で有効。 渡せる。
リダイレクト SQLファイル内で有効。 渡せない。
ヒアドキュメント EOF内で有効。 渡せる。
ヒアドキュメントとsource EOF内で且つsourceを跨いで有効。 渡せる。

続いて、それぞれのメリット・デメリットです。

メリット デメリット
-e 手軽。すぐ実行できる。 長いSQLが実行し難い。
リダイレクト 長いSQLが実行し易い。
既に作成済のSQLファイルを実行し易い。
bash側の変数をSQLに渡せない。
ヒアドキュメント bash変数が渡せて、
且つトランザクションが有効。
要所でしか使わない方がいい。
基本はORMからSQLを実行すべき。
ヒアドキュメント
+source
bash変数が渡せて、
且つsourceを跨いでトランザクションが有効。
DBAの許可が無い限り使用しない事。
やはり基本はORMからSQLを実行する。

ヒアドキュメントは高機能なのですが、無闇に使うべきでないと思っています。 テスト用のスクリプトなら問題ありませんが、昨今の開発ではS2JDBCのようなORMを使うのが普通なので、 ヒアドキュメントでガリガリSQLを書いてしまうのは好ましくありません。 何故好ましくないかというと、eclipseを使ってカラム名の変更する際に、 リファクタリング機能の対象から漏れるので、「*.sql」「*.sh」でgrepし、個別に修正する必要があるからです。 別に手順化すれば問題無いと考える方もいるかと思いますが、ヒューマンエラーを誘発する作業をさせる事自体が問題なのです。 なので、要所でのみ使うといいと思います。

データの取り込みスクリプト等、DBAが絡む部分なら問題無いかと思います。

treeおすすめの書籍です!
【送料無料】実践ハイパフォ-マンスMySQL第2版

【送料無料】実践ハイパフォ-マンスMySQL第2版
価格:4,830円(税込、送料別)

【送料無料】エキスパ-トのためのMySQL運用+管理トラブルシュ-ティングガイド

【送料無料】エキスパ-トのためのMySQL運用+管理トラブルシュ-ティングガイド
価格:3,465円(税込、送料別)

【送料無料】基礎からのMySQL改訂版

【送料無料】基礎からのMySQL改訂版
価格:3,129円(税込、送料別)

◯ 広告