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