Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL关闭,kill还是kill -9 ?

MySQL关闭,kill还是kill -9 ?

作者头像
AsiaYe
发布于 2022-04-01 11:28:51
发布于 2022-04-01 11:28:51
3.6K00
代码可运行
举报
文章被收录于专栏:DBA随笔DBA随笔
运行总次数:0
代码可运行

MySQL关闭,kill还是kill -9?

某一天的中午,测试了MySQL关闭的一个小场景,简单分析一下。

01

背景

背景介绍

线上某个MySQL实例需要关停,跟同事沟通了一下关停MySQL的方法。常见的关停MySQL实例的方法有:

1、利用mysqladmin工具关停;

2、如果是MySQL5.7及以上版本,利用shutdown命令关停,当然MySQL8.0版本还支持restart命令来重启

3、利用Linux的kill命令来kill MySQL对应的进程号关停

脚本里面更多的是使用mysqladmin工具,实际操作中,使用后面2种方法居多。

今天我们主要看下kill命令对MySQL的影响。

02

测试

MySQL启动的时候,一般来讲有一个调用关系,mysql.server调用mysqld_safe,mysqld_safe调用mysqld,其中:

1、mysql.server是mysql安装目录support_file下的一个文件,它调用了mysqld_safe;

2、mysqld_safe是一个守护进程,守护mysqld进程,在mysqld进程异常退出的时候,自动将mysqld进程拉起来;

3、mysqld是真正的mysql服务进程

一般我们通过service mysql.server start来启动MySQL进程,或者通过手工mysqld_safe命令行的办法来启动MySQL进程,启动完成的进程,通常如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@yeyz ~]# ps -ef|grep mysql
root     22899 22820   00:00:00 grep --color=auto mysql
root     30344     1   00:00:00 /bin/sh /usr/local/mysql-8.0.22/bin/mysqld_safe --defaults-file=/data1/mysql_4307/my.cnf
mysql    31513 30344   00:09:32 /usr/local/mysql-8.0.22/bin/mysqld --defaults-file=/data1/mysql_4307/my.cnf --basedir=/usr/local/mysql-8.0.22 --datadir=/data1/mysql_4307/data --plugin-dir=/usr/local/mysql-8.0.22/lib/plugin --user=mysql --log-error=/data1/mysql_4307/log/mysql.err --open-files-limit=16384 --pid-file=/data1/mysql_4307/tmp/mysql.pid --socket=/data1/mysql_4307/tmp/mysql.sock --port=4307

可以看到:

有一个pid为30344的mysqld_safe进程;

有一个pid为31513的mysqld进程,mysqld进程的父进程是30344这个mysqld_safe进程

此时我们利用kill命令停止mysqld进程,怎么做???使用kill命令还是kill -9 命令???这俩命令有啥区别???我们一起看一下。

先来看kill命令

我们kill命令kill掉31513这个进程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@yeyz ~]# kill 31513
[root@yeyz ~]# ps -ef|grep mysql
root     22951 22820  0 23:19 pts/0    00:00:00 grep --color=auto mysql

可以看到,kill命令,kill掉了31513进程,mysqld进程不存在了,而mysqld_safe这个守护进程,没有将mysqld进程再度拉起。

再来看kill -9 命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@yeyz ~]# ps -ef|grep mysql
root     23051 22820 00:00:00 /bin/sh /usr/local/mysql-8.0.22/bin/mysqld_safe --defaults-file=/data1/mysql_4307/my.cnf
mysql    24141 23051 00:00:00 /usr/local/mysql-8.0.22/bin/mysqld --defaults-file=/data1/mysql_4307/my.cnf --basedir=/usr/local/mysql-8.0.22 --datadir=/data1/mysql_4307/data --plugin-dir=/usr/local/mysql-8.0.22/lib/plugin --user=mysql --log-error=/data1/mysql_4307/log/mysql.err --open-files-limit=16384 --pid-file=/data1/mysql_4307/tmp/mysql.pid --socket=/data1/mysql_4307/tmp/mysql.sock --port=4307
# 手工kill
[root@yeyz ~]# kill -9 24141
[root@yeyz ~]# /usr/local/mysql-8.0.22/bin/mysqld_safe: line 199: 24141 Killed                  
2022-03-28T15:20:25.159403Z mysqld_safe Number of processes running now: 0
2022-03-28T15:20:25.163726Z mysqld_safe mysqld restarted

# 查看结果
[root@yeyz ~]# ps -ef|grep mysql
root     23051 22820  00:00:00 /bin/sh /usr/local/mysql-8.0.22/bin/mysqld_safe --defaults-file=/data1/mysql_4307/my.cnf
mysql    24232 23051  00:00:01 /usr/local/mysql-8.0.22/bin/mysqld --defaults-file=/data1/mysql_4307/my.cnf --basedir=/usr/local/mysql-8.0.22 --datadir=/data1/mysql_4307/data --plugin-dir=/usr/local/mysql-8.0.22/lib/plugin --user=mysql --log-error=/data1/mysql_4307/log/mysql.err --open-files-limit=16384 --pid-file=/data1/mysql_4307/tmp/mysql.pid --socket=/data1/mysql_4307/tmp/mysql.sock --port=4307

可以看到,kill -9命令,kill掉了24141进程,mysqld进程被kill掉了,但是mysqld-safe这个守护进程将mysqld再度拉起,新进程的pid是24232

03

总结

从这个测试中,可以得到如下规律:

1、使用kill命令,kill掉mysqld进程,mysqld_safe不会自动拉起mysqld进程;

2、使用kill -9 命令,kill掉mysqld进程,mysqld_safe会自动拉起mysqld进程

其实这说明,kill命令和kill -9命令的机制是不一样的,我们可以使用kill -l命令来查看kill命令的信号说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@yeyz ~]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

可以看到,kill的信号有64个。

我们使用kill -9 pid,也就是sigkill信号。

默认的kill命令,不带数字,相当于kill -15 pid,也就是sigterm信号。

当我们给一个进程发送sigterm信号的时候,进程受到这个信号之后,后续的工作是自己处理的,此时一般情况有三种:

1、继续执行程序,忽略kill信号;

2、进程释放掉相应的资源后关停进程;

3、立即停止进程

简单理解,就是进程自己决定使用哪一种方案来"优雅,安全的退出",一般进程都会进行资源回收,临时文件释放等工作,然后退出,如果这个过程中发生了阻塞,则进程会忽略kill操作,也就是我们经常遇到的“kill 不掉”的情况。

当我们给一个进程发送一个sigkill的信号的时候,这个信号要求进程立即停止,不允许出现阻塞或者被进程忽略的情况,一般进程来不及做"资源释放,临时文件回收"等工作,所以经常会带来一些副作用例如数据丢失等。这个方案要慎用。

从上面的描述,结合之前的知识储备,我们不难总结:

kill mysqld进程,本身是优雅、安全退出mysql的一种方法,所以mysqld_safe认为这个操作是被允许的;

相反,kill -9 mysqld进程,本身是一种粗暴退出mysql的方法,所以mysqld_safe认为这个操作是"意外的,计划外的",所以会帮我们拉起mysqld进程。

如果我们打开mysqld_safe文件,还可以看到如下的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while true
do
  xxxx
  if $dont_restart_mysqld; then
    if test ! -f "$pid_file"  # This is removed if normal shutdown
    then
      break
  xxxx
done

如果pid不存在(意味着正常关闭,删除了pid文件),则break,跳出这个监听循环。

如果pid存在(意味着非正常关闭,未删除pid文件),则继续监听mysqld进程

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL root密码忘记,原来还有更优雅的解法!
一直以来,对于MySQL root密码的忘记,以为只有一种解法-skip-grant-tables。
星哥玩云
2022/08/16
3130
MySQL的mysqld_safe和mysqld进程有何用?
MySQL启动会出现两个进程,mysqld_safe和mysqld,这俩进程有什么联系和区别?它们各自有什么作用?老杨写的这篇技术文章《技术分享 | kill掉mysqld_safe进程会影响mysqld进程?》做了一些讲解。
bisal
2023/12/10
1K0
MySQL的mysqld_safe和mysqld进程有何用?
MySQL的启动原理
我们知道mysql.server,mysqld_safe和mysqld都是可以用来启动mysql服务,他们之间是有区别的。这三个命令中,其中mysql.server和mysqld_safe是shell脚本写的,我们可以打开来查看里面的内容。下面我们看看这三种启动方法的区别:
AsiaYe
2019/11/06
2.2K0
技术分享 | kill掉mysqld_safe进程会影响mysqld进程?
确实在 kill -9 mysqld_safe 后,重新拉起了 mysqld_safe 和 mysqld 进程(它们的 PID 和之前不一样)
GreatSQL社区
2023/09/10
5260
技术分享 | kill掉mysqld_safe进程会影响mysqld进程?
MySQL如何找到使用的是哪个配置文件?
一个正在运行的MySQL实例,如何查看对应的配置文件用的是哪一个?如果存在多个文件,生效的顺序是怎么样的?
俊才
2024/01/22
6610
MySQL如何找到使用的是哪个配置文件?
MySQL之my.cnf配置文件
今天是中秋节之后的第一天,虽然身体来上班了,但是脑子还在放假。今天主要是把密码管理模块的代码推了一版,然后研究了一下mysql的my.cnf文件,简单总结一下。
AsiaYe
2019/11/06
4.6K0
MySQL之my.cnf配置文件
11.6 MariaDB安装
安装mariadb cd /usr/local/src wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz tar zxvf mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz mv mariadb-10.2.6-linux-glibc_214-x86_64
运维小白
2018/02/06
1.1K0
MySQL 数据库的启动与关闭
    MySQL数据库服务器通常指的的是mysqld,而命令行mysql则是mysql客户端程序,这两个概念通常容易混淆。通常启动mysql服务器即是启动mysqld进程,mysqld启动后,可以通过mysql连接到mysql服务器。本文主要描述了mysql服务器的几种启动方式以及如何关闭mysql服务器。
