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

我怎样才能通过一个shell脚本执行一个SQL命令,以便我可以使其自动化?

我想用一个shell脚本来恢复我在一个SQL文件中收集的数据。 我想连接到服务器并恢复数据。 该命令在通过SSH命令行单独执行时起作用。

这是我使用的命令:

mysql -h "server-name" -u root "password" "database-name" < "filename.sql" 

这是创build文件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 

什么是正确的方法来做到这一点?

您需要使用-p标志来发送密码。 这是棘手的,因为你必须在-p和密码之间没有空格。

 $ mysql -h "server-name" -u "root" "-pXXXXXXXX" "database-name" < "filename.sql" 

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

 $ 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' 

实际上,我更喜欢把用户名和密码保存在〜/ .my.cnf中,所以我不必把它放在命令行上:

 [client] user = root password = XXXXXXXX 

然后:

 $ mysql -h "server-name" "database-name" < "filename.sql" 

重新评论:

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

另外,当我正在解决shell脚本故障时,我使用-x标志,以便我可以看到它是如何执行每个命令的:

 $ bash -x myscript.sh 

使用这个语法:

 mysql -u $user -p$passsword -Bse "command1;command2;....;commandn" 

所有以前的答案都很好。 如果它是一个简单的,你想运行的一行SQL命令,你也可以使用-e选项。

 mysql -h <host> -u<user> -p<password> database -e \ "SELECT * FROM blah WHERE foo='bar';" 

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

 mysql --host= localhost --user=root --password=xxxxxx -e "source dbscript.sql" 

如果您使用主机作为本地主机,则不需要提及它。 你可以使用这个:

 mysql --user=root --password=xxxxxx -e "source dbscript.sql" 

这应该适用于Windows和Linux。

如果密码内容包含! (感叹号),你应该在它前面添加一个\ (反斜杠)。

这个问题的核心已经被回答了好几次了,我只是想补充一点,在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;" 

当然,除非您信任用户input,否则不应该通过串联的用户input(传递的参数)来生成SQL。将它放在另一种支持参数的脚本语言中/正确地转义string以便插入进入MySQL。

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

但是我推荐这个:

 mysql -h "hostaddress" -u "username" -p "database-name" < "sqlfile.sql" 

注意密码不在那里。 它会提示你input密码。 我会然后键入它。以便您的密码不logging到服务器命令行历史logging。

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

如果安全不是问题,我只是暂时从数据库用户中删除密码。 然后在导入之后 – 重新添加它。

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

它也似乎在你的shell脚本中,你并没有等待/检查你试图导入的文件是否存在。 perl脚本可能尚未完成。

 mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file 

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

如果你想redirect到一个文件

 mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file > out_file 

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

 mysql -h "$server_name" "--user=$user" "--password=$password" "--database=$database_name" < "filename.sql" 

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

请注意,联机帮助页也指出,在命令行上提供凭据是不安全的。 所以按照比尔关于my.cnf的build议。

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

如何使用安全密码执行命令行? 使用configuration编辑器!

从MySQL 5.6.6开始,您可以将密码存储在configuration文件中,然后执行cli命令,如下所示。

 mysql --login-path=storedPasswordKey .... 

–login-pathreplacevariables…主机,用户和密码。 优秀的权利!

 #!/bin/sh #Procedures = update #Scheduled at : Every 00.05 v_path=/etc/database_jobs v_cnt=0 MAILTO="indd@abc.in joanson@abc.in sturt@abc.in" touch "$v_path/db_db_log.log" #test mysql -uusername -ppassword -h111.111.111.111 db_name -e "CALL functionName()" > $v_path/db_db_log.log 2>&1 if [ "$?" -eq 0 ] then v_cnt=`expr $v_cnt + 1` mail -s "db Attendance Update has been run successfully" $MAILTO < $v_path/db_db_log.log else mail -s "Alert : db Attendance Update has been failed" $MAILTO < $v_path/db_db_log.log exit fi 

从cron中使用的shell脚本访问mysql的一个重要考虑因素是,mysql会查看login用户以确定要加载的.my.cnf。

这不适用于cron。 如果您使用的是su / sudo,也可能会感到困惑,因为login用户可能不是您正在运行的用户。

我使用类似于:

 mysql --defaults-extra-file=/path/to/specific/.my.cnf -e 'SELECT something FROM sometable' 

只要确保用户和组的所有权和权限在.my.cnf文件上适当且紧密地设置。