繁体   English   中英

使用 shell 脚本执行多个 MySQL 命令的更好方法

[英]A better way to execute multiple MySQL commands using shell script

我想写一个 *.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语句

这是cmds.txt文件,其中包含MySQL命令:

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

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

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

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

请注意,您还可以使用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之前不应该有任何空格 (除非您使用<<-而不是<< - 在这种情况下,前导制表符被剥离):

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文档

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

来自mysql cli:

mysql> source mycmds.sql

使用管道:

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

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

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

与其他减少重复的答案不同,但
有一些方法可以减少每行命令中的选项(用户、主机 ... -u-p-h ...)

我知道的2种方法。


1.使用my.cnf文件

您可以将您的用户信息存储在选项文件中(例如 ~/.my.cnf 等)

[client] 
user=your_username
password=your_password
# database=database_name

然后您可以使用一个选项-e运行mysql命令并查询

mysql -e "drop database $dbname;"
mysql -e "create database $dbname;"
mysql -e "another MySQL command"

2.使用mysql_config_editor

您可以使用mysql_config_editor保存登录信息

mysql_config_editor set --login-path=mypath1 --host=localhost --user=root --password

然后仅使用 login-path 选项运行命令

mysql --login-path=mypath1 -e "drop database $dbname;"
mysql --login-path=mypath1 -e "create database $dbname;"
mysql --login-path=mypath1 -e "another MySQL command"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM