繁体   English   中英

Bash脚本未运行MySQL命令

[英]Bash Script not running MySQL Command

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

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 -I以获得帮助菜单一样,仅打印在mysql菜单上。

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

有任何想法吗?

... --password $DEST_DBNAME

您没有通过数据库密码。 您只需使用不带参数的--password选项,即“提示我输入密码”。 如果在非交互式外壳中运行此脚本,则永远不会看到提示。

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

... --password='$DEST_DBPASS' $DEST_DBNAME

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

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

DO_DATABASE_UPDATE="mysql --defaults-extra-file=$HOME/migration.cnf $DEST_DBNAME < $MIGRATION_FILE.sql"

在您的migration.cnf中:

[client]
host = localhost
user = root
password = xxxxxxxx

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


发表您的评论:

在bash变量中使用小于号登录命令是否存在一些问题?

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

如果我正在编写您的脚本,则可以这样编写:

DO_DATABASE_UPDATE="mysql ...opts..."
echo 'Running local updates...'
$DO_DATABASE_UPDATE $DEST_DBNAME < $MIGRATION_FILE.sql

否则这种方式:

DO_DATABASE_UPDATE="mysql ...opts... $DEST_DBNAME -e 'source $MIGRATION_FILE.sql'"
echo 'Running local updates...'
$DO_DATABASE_UPDATE

从Bash Shell一行执行MySQL命令

使用以下命令从Linux Bash Shell快速执行MySQL查询:#mysql -u [用户] -p [pass] -e“ [mysql命令]”

范例:

# mysql -u root -pSeCrEt -e "show databases"

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

mysql -u [user] -p[pass] << EOF
[mysql commands]
EOF

范例:

#!/bin/bash
mysql -u root -pSeCrEt << EOF
use mysql;
show tables;
EOF

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

# mysql -h [ip] -u [user] -p[pass] -e "[mysql commands]"

范例:

# mysql -h 192.168.1.10 -u root -pSeCrEt -e "show databases"

指定要使用的数据库

Use -D option to specify the name of MySQL database :
# mysql -D [db name] -u [user] -p[pass] -e "[mysql commands]"

范例:

# mysql -D clients -u root -pSeCrEt -e "show tables"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM