
技术分享 | kill掉mysqld_safe进程会影响mysqld进程?
1、背景
公司内部看到一则问题
1、kill -9 mysqld_safe 进程
2、systemd 检测到 mysqld_safe 进程不存在后,重新拉起 mysqld_safe 进程
3、mysqld_safe 进程启动后,发现 mysqld 进程也被重启
期望:启、停 mysqld_safe 进程,不会影响 mysqld 进程
2、systemd 服务启动
2.1、复现问题
1)、查看数据库服务状态
2)、kill -9 mysqld_safe
进程,并再次查看数据库服务状态
确实在 kill -9 mysqld_safe
后,重新拉起了 mysqld_safe 和 mysqld 进程(它们的 PID 和之前不一样)
3)、查看数据库错误日志
4)、查看 service 文件
2.2、分析原因
1)、查看进程信息
mysqld_safe:PID(进程 ID)=PGID(进程组 ID)=SID(会话 ID),说明它是会话首进程,也是该进程组的组长
mysqld_safe 的 PID(进程 ID)=mysqld 的 PPID(父进程 ID),说明 mysqld_safe 是 mysqld 的父进程
kill -9 mysqld_safe (会话首进程),会向该进程组的每一个进程发送 SIGKILL,导致组中的进程被中止
2)、整体流程
- mysqld_safe 是会话首进程,kill -9 mysqld_safe,导致组中所有进程被 kill
- systemd 检测到 mysqld_safe 异常退出,
Restart=on-failure
触发重新拉起 mysqld_safe - mysqld_safe 拉起子进程 mysqld
3、mysqld_safe 命令启动
1)、使用 mysqld_safe 启动数据库
2)、查看进程信息
PID≠SID,不是会话首进程
PGID≠TPGID,是后台进程组
mysqld_safe 的 PID=mysqld 的 PPID,说明 mysqld_safe 是 mysqld 的父进程
3)、kill -9 mysqld_safe 进程,并再次查看进程信息
kill -9 mysqld_safe (非会话首进程),不影响同组的进程(mysqld),此时 init 进程会自动领养 mysqld 进程
4)、重新启动 mysqld_safe 进程,并再次查看进程信息
mysqld_safe 退出,原因是已存在 mysqld 进程
4、总结
- mysqld_safe 进程和 mysqld 进程是父子进程关系
- systemd 服务启动,kill 父进程(会话首进程),会导致子进程也退出
- mysqld_safe 命令启动,kill 父进程(非会话首进程),不会导致子进程退出;重新启动父进程,报错子进程已存在
- 可以使用mysqld_safe命令启动 + 改造mysqld_safe脚本,实现【启、停mysqld_safe进程,不会影响mysqld进程】。此时不要混合使用systemd启动数据库,需要维护这个特殊的mysqld_safe
Enjoy GreatSQL :)
文章转载自公众号:GreatSQL社区
