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.服务以及与大数据平台对接接口等应用,每次的发布和部署采用手工的方式进行.停止应用程序,拷贝发布包,启动应用程序,不停的循环着,并且时不时地会出现一些人为错误性问题.这种模式 ...
随机推荐
- 使用Spring MVC开发RESTful API(续)
使用多线程提高REST服务性能 异步处理REST服务,提高服务器吞吐量 使用Runnable异步处理Rest服务 AsyncController.java @RestController @GetMa ...
- DeepPrivacy: A Generative Adversarial Network for Face Anonymization阅读笔记
DeepPrivacy: A Generative Adversarial Network for Face Anonymization ISVC 2019 https://arxiv.org/pdf ...
- 基于surging网络组件多协议适配的平台化发展
前言 Surging 发展已经有快6年的时间,经过这些年的发展,功能框架也趋于成熟,但是针对于商业化需求还需要不断的打磨,前段时间客户找到我想升级成平台化,针对他的需求我 ...
- .NET Core 读取配置技巧 - IOptions<TOptions> 接口
原文链接:https://www.cnblogs.com/ysmc/p/16307804.html 在开发过程中,我们无法离开配置文件(appsetting.json),例如配置文件中有以下内容: { ...
- RMQ——ST表
ST表 ST表是一种解决RMQ问题的强有力工具, 可以做到O(nlogn)预处理,O(1)查询. st[i][j] 表示区间 [i, i + 2 ^ j - 1] 的最大值. 初值 st[i][0] ...
- Linux查看系统参数配置
Linux查看系统参数 1.查看内存(以GB为单位) [root@rac1 ~]# free -g total :内存总数,物理内存总数 used :已使用内存 free :空闲的内存数 shared ...
- C语言- 基础数据结构和算法 - 栈的链式存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- WPF第三方控件,只能输入数字型数据
话不多说,根据最近项目需求,为了减少输入验证等相关代码量,需要此控件 先上效果图 默认样式是这样,自己可以根据需求修改外形,但我更喜欢它自带的简洁版 有人可能会问怎么实现的呢?其实很简单,我们设置它的 ...
- 聊聊 RPA 方向的规划:简单有价值的事情长期坚持做
「简单有价值的事情长期坚持做」 这是成功最简单,但也最难学的秘诀.不经过训练,人很难意识到时间复利的威力. 仙剑奇侠传的「十里坡剑神」和金庸群侠传的「十级野球拳」,就是简单的事情持之以恒反复做,最后就 ...
- python小题目练习(十)
题目:根据生日判断星座 需求:实现如下图所示结果 代码展示: """Author:mllContent:根据生日判断星座Date:2020-11-23"&quo ...