我不是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
这似乎有效(!)但有多个问题:
/tmp/mysql.sock
是否很聪明。然而,它比尝试(例如)消费和解析mysqld_safe
的stdout(或者是stderr?)以确定服务器是否已经启动要容易得多。
我的一个狭隘的问题是,是否有一种方法可以发出阻塞启动mysqld
:我可以发出任何阻塞直到数据库启动的命令,然后退出(和分离,可能会留下一个PID)文件),并有一个伴侣停止命令? (或者可能允许我读取PID文件并发出我自己的SIGTERM?)
我更广泛的问题是,我是在正确的轨道上,还是有一些完全不同的和更容易的(为了#34;更容易"对我而言,它必须是轻量级的;我不是那样的有兴趣安装一堆工具,如Puppet或DbMaintain / Liquibase或其他任何方法来解决我所阐述的问题?也就是说,从包含MySQL的.gz
文件开始,安装用户区MySQL并初始化数据库?
答案 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