MySQLとシェルスクリプト
MySQLのSQL文を、OSのコマンドラインまたはシェルスクリプトから実行したい時の例を、いくつか。
まずコマンドラインからサクッと実行するには、-eオプションを利用。
$ mysql -u user_name -pxxxxxx -e “SQL文”
「;」で区切れば複数のSQL文発行も可能。
$ mysql -u user_name -pxxxxxx -e “SQL文;SQL文;SQL文”
以下の方式でも可。
$ echo “SQL文;” | mysql -u user_name -pxxxxxx
これらのコマンドラインをそのままシェルスクリプトに書いてもいいわけだ。
次にSQL文をファイルに記述しておいて読み込ませる方法。
“file_name”にはSQL文が記述されているものとする。
$ mysql -u user_name -pxxxxxx < file_name
上記はSQL文においてデータベース名が定義されている場合。
以下のようにコマンドライン上でデータベースを指定するやり方でも可。
$ mysql -u user_name -pxxxxxx db_name < file_name
実行結果の出力を確認。
以下、出力が大量になる場合に、ページングさせて表示。たいした量でなければcatでもよい。
$ mysql < file_name | less
結果をファイルに保存したかったら、普通にリダイレクトできる。
$ mysql -u user_name -pxxxxxx -e “SQL文;” > outfile
SQL文をファイルから読み込ませて実行し、ファイルに追加出力する例。
$ mysql < file_name >> outfile
ちなみに出力結果の表示形式は、対話形式の時と違い、簡易版のようになる。
対話形式と同じように出力させたい場合は、-t オプションを使用する。
実行しているコマンドを出力にエコーするには、-vvv オプションを。
ヒアドキュメントを利用する書き方。
#!/bin/bash
mysql -u user_name -pxxxxxx << EOF
SQL文;
SQL文;
SQL文;
EOF
逆にMySQLにログインした状態からファイルを実行するには。
mysql> source file_name;
コマンドラインからこんな風にしても、同じこと。
$ mysql -e “source file_name”
これくらい押さえておけばいいかな。あとは応用で。
コマンドラインのちょっとした応用を組み合わせたり、シェルスクリプトのif文や
while文など組み合わせることによりいろんなことができそうだ。
当初MySQLのストアドプロシージャーにwhile文を組み込もうと思ったりしたが、
ストアドプロシージャー自体よくわかっておらず、延々と悩んだり学習している
時間もないのでシェルで対応したら、あっさりできた。
どんなときでも、物事はシンプルに考えた方がうまくいく。気がする。
ストアドプロシージャーは、まぁ、いつかリベンジしようかと、、
(いつになるんだ?)
追記:列名の出力を抑制するには-Nオプションを使用する。
例えば、以下のコマンドでカレントのバイナリログ番号を確認できるのだが、、、
$ mysql -u user_name -pxxxxx -e “SHOW MASTER STATUS”
余計なものを出力させずに、値だけ取り出したい場合がある。その場合はこんな風に。
$ mysql -u user_name -pxxxxx -N -e “SHOW MASTER STATUS” | awk ‘{print $1}’