有没有一种很好的方法来检测MySQL是“准备好了吗?”

时间:2014-10-24 16:03:41

标签: mysql

我不是MySQL专家。

我有一个安装MySQL的脚本,启动mysqld,然后使用mysql进行初始化。

目前,为了完成这项工作,我进入一个循环(为混合多种语言的伪代码道歉):

mysqld_safe /* ... */ & /* ampersand to start in background so we can continue */
while(fileDoesNotExist("/tmp/mysql.sock")) {
    sleepFor100ms();
}
mysql -u root /* and so forth */ initialize.sql

这似乎有效(!)但有多个问题:

  • polling闻起来很有趣,
  • 我对MySQL不够聪明,不知道查看硬编码路径名/tmp/mysql.sock是否很聪明。

然而,它比尝试(例如)消费和解析mysqld_safe的stdout(或者是stderr?)以确定服务器是否已经启动要容易得多。

我的一个狭隘的问题是,是否有一种方法可以发出阻塞启动mysqld:我可以发出任何阻塞直到数据库启动的命令,然后退出(和分离,可能会留下一个PID)文件),并有一个伴侣停止命令? (或者可能允许我读取PID文件并发出我自己的SIGTERM?)

我更广泛的问题是,我是在正确的轨道上,还是有一些完全不同的和更容易的(为了#34;更容易"对我而言,它必须是轻量级的;我不是那样的有兴趣安装一堆工具,如Puppet或DbMaintain / Liquibase或其他任何方法来解决我所阐述的问题?也就是说,从包含MySQL的.gz文件开始,安装用户区MySQL并初始化数据库?

2 个答案:

答案 0 :(得分:7)

查看mysqld的init shell脚本。它们在一个名为wait_for_pid()的函数中进行轮询。

该函数检查pid文件是否存在,如果它还没有存在,则睡眠1秒,然后再次尝试。超时默认为900秒,此时它会放弃等待,并断定它不会启动(并输出完全无用的消息"服务器退出而不更新PID文件&# 34。)

您不必猜测pid文件的位置。如果你正在启动mysqld_safe,你应该使用--pid-file选项告诉它应该在哪里创建pid文件。

一个棘手的部分是pid文件在mysqld初始化之前不会被创建。如果必须使用InnoDB日志文件执行崩溃恢复,并且日志文件很大,则可能需要一段时间。因此,900秒的超时时间不够长,即使mysqld在超时后成功启动,也会出现虚假错误。

您还可以阅读mysqld的错误日志或控制台输出。它应该最终输出一条表示"准备连接的线路。"

要读取此行,然后终止读取,您可以使用:

tail -f | sed -e '/ready for connections/q'

答案 1 :(得分:1)

您可以使用

mysqladmin -h localhost status

或使用wait-for-it

这样的纯bash解决方案
./wait-for-it.sh --timeout 10 -h localhost -p 3306