mysql - 有没有什么好的方法检测MySQL是 "ready?"

标签 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

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

  • 轮询闻起来很有趣,
  • 我对 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/

相关文章:

mysql - 如何获取mysql中插入的最新数据?

javascript - 使用 javascript 显示某个套餐的值(value)(价格)

php - 在一个简单的 CMS 上工作——如何处理用户的访问权限?

mysql - 查找在另一个表中没有对应行的列

java - 如何在 java webapp 中的服务器上保存和检索图像

javascript - 检查MySQL数据是否已存在,如果不存在则INSERT。 [PHP+jQuery Ajax]

MySQL 查询 - 使用订单/计数更新字段,但根据另一个字段再次从 1 开始

mysql - 需要根据 Group_concat 的结果连接两个表

mysql - 列不能为空 - 过程

php - 使用php检查IP地址