mysqld_safe是MySQL安装包中自带的bash脚本,主要功能是启动并监控mysqld进程。源码位于scripts/mysqld_safe.sh。在Linux部署中,推荐使用mysqld_safe来启动MySQL数据库。通过命令执行mysqld_safe,系统将启动一个mysqld_safe进程和一个mysqld进程,mysqld_safe负责配置参数,如my.cnf路径、basedir、错误日...
MySQL · 源码分析 · mysqld_safe的代码考古
mysqld_safe是MySQL安装包中自带的bash脚本,主要功能是启动并监控mysqld进程。源码位于scripts/mysqld_safe.sh。在Linux部署中,推荐使用mysqld_safe来启动MySQL数据库。
通过命令执行mysqld_safe,系统将启动一个mysqld_safe进程和一个mysqld进程,mysqld_safe负责配置参数,如my.cnf路径、basedir、错误日志和端口等。执行ps命令可查看这些信息。
mysqld_safe脚本大约有1000行代码,核心功能集中在200行左右,主要围绕mysqld进程和$pid_file。$pid_file记录了mysqld进程的PID,用于判断是否需要重启。
简化版的mysqld_safe逻辑如下(以8.0.28版本为例):脚本通过检查$pid_file文件,判断mysqld是否正常运行。如果mysqld异常退出,脚本会等待指定时间(从$pid_file.wait文件中读取),然后重新启动。
为PolarDB增加高可用演练功能时,利用了mysqld_safe的一个小hack。通过SQL命令注入crash信号并记录等待时间,然后调整mysqld_safe的逻辑,使其在指定时间后重启,真实模拟了进程crash场景。
线上曾遇到一个bug,当某台机器的mysqld故障时,同一宿主机的其他mysqld也被自动重启。分析发现是mysqld_safe的命令在执行过程中误杀了其他mysqld进程,原因在于进程权限未隔离。修复方法是增加进程权限隔离,确保容器间互不可见。
总结,mysqld_safe是一个关键的MySQL管理工具,理解其代码逻辑对于运维和故障排查至关重要。通过代码分析和实际应用,可以提高对MySQL部署和维护的效率。2024-11-07