web-dev-qa-db-ja.com

シェルスクリプトを使用して複数のMySQLコマンドを実行するより良い方法

複数のMySQLコマンドを実行する* .shスクリプトを作成したいと思います。

現在、私ができることは次のようなものです

mysql -h$Host -u$user -p$password -e "drop database $dbname;"
mysql -h$Host -u$user -p$password -e "create database $dbname;"
mysql -h$Host -u$user -p$password -e "another MySQL command"
...

MySQLコマンドを実行するたびに「mysql -h $ Host -u $ user -p $ password -e」と入力しないようにする方法はありますか?

18
Brian

たとえば、テキストファイルからMySQLステートメントを実行できると思います

mySQLコマンドを含むcmds.txtファイルは次のとおりです。

select colA from TableA;
select colB from TableB;
select colC from TableC;

シェルスクリプトを使用して実行するには、次を入力します。

mysql -h$Host -u$user -p$password db_dbname < cmds.txt

このようにして、MySQLコマンドをシェルスクリプトから分離します。

スクリプトに進捗情報を表示することもできます。このために、「-verbose」オプションでmysqlを呼び出すことができます。

詳細については、 https://dev.mysql.com/doc/refman/5.6/en/mysql-batch-commands.html を参照してください

22
EricWang

単一のマルチクエリを使用できます:

mysql -h$Host -u$user -p$password -e "drop database $dbname;create database $dbname;another MySQL command;"

すべてのクエリを;で区切って書くだけです。それらは次々に実行されます。

13
chris p bacon

HERE docを使用して、同じスクリプト内でクエリを実行することもできます。

mysql -h$Host -u$user -p$password db_dbname <<'EOF'
select colA from TableA;
select colB from TableB;
select colC from TableC;
EOF

スクリプトの内容がパラメーターの置換を無効にするのを防ぐために、最初の行でEOFではなく'EOF'を使用していることに注意してください(特に`には問題があります)

また、最後のEOFの前に空白があってはならないことに注意してください(<<-ではなく<<-を使用する場合を除く)大文字と小文字のタブ文字は削除されます):

mysql -h$Host -u$user -p$password db_dbname <<- 'EOF'
↠select colA from TableA;
↠select colB from TableB;
↠select colC from TableC;
↠EOF

をタブ文字に置き換えます。]

HERE doc構文の詳細については、 bashのドキュメント を参照してください。

12
Erwin Wessels

Linuxにはいくつかの方法があります。

Mysql cliから:

mysql> source mycmds.sql

パイプの使用:

echo "SELECT ..; INSERT ..;" | mysql ...

パイプまたはリダイレクトを使用してファイルからコマンドを実行する:

cat file.sql | mysql ... OR mysql .. < file.sql
10
Dave