Leshami
2018/08/13
6.1K0
MYSQL多实例配置详解.md
Q:什么是MySQL多实例? 答:简单的说,就是在一台机器上开启多个不同的服务端口(如: 3306、 3307 ) ,运行多个 MysQL 服务进程,服务进程通过不同的 socket 监听不同的服务端口来提供各自的服务。
全栈工程师修炼指南
2022/09/28
1.7K0
MYSQL多实例配置详解.md
零基础安装MySQL 5.7数据库
官网MySQL有四个版本:GA版、DMR版、RC版、Beta版。一般生产和测试环境使用GA版(常规可用的版本,经过bug修复测试)
SEian.G
2021/03/03
2900
# 示例环境
​ 想必很多新手都避免不了有这些疑问,都想一次性投入精力解决以上问题,下面我用我理解的方式帮助你解决这些疑问。
用户1175783
2020/05/09
1.3K0
mysql多实例(多个配置文件方式)设置为多个服务单独管理启动停止
有个大佬搞了一套mysql多实例(多个配置文件方式),却没有任何管理方式,想重启还找 找pid , kill掉,再通过 mysql 指定配置文件启动,极度不方便,想做成。
用户2323866
2021/06/29
1.5K0
MySQL中的pid与socket是什么?
不知道你有没有注意过,MySQL 启动时需要配置 pid 及 socket 文件路径。偶尔还会出现因 pid 文件找不到而启动失败的现象,那么 pid 与 socket 文件究竟是干什么用的呢?我们一起来看下本篇文章。
MySQL技术
2021/07/05
2.2K0
Linux基础(day39)
11.1 LAMP架构介绍 LAMP架构介绍 LAMP架构包含了 Linux+Apache(httpd)+MySQL+PHP ,简称LAMP Linux是操作系统,比如centos,Ubuntu都是linux操作系统 Apache提供web服务软件,其真正名字为 httpd,习惯称之为Apache MySQL存储软件,存的是数据、字符串,不是图片 PHP是脚本语言,和shell相似,但比shell复杂,PHP是由 C语言 开发的,通常用于做网站(主要); 目前由于移动网络的影响,PHP现在不怎么受欢迎
运维小白
2018/02/06
7510
Linux基础(day39)
MySQL 备份恢复(二)
前面一篇已经介绍了MySQL 备份相关的原理与方法,要是还没有来得及看的可以戳此查看『MySQL 备份恢复(一)』,那么今天就接着上一篇的内容继续谈谈备份恢复相关内容。数据备份是 DBA 非常重要的工作之一,系统意外奔溃或者硬件损坏都可能导致数据库的数据丢失,因此 MySQL DBA 应该定期备份数据,使得意外发生时尽可能的减少损失。数据备份在工作中是重中之重,安全很重要。
JiekeXu之路
2019/06/20
2.7K0
MySQL 备份恢复(二)
MySQL单机多实例的配置笔记
    CentOS6.7x86_64【2.6.32-573.el6.x86_64】
保持热爱奔赴山海
2019/09/18
1.3K0
MySQL5.5版本部署的一个问题
目前公司部署MySQL是通过平台化操作的,周五的时候,平台暂时出了点儿问题,手上有个需求比较着急,就直接手动的部署了一下,由于好长时间没有部署环境了,竟然有些手生,这里把部署的步骤以及遇到的问题记录下来,希望对大家有所帮助。
AsiaYe
2019/11/06
1.3K0
数据库介绍(MySQL安装 体系结构、基本管理)
该文章介绍了如何通过MySQL Workbench 5.7.31在Windows 10上重置MySQL root密码。包括安装MySQL Workbench、运行MySQL命令行工具、查看MySQL服务器信息、通过命令行重置MySQL root密码、重载MySQL服务、登录MySQL数据库等步骤。
惨绿少年
2017/12/27
3K0
数据库介绍(MySQL安装 体系结构、基本管理)
MySQL 8 手动安装后无法启动的问题解决
首先的自我检讨与自我批评,最近有点懒,知识的更新慢,最近在更换系统到ubuntu 22.04 ,废弃centos ,同时MYSQL 都在8 以上,之前MySQL都是在CENTOS 7.5 上安装,并且也都自动化安装,基本上没有问题,但到了ubuntu 22.04 基于对于系统的不熟悉, 产生很多的问题。
AustinDatabases
2023/11/24
5730
MySQL 8  手动安装后无法启动的问题解决
MySQL部署之源码安装
所需要的依赖及安装MySQL的包 # yum -y update # yum -y groupinstall "Development Tools" # yum -y install gcc gcc-c++ ncurses ncurses-devel bison libgcrypt perl make cmake # wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.24.tar.gz 在系统中添加运行mysqld进程的用户
Cyylog
2020/08/19
1.6K0
相关推荐
MySQL root密码忘记,原来还有更优雅的解法!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验