如何从shell脚本执行MySQL命令?

MUF*_*UFC 119 mysql ssh shell

如何通过shell脚本执行SQL命令,以便我可以使其自动化?

我想使用shell脚本恢复我在SQL文件中收集的数据.我想连接到服务器并恢复数据.该命令在通过SSH命令行单独执行时有效.

这是我使用的命令:

mysql -h "server-name" -u root "password" "database-name" < "filename.sql"
Run Code Online (Sandbox Code Playgroud)

这是创建文件ds_fbids.sql并将其传递到mysql 的shell脚本代码.

perl fb_apps_frm_fb.pl
perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql
mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

Bil*_*win 161

您需要使用该-p标志来发送密码.而且它很棘手,因为你-p和密码之间必须没有空格.

$ mysql -h "server-name" -u "root" "-pXXXXXXXX" "database-name" < "filename.sql"
Run Code Online (Sandbox Code Playgroud)

如果在-p使mysql客户端以交互方式提示输入密码之后使用空格,则它会将下一个命令参数解释为数据库名称:

$ mysql -h "server-name" -u "root" -p "XXXXXXXX" "database-name" < "filename.sql"
Enter password: <you type it in here>
ERROR 1049 (42000): Unknown database 'XXXXXXXX'
Run Code Online (Sandbox Code Playgroud)

实际上,我更喜欢将用户和密码存储在〜/ .my.cnf中,所以我根本不需要将它放在命令行中:

[client]
user = root
password = XXXXXXXX
Run Code Online (Sandbox Code Playgroud)

然后:

$ mysql -h "server-name" "database-name" < "filename.sql"
Run Code Online (Sandbox Code Playgroud)

你的评论:

我在命令行和shell脚本中一直运行如上所述的批处理模式mysql命令.很难诊断shell脚本的错误,因为您没有共享确切的脚本或任何错误输出.我建议你编辑上面的原始问题并提供出错的例子.

此外,当我正在对shell脚本进行故障排除时,我使用该-x标志,以便我可以看到它是如何执行每个命令的:

$ bash -x myscript.sh
Run Code Online (Sandbox Code Playgroud)

  • +1表示"-p和密码之间没有空格" (9认同)

小智 111

使用以下语法:

mysql -u $user -p$passsword -Bse "command1;command2;....;commandn"
Run Code Online (Sandbox Code Playgroud)

  • 有关手册中选项的更多详细信息:*-B*用于批处理,使用制表符作为列分隔符打印结果,每行都在新行上.使用此选项,mysql不使用历史记录文件.批处理模式导致非常规输出格式和特殊字符的转义.*-s*是静音模式.产量减少.*-e*是执行语句并退出 (10认同)
  • 我从谷歌登陆到这个页面,这是我期望的解决方案(与问题的标题相匹配). (6认同)

Jer*_*con 38

所有以前的答案都很棒.如果它是一个简单的,你希望运行的一行sql命令,你也可以使用-e选项.

mysql -h <host> -u<user> -p<password> database -e \
  "SELECT * FROM blah WHERE foo='bar';"
Run Code Online (Sandbox Code Playgroud)


Mil*_*ara 18

如何执行SQL脚本,使用以下语法:

mysql --host= localhost --user=root --password=xxxxxx  -e "source dbscript.sql"
Run Code Online (Sandbox Code Playgroud)

如果您使用host作为localhost,则无需提及它.你可以用这个:

mysql --user=root --password=xxxxxx  -e "source dbscript.sql"
Run Code Online (Sandbox Code Playgroud)

这适用于Windows和Linux.

如果密码内容包含!(感叹号),则应\在其前面添加(反斜杠).


Li1*_*i1t 8

这个问题的核心已经多次回答了,我只是想我会补充一点反引号(s)在shell脚本和SQL中都有所作为.如果您需要在SQL中使用它们来指定表或数据库名称,则需要在shell脚本中将它们转义为:

mysql -p=password -u "root" -Bse "CREATE DATABASE \`${1}_database\`;
CREATE USER '$1'@'%' IDENTIFIED BY '$2';
GRANT ALL PRIVILEGES ON `${1}_database`.* TO '$1'@'%' WITH GRANT OPTION;"
Run Code Online (Sandbox Code Playgroud)

当然,除非你信任用户输入,否则不应该通过连接的用户输入(传递的参数)生成SQL.将它放在另一种支持参数/正确转义字符串以插入的脚本语言中会更安全进入MySQL.


Ste*_*ton 5

如前所述,您可以使用 -p 将密码传递到服务器。

但我推荐这个:

mysql -h "hostaddress" -u "username" -p "database-name" < "sqlfile.sql"
Run Code Online (Sandbox Code Playgroud)

请注意,密码不存在。然后它会提示您输入密码。然后我会输入它。这样您的密码就不会登录到服务器命令行历史记录中。

这是一项基本的安全措施。

如果不考虑安全性,我会暂时删除数据库用户的密码。然后导入后 - 重新添加它。

这样,您可能拥有的共享相同密码的任何其他帐户都不会受到损害。

在您的 shell 脚本中,您似乎也没有等待/检查您尝试导入的文件是否确实存在。Perl 脚本可能尚未完成。

  • 您错过了问题的“自动”部分,暂时删除密码是一个非常糟糕的主意。 (2认同)

Poi*_*ars 5

你忘了-p--password=(后者更易读):

mysql -h "$server_name" "--user=$user" "--password=$password" "--database=$database_name" < "filename.sql"
Run Code Online (Sandbox Code Playgroud)

(如果您确定您的凭据/名称不包含空格或shell特殊字符,则不需要引号.)

请注意,该联机帮助页也表示在命令行上提供凭据是不安全的.请遵循比尔关于my.cnf的建议.


小智 5

mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file
Run Code Online (Sandbox Code Playgroud)

(sql_script_file如果需要,使用完整路径)

如果要将输出重定向到文件

mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file > out_file
Run Code Online (Sandbox Code Playgroud)