MySQL 启停过程了解一二
- GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
- GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
前言
你知道MySQL启停都做了些什么吗? 启动的时候初始化配置文件,读取redo配合binlog进行事务recover;停止的时候好像没有啥操作可做;印象中除了这些,就再没有了,至少在今天之前,我是这么认为的,我是真的肤浅。
今天就来聊一聊MySQL关于启停的常规操作。
停止过程
先说一下比较简单的停止过程

可以由具有shutdown权限的用户在客户端执行
shutdown命令关闭,或者是由mysqladmin shutdown关闭;如果是由客户端发起的shutdown,则需要创建单独的线程进行关闭后续操作;如果server是接收到SIGTERM信号(linix操作系统的kill命令产生的信号),则由接收到信号的线程执行关闭操作。需要注意的是,如果此时服务器内存使用非常高,可能会关闭失败,并将失败信息记录到error日志中。
:::block-1
说明:
SIGTERM 这个是shell命令kill默认的信号,进程收到此信号后,可以继续做一些处理然后再退出,具体的命令为kill pid 或者kill -15 pid,即这两个命令发出后,进程会安全的退出。
SIGKILL 这个是shell命令kill -9 pid发送的信号,进程接收到此信号后,会立即停止进程,无法按正常的退出流程执行。
因此,在linux操作系统中,如果使用kill命令停止MySQL服务,建议使用kill (-15) pid,而不是kill -9 pid,虽然kill -9能够快速停止,但是可能会对数据、文件造成破坏,导致数据库无法启动。
:::
关闭新的的连接请求,拒绝所有尝试通过TCP/IP、socket、pip、shared memory的建立的连接。
终止当前活跃进程。其操作方式是标记所有线程的状态为killed,和我们通过mysql client发出kill processlist_id一样,如果thread为sleep状态,线程很快就关闭。如果是正在运行语句的线程,并且是在事务中(比如innodb的dml),则会进行回滚;如果是非事务中的语句(比如myisam表的dml)则会终止,导致批量插入可能部分成功,SQL执行结果与预期不符。有一个特殊情况,如果实例是slave节点,会等待sql_thread线程执行完当前的组事务、SQL命令,以减少复制问题。
关闭server层、关闭存储引擎层。在这一步,会刷新表结构到磁盘,关闭所有打开的表,刷新LSN到表空间文件(ibd文件)。另外很重要的一点,对于innodb存储引擎,会将innodb_buff_pool中的部分内容刷新到磁盘(如果innodb_fast_down设置为2,则不会刷新innodb_buff_pool到磁盘)。
MySQL实例关闭成功,返回操作结果的状态码(0/1/2)。
如果是由shell发起了kill -9,第3、4、5步都不会有,直接跳过
启动过程
本章节本来是打算详细描述下MySQL的启动过程,但是能力有限,暂时只观察到以下大概的启动步骤

