【问题标题】:A better way to execute multiple MySQL commands using shell script使用 shell 脚本执行多个 MySQL 命令的更好方法
【发布时间】:2015-12-28 10:15:10
【问题描述】:

我想写一个 *.sh 脚本来执行多个 MySQL 命令。

目前,我可以做的事情如下

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”?

【问题讨论】:

    标签: mysql bash shell


    【解决方案1】:

    您可以使用单个多重查询:

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

    只需编写由; 分隔的所有查询。他们将一个接一个地运行。

    【讨论】:

    • 你所有的答案都很棒。我选择 EricWang 的答案是因为我认为这是完成这项工作的最结构化的方式。
    【解决方案2】:

    有几种方法,在linux中你有:

    来自 mysql cli:

    mysql> source mycmds.sql
    

    使用管道:

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

    使用管道或重定向从文件执行命令:

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

    【讨论】:

    • 你所有的答案都很棒。我选择 EricWang 的答案是因为我认为这是完成这项工作的最结构化的方式。
    • 最完整的答案。 (它包含 EricWang 的答案,除了 --version 以获取进度信息。)此外,使用 .sql 作为 SQL 的结尾应该优先于通用 .txt 以避免信息丢失(除非支持动态格式检测)。跨度>
    【解决方案3】:

    我认为你可以从文本文件中执行 MySQL 语句,例如

    这里是包含 MySQL 命令的 cmds.txt 文件:

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

    要使用 shell 脚本执行它们,请键入

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

    这样,您可以将 MySQL 命令与 shell 脚本分开。

    您可能希望脚本向您显示进度信息。为此,您可以使用“--verbose”选项调用 mysql。

    欲了解更多信息,请参阅https://dev.mysql.com/doc/refman/5.6/en/mysql-batch-commands.html

    【讨论】:

    • 你所有的答案都很棒。我选择 EricWang 的答案是因为我认为这是完成这项工作的最结构化的方式。
    • 你能告诉我这个解决方案是否在单独的事务中执行每个语句吗?
    • @Mike 我认为是的
    【解决方案4】:

    请注意,您还可以使用 HERE 文档在同一脚本中进行查询:

    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 之前不应有任何空格(除非您使用 &lt;&lt;- 而不是 &lt;&lt; - 在这种情况下,前导制表符会被去除):

    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 语法的更多信息,请参阅the bash documentation

    【讨论】:

    • 感谢您的出色解决方案!使用 bash,如果我在结束 EOF 之前放置一个制表符,我会收到一个错误,但没有它,一切都很顺利。
    • 不适合我。我正在尝试胜利 10 cd C:\xampp\mysql\bin &amp;&amp; mysql.exe -u admin -padmin123 &lt;&lt;'EOF' select 'IMPORT_DONE' AS IMPORT_STATUS EOF 它的说法 'EOF' is not recognized as an internal or external command, operable program or batch file.
    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 2017-01-13
    • 1970-01-01
    • 2011-04-26
    • 2017-09-01
    • 2015-02-03
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多