【问题标题】:Bash Script not running MySQL CommandBash 脚本未运行 MySQL 命令
【发布时间】:2016-11-18 02:33:29
【问题描述】:

我正在运行的 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 菜单上,就像我运行 mysql -I 以获取帮助菜单一样。

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

有什么想法吗?

【问题讨论】:

    标签: mysql linux bash


    【解决方案1】:

    一行中来自 Bash Shell 的 MySQL 命令

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

    例子:

    # 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"
    

    【讨论】:

      【解决方案2】:
      ... --password $DEST_DBNAME
      

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

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

      ... --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
      

      【讨论】:

      • 我在我的 Mac 上从终端运行它,所以我猜这就是它没有提示我的原因?那肯定是问题所在,我没有意识到是这样。我一定会试试这个。我喜欢 conf 文件解决方案。当我回到我的电脑时,我会告诉你我发现了什么。感谢您的快速回复!
      • 我一直在玩这个,它不想运行更新脚本。它将运行到&lt; 字符,但随后不起作用。如果我将它从变量声明中分离出来,它会起作用,或者如果我在&lt; 处停止变量声明并像$DO_DATABASE_UPDATE &lt; $MIGRATION_FILE.sql 那样做它会起作用。在 bash 变量中使用小于号登录命令是否存在问题?
      猜你喜欢
      • 1970-01-01
      • 2013-12-07
      • 2016-11-15
      • 1970-01-01
      • 2020-01-02
      • 2015-01-09
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多