【问题标题】:Executing MySQL commands in shell script?在 shell 脚本中执行 MySQL 命令?
【发布时间】:2012-12-22 09:30:29
【问题描述】:

我希望创建一个可以从终端运行的部署脚本,它会自动从存储库部署我的站点。我确定的步骤是:

  • 通过 SSH 连接到远程服务器
  • 从远程存储库获取最新版本的站点
  • 运行任何 SQL 补丁
  • 清理并退出

我已经在我的 shell 文件中放置了 SSH 连接和git pull 命令,但我坚持的是 MySQL,它本身就是一个(交互式?)shell。所以在我的文件中我有:

#!/bin/bash

# connect to remote server via SSH
ssh $SSH_USER@$SSH_HOST

# update code via Git
git pull origin $GIT_BRANCH

# connect to the database
mysql --user $MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DBNAME

# run any database patches
# disconnect from the database
# TODO
exit 0

如您所见,我正在连接数据库,但不确定如何执行任何 MySQL 语句。

目前,我有一个目录,其中包含按数字顺序排列的 SQL 补丁。所以 1.sql2.sql 等等。然后在我的数据库中,我有一个表,它只记录要运行的最后一个补丁。所以我需要做一个SELECT 语句,读取要运行的最后一个补丁,然后运行任何必要的补丁。

  1. 如何在我的 shell 脚本中向 mysql 提示符发出 SELECT 语句?
  2. 那么正常的流程是什么?关闭连接并重新打开它,将补丁文件作为输入传递?还是在一个连接中运行所有必需的补丁?
  3. 我假设我将检查最后一个补丁文件,并为中间的任何补丁执行do 循环?

非常感谢您的帮助。

【问题讨论】:

  • 这对你来说可能是一个很好的答案:How to execute Mysql command from a shell script? * 来自另一个 stackoverflow 问题
  • ssh 命令也会给你一个交互式的shell。您还需要将命令通过管道传输到 SSH,或者告诉它在远程计算机上执行特定文件。

标签: mysql shell


【解决方案1】:

假设您想在远程完成所有业务:

ssh $SSH_USER@$SSH_HOST << END_SSH
git pull origin $GIT_BRANCH
mysql --user $MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DBNAME << END_SQL
<sql statements go here>
END_SQL
END_SSH

【讨论】:

    【解决方案2】:

    您可以使用 Perl 或类似工具从 mysql 获取输出。这可以用来做你的控制流。

    将您的 mysql 命令放入一个文件中,就像您输入它们一样。

    然后运行为:mysql -u &lt;user&gt; -p -h &lt;host&gt; &lt; file.sqlcommands

    您还可以使用“-e”在 mysql 命令行上进行查询。把你的'select max(patch) from .'并阅读脚本中的输出。

    【讨论】:

    • 这将如何工作,因为我需要遍历文件系统,解析我的补丁文件的内容,然后将它们作为 MySQL 语句执行?
    • 你把整个补丁文件作为输入。看看 'mysqldump' 的输出看看。
    • 但补丁将是单个文件,而不是一个完整的文件。比如说,要运行的最后一个补丁可能是 5.sql(记录在数据库表中),但我已经创建了 6.sql 7.sql — 我希望运行 6.sql7.sql
    • 您需要按顺序运行每个补丁吗?运行第一个查询以获取“最新的未运行补丁”,然后使用此输出循环这些并按顺序运行它们。您的“未运行补丁”可能是“可用补丁”和“为给定主机运行的补丁”之间的连接。选择“ifnull”(使其成为左连接)。
    【解决方案3】:
    cat *.sql | mysql --user $MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DBNAME
    

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多