如何通过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)
小智 111
使用以下语法:
mysql -u $user -p$passsword -Bse "command1;command2;....;commandn"
Run Code Online (Sandbox Code Playgroud)
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.
如果密码内容包含!
(感叹号),则应\
在其前面添加(反斜杠).
这个问题的核心已经多次回答了,我只是想我会补充一点反引号(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.
如前所述,您可以使用 -p 将密码传递到服务器。
但我推荐这个:
mysql -h "hostaddress" -u "username" -p "database-name" < "sqlfile.sql"
Run Code Online (Sandbox Code Playgroud)
请注意,密码不存在。然后它会提示您输入密码。然后我会输入它。这样您的密码就不会登录到服务器命令行历史记录中。
这是一项基本的安全措施。
如果不考虑安全性,我会暂时删除数据库用户的密码。然后导入后 - 重新添加它。
这样,您可能拥有的共享相同密码的任何其他帐户都不会受到损害。
在您的 shell 脚本中,您似乎也没有等待/检查您尝试导入的文件是否确实存在。Perl 脚本可能尚未完成。
你忘了-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)