原因总结:systemd在启动mysqld过程中,由于缺少参数MAIN PID,执行失败。在mysqld.pid文件存在且进程确实运行时,系统认为mysqld仍在启动中。systemd在forking模式下,通过子进程PID判断服务是否启动成功。若子进程启动失败或意外退出,则认为服务未启动。在执行ExecStartPost时,子进程ID为31036的mysqld已...
MySQL 通过 systemd 启动时 hang 住了……
面对MySQL通过systemd启动时挂起的问题,本文深入分析了现象、原因、排查过程以及解决方法。
现象描述:启动命令长时间挂起,不成功返回,多次尝试无法复现。
原因总结:systemd在启动mysqld过程中,由于缺少参数MAIN PID,执行失败。在mysqld.pid文件存在且进程确实运行时,系统认为mysqld仍在启动中。systemd在forking模式下,通过子进程PID判断服务是否启动成功。若子进程启动失败或意外退出,则认为服务未启动。
在执行ExecStartPost时,子进程ID为31036的mysqld已通过kill命令终止,但后置shell缺少启动参数,导致MAIN PID 31036成为系统中的僵尸进程。
排查过程:检查内存、磁盘无异常,查看MySQL Error Log和systemctl status无直接信息。通过检查进程ID和mysqld.pid,获取线索。使用journalctl -u和/var/log/messages检查日志,发现内存错误可能与硬件问题相关。排除cgroup映射问题。尝试使用pstack观察systemd挂起位置,推测在后续步骤中可能被意外kill。
复现方式:调整systemd mysql service模板,增加mysqld启动后sleep10秒,模拟kill掉实例进程的场景。执行systemctl daemon-reload使变更生效。使用systemctl stop和start命令重新启动,解决问题。
本文为开源社区出品,原作者贲绍华,文章内容约2100字,预计阅读时间为7分钟。更多技术文章,欢迎访问:opensource.actionsky.com...
SQLE是一款全方位的SQL质量管理平台,支持开发至生产环境的SQL审核和管理,覆盖主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。2024-11-20