在shell脚本中执行MySQL命令?

在shell脚本中执行MySQL命令?,mysql,shell,Mysql,Shell,我希望创建一个可以从终端运行的部署脚本,它可以从存储库自动部署我的站点。我确定的步骤是: 通过SSH连接到远程服务器 从远程存储库获取站点的最新版本 运行任何SQL修补程序 清理并退出 我已经在我的shell文件中放置了SSH连接和git pull命令,但是我一直使用的是MySQL,它本身就是一个(交互式的?)shell。因此,在我的文件中,我有: #!/bin/bash # connect to remote server via SSH ssh $SSH_USER@$SSH_HOST

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

  • 通过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
语句,读取要运行的最后一个补丁,然后运行任何必要的补丁

  • 如何在shell脚本中向
    mysql
    提示符发出
    SELECT
    语句
  • 那么正常的流量是多少?关闭连接并重新打开,将补丁文件作为输入传递?或者在一个连接中运行所有必需的修补程序
  • 我假设我将检查最后一个补丁文件,并对中间的补丁执行
    do
    循环

  • 非常感谢您的帮助。

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

    将mysql命令输入到文件中

    然后作为:
    mysql-u-p-h
    运行


    您还可以使用'-e'将查询放在mysql命令行上。将您的“select max(patch)from.”放入脚本中,并读取脚本中的输出。

    假设您希望在远程端完成所有业务:

    cat *.sql | mysql --user $MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DBNAME
    
    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
    

    ssh$ssh_USER@$ssh_HOST如何工作,因为我需要在文件系统上循环,解析补丁文件的内容,然后将它们作为MySQL语句执行?您将整个补丁文件作为输入。请看一下“mysqldump”的输出。但是补丁将是单个文件,而不是整个文件。比如说,要运行的最后一个修补程序可能是5.sql(如数据库表中所记录的),但我已经创建了6.sql和7.sql-因此我希望运行6.sql和7.sql。您需要按顺序运行每个修补程序吗?运行第一个查询以获取“最新的unrun补丁”,然后使用此输出循环这些补丁并按顺序运行它们。您的“取消运行补丁程序”可以是“可用补丁程序”和“为给定主机运行的补丁程序”之间的连接。选择“ifnull”(使其成为左连接)。这可能是一个很好的答案:*从另一个stackoverflow问题中,
    ssh
    命令也将为您提供一个交互式shell。您还需要将命令导入SSH,或者告诉它在远程计算机上执行特定的文件。