如何从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文件上适当且紧密地设置。