整个启动过程,其他步骤比较容易理解,唯独恢复innodb_buffer_pool这一步骤是以前不曾观察到的,今天就来重点聊一下它。
功能说明
为了避免重新启动MySQL服务后长时间的预热,特别是对于设置了比较大的innodb_buffer_pool_size的实例,可以在服务器关闭时保存buffer_pool内容,并在服务器启动时将buffer_pool恢复到关闭前的状态,避免数据库刚开始运行的一段时间内业务访问所有请求数据页都需要重新从磁盘上读取,减小数据库重启对系统带来的性能影响。
此功能在5.6版本引入,默认关闭;在5.7及之后的版本,就默认打开此功能。
参数说明
innodb_buffer_pool_dump_at_shutdown -- 控制在实例关闭时保存innodb_buffer_pool内容
innodb_buffer_pool_dump_pct -- 控制保存innodb_buffer_pool的完整度,默认25%,此参数是在5.7中增加。
innodb_buffer_pool_load_at_startup -- 控制在实例启动时加载上次关闭时保存的innodb_buffer_pool内容
使用介绍
一般来说,实例运行过程中会加载大量数据进入buffer_pool中,但是在保存innodb_buffer_pool内容时,并不会完整的保存所有数据,而是仅仅保存innodb_buffer_pool_dump_pct百分比的数据,按最近访问时间顺序保存,
数据可以在information_schema.INNODB_BUFFER_PAGE_LRU中查询到,保存的内容也仅仅是保存了SPACE_ID+PAGE_NUMBER,然后通过这两个属性组成的唯一值,到物理磁盘上获取完整数据,
保存的文件是在数据目录的ib_buffer_pool文件中,文件名是由innodb_buffer_pool_filename控制,可以看到相比innodb_buffer_pool_size的设置值,该文件非常小
[#3#root@greatdb81 /greatdb/dbdata/datanode4406/data 15:38:54]3 ll ib_buffer_pool
-rw-r-----. 1 greatdb greatdb 10555 5月 31 11:17 ib_buffer_pool
[#4#root@greatdb81 /greatdb/dbdata/datanode4406/data 15:39:00]4
由于在启动过程中,需要加载ib_buffer_pool文件的内容,还需要到对应数据文件中去读取完整用户记录,因此启动过程中会有比较大的IO消耗,但这个恢复是由单独的线程异步处理,并不会阻塞MySQL服务的正常启动。
下面对比了开、关参数对系统IO的影响时长,可以看到开启innodb_buffer_pool_load_at_startup=on,系统IO比较长的一段时间内处于ioutil为100%的情况


功能补充
MySQL还提供了一些功能,用于满足不同场景下对于innodb_buffer_pool导出、加载的使用
- 在MySQL运行过程中在线导出
SET GLOBAL innodb_buffer_pool_dump_now=ON;

- 在MySQL运行过程中手动加载
SET GLOBAL innodb_buffer_pool_load_now=ON;

- 查看导出进度
SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';

- 查看加载进度
SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

- 终止当前ib_buffer_pool加载
SET GLOBAL innodb_buffer_pool_load_abort=ON;

- 在数据库启动的error日志文件中,也有如下信息记录ib_buffer_pool加载动作

结束语
在MySQL启动过程中,因为有innodb_buffer_pool的load,可以让实例在端时间内恢复到重启前的状态,对于数据库系统的稳定有比较大的作用,但是由于加载需要消耗大量IO,可能会引起IO相关的问题,这是需要注意的。
停止MySQL,建议按正常命令执行shutdown,非常不推荐使用kill -9(我因为这个操作弄坏的数据库实例也不是一个两个了)。
整理过程中难免有错漏,还请各位同学多多包涵、多多指点。
最后附上参考资料
https://dev.mysql.com/doc/refman/8.0/en/server-shutdown.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-preload-buffer-pool.html
Enjoy GreatSQL
文章推荐:
面向金融级应用的GreatSQL正式开源
https://mp.weixin.qq.com/s/cI_wPKQJuXItVWpOx_yNTg
Changes in GreatSQL 8.0.25 (2021-8-18)
https://mp.weixin.qq.com/s/qcn0lmsMoLtaGO9hbpnhVg
MGR及GreatSQL资源汇总
https://mp.weixin.qq.com/s/qXMct_pOVN5FGoLsXSD0MA
GreatSQL MGR FAQ
https://mp.weixin.qq.com/s/J6wkUpGXw3YkyEUJXiZ9xA
在Linux下源码编译安装GreatSQL/MySQL
https://mp.weixin.qq.com/s/WZZOWKqSaGSy-mpD2GdNcA
关于 GreatSQL
GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/GreatSQL
GitHub:
https://github.com/GreatSQL/GreatSQL
Bilibili:
https://space.bilibili.com/1363850082/video
微信&QQ群:
可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群
QQ群:533341697
微信小助手:wanlidbc
本文由博客一文多发平台 OpenWrite 发布!
MySQL 启停过程了解一二的更多相关文章
- Mysql启停以及恢复备份恢复数据库
1.mysql启停 进入cmd 输入如下命令 net stop mysql(自己起的mysql名称) -------停 net strat mysql ---------------------- ...
- (oracle/mysql)启停,导入导出,DB字符集
==================================================================================== DB启动停止 ======== ...
- MySQL - 启停服务
Windows 环境 命令行方式 启动 MySQL 服务: net start mysql停止 MySQL 服务: net stop mysql 注:需要以管理员身份启动 cmd 后再执行上述命令. ...
- [sql]mysql启停脚本
写了个较为完善的mysql多实例的启动停止脚本. [root@lanny 3307]# cat mysql #!/bin/sh [ $# != 1 ]&&{ echo "US ...
- 为什么mysql 5.7.24启停不显示错误信息?log-error_verbosity参数
关键词:log-error_verbosity ,mysql启停没有信息,mysql启停不显示错误信息,mysql不显示启停信息 原因就是因为 log-error_verbosity = 2 被设置成 ...
- TDSQL-C 真·秒级启停:连接断了,又没断
你听过多少款无服务器架构(Serverless)数据库? 什么是Serverless呢?简单理解,Serverless 分为 FaaS 和 BaaS 两个部分,其中 FaaS 指的是函数即服务,Baa ...
- mysql自己编写启停脚本
一.场景 在实际生产环境中要求相对较高的企业对于root权限管控相对比较高,故而很多软件并非安装在root用户下(当然root用户权限也可管理,但正常情况下root权限并不会给业务使用方,而会给一个普 ...
- Oracle BIEE启停脚本
作为BI的开发人员,经常启停BI服务在所难免,启动的过程又比较长,命令需要不同目录切换,简直烦死人呢, 特意整理了linux中的启动脚本,将以下脚本存成biee.sh,后面的过程就相当简单了, 启动: ...
- TFS2017持续发布中调用PowerShell启停远程应用程序
目前团队项目中有多个Web.服务以及与大数据平台对接接口等应用,每次的发布和部署采用手工的方式进行.停止应用程序,拷贝发布包,启动应用程序,不停的循环着,并且时不时地会出现一些人为错误性问题.这种模式 ...
随机推荐
- 第06组Alpha冲刺(3/6)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2.鲍凌函 3.曾丽莉 4. 曹兰英 5. 方梓涵 6.董翔云 7.杜筱 8.黄少丹 9. 詹鑫冰 10.吴沅静 1.3 冲刺成果展示 1.1 ...
- Python报错 ImportError: DLL load failed while importing win32api: %1 不是有效的 Win32 应用程序 的解决方法
今天在用jupyter notebook 的时候发生了kernel error,点开之后提示了以下报错信息 Traceback (most recent call last): File " ...
- 编程技巧│浏览器 Notification 桌面推送通知
目录 一.什么是 Notification 二.弹窗授权 三.弹窗使用 四.浏览器支持检测 五.授权回调 六.3秒后关闭弹窗 一.什么是 Notification Notification 是浏览器最 ...
- NCF 的Azure Cosmos DB 演示案例
简介 NCF想必看过我之前发的NCF的文章的同学们都已经很熟悉了 今天我们要来聊一聊的是NCF遇到Azure Cosmos DB后会碰撞出什么样的火花,让我们一起往下看 我们先来说说什么是Azure ...
- SpringCloud Alibaba整合Sentinel
SpringCloud Alibaba整合Sentinel Sentinel 控制台 1. 概述 Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理.监控(单机和集群),规则 ...
- 测试人员假装自己会“devops”
目录 什么是DevOps DevOps岗位职责 DevOps的要求 如何增强DevOps能力 准备 服务器端安装jenkins Jenkins jenkins + maven 构建 jenkins下m ...
- Python基于周立功ZCANPRO开发刷写脚本
一.概述 1.背景 本文章主要是记录用Python基于周立功ZCANPRO开发VIN和SN码刷写工具. 2.环境搭建 Python3.8.10 32位(必须) 周立功上位机:ZCANPRO 周立功CA ...
- Proxmox6.2简单配置
刻录: 使用rufus+GPT+DD方式写入U盘 一.更换国内源: 1)删除企业源 mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/so ...
- python+tkinter 的布局
from tkinter import * win = Tk() win.title("布局") # #窗口标题 win.geometry("600x500+200+20 ...
- Maven3 入门到入门
Maven3 Core Overview Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model,POM) ,一组标准集合,一个项目生命周期(Project ...