我不是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
Run Code Online (Sandbox Code Playgroud)
这似乎工作(!)但有多个问题:
/tmp/mysql.sock是否很聪明.然而,它比尝试(例如)消费和解析stdout(或者是stderr?)mysqld_safe来判断服务器是否已经启动要容易得多.
我的一个狭隘的问题是,是否有一种方法可以发出阻止启动mysqld:我可以发出任何阻塞直到数据库启动的命令,然后退出(并分离,可能会留下一个PID文件),并有一个伴随停止命令吗?(或者可能允许我读取PID文件并发出我自己的SIGTERM?)
我的更广泛的问题是,我是在正确的轨道上,还是有一些完全不同和更容易(对我来说"更容易"它必须是轻量级的;我对安装一堆像Puppet这样的工具不感兴趣DbMaintain/Liquibase或其他什么方法解决我所阐述的问题?也就是说,从.gz包含MySQL 的文件开始,安装userland MySQL并初始化数据库?
查看mysqld的init shell脚本.它们在一个名为wait_for_pid()的函数中进行轮询.
该函数检查pid文件是否存在,如果它还不存在,则休眠1整秒,然后再次尝试.超时默认为900秒,此时它会放弃等待,并断定它不会启动(并输出完全无用的消息"服务器退出而不更新PID文件").
您不必猜测pid文件的位置.如果你正在启动mysqld_safe,你应该使用该选项告诉它应该在哪里创建pid文件--pid-file.
一个棘手的部分是在mysqld初始化之前不会创建pid文件.如果必须使用InnoDB日志文件执行崩溃恢复,并且日志文件很大,则可能需要一段时间.因此,即使mysqld在超时后成功启动了一段时间,900秒的超时时间也不够长,并且会出现虚假错误.
您还可以读取错误日志或mysqld的控制台输出.它应该最终输出一条"准备连接"的行.
要读取直到你得到这一行,然后终止读取,你可以使用:
tail -f | sed -e '/ready for connections/q'
Run Code Online (Sandbox Code Playgroud)