首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash脚本未运行MySQL命令

Bash脚本未运行MySQL命令
EN

Stack Overflow用户
提问于 2016-11-18 10:33:29
回答 2查看 1.8K关注 0票数 1

我在运行的bash脚本中有一个MySQL命令。在这个命令之前,我正在运行其他Linux命令行命令(实际上,其中一个命令甚至是mysql命令),但是当它运行到这个命令时,它就不起作用了:

代码语言:javascript
运行
复制
DEST_HOST="localhost"
DEST_DBNAME="db_name"
DEST_DBUSER="root"
DEST_DBPASS=""

# FILE NAME
MIGRATION_FILE="migration_database"

# Export/Import Commands
DO_DATABASE_UPDATE="mysql --host=$SOURCE_HOST --user=$DEST_DBUSER --password $DEST_DBNAME < $MIGRATION_FILE.sql"

echo 'Running local updates...'
$DO_DATABASE_UPDATE

echo "$DO_DATABASE_UPDATE"

# Done!
echo "Complete!"

我将migration_database.sql文件放在从中运行它的文件夹中。正如您所看到的,我将在所有内容的末尾打印出UPDATE命令。当我运行这个命令时,它就会打印在mysql菜单上,就像我运行mysql -I来获取帮助菜单一样。

如果我复制并粘贴打印出来的命令并运行它,它会工作得很好。我不确定为什么bash不在脚本中执行此操作。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-11-18 10:42:53

一行来自Bash Shell的MySQL命令

使用以下命令从Linux Bash Shell快速执行MySQL查询:# mysql -u用户-ppass -e "mysql命令“

示例:

代码语言:javascript
运行
复制
# mysql -u root -pSeCrEt -e "show databases"

使用EOF从Bash脚本运行MySQL查询在运行MySQL命令的Bash脚本中使用以下语法:

代码语言:javascript
运行
复制
mysql -u [user] -p[pass] << EOF
[mysql commands]
EOF

示例:

代码语言:javascript
运行
复制
#!/bin/bash
mysql -u root -pSeCrEt << EOF
use mysql;
show tables;
EOF

远程执行MySQL命令使用-h选项指定MySQL服务器的IP地址:

代码语言:javascript
运行
复制
# mysql -h [ip] -u [user] -p[pass] -e "[mysql commands]"

示例:

代码语言:javascript
运行
复制
# mysql -h 192.168.1.10 -u root -pSeCrEt -e "show databases"

指定要使用的数据库

代码语言:javascript
运行
复制
Use -D option to specify the name of MySQL database :
# mysql -D [db name] -u [user] -p[pass] -e "[mysql commands]"

示例:

代码语言:javascript
运行
复制
# mysql -D clients -u root -pSeCrEt -e "show tables"
票数 2
EN

Stack Overflow用户

发布于 2016-11-18 10:40:33

代码语言:javascript
运行
复制
... --password $DEST_DBNAME

您不需要传递数据库密码。您只需使用不带参数的--password选项,即“提示我键入密码”。如果在非交互式shell中运行此脚本,您将永远不会看到提示。

您可以将密码设置为参数:

代码语言:javascript
运行
复制
... --password='$DEST_DBPASS' $DEST_DBNAME

或者实际上,我建议您根本就不要在命令行中输入用户名和密码,因为这不是一个好的安全习惯。

相反,将用户名和密码放在一个配置文件中,并告诉您的命令使用该配置文件。

代码语言:javascript
运行
复制
DO_DATABASE_UPDATE="mysql --defaults-extra-file=$HOME/migration.cnf $DEST_DBNAME < $MIGRATION_FILE.sql"

在您的migration.cnf中:

代码语言:javascript
运行
复制
[client]
host = localhost
user = root
password = xxxxxxxx

如果您使用的是MySQL 5.6或更高版本,则还应了解mysql_config_editor,以便可以将这些帐户凭据存储在加密文件中。

请回复您的评论:

在bash变量的命令中使用小于号有什么问题吗?

是的,有一个问题。shell进程重定向中的求值顺序似乎是在变量展开之前。我很抱歉之前没有注意到这一点。

如果我要写你的脚本,我会这样写:

代码语言:javascript
运行
复制
DO_DATABASE_UPDATE="mysql ...opts..."
echo 'Running local updates...'
$DO_DATABASE_UPDATE $DEST_DBNAME < $MIGRATION_FILE.sql

或者这样做:

代码语言:javascript
运行
复制
DO_DATABASE_UPDATE="mysql ...opts... $DEST_DBNAME -e 'source $MIGRATION_FILE.sql'"
echo 'Running local updates...'
$DO_DATABASE_UPDATE
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40668462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档