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.服务以及与大数据平台对接接口等应用,每次的发布和部署采用手工的方式进行.停止应用程序,拷贝发布包,启动应用程序,不停的循环着,并且时不时地会出现一些人为错误性问题.这种模式 ...
随机推荐
- 142_Power BI之同比预测
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最近刚好在做一个简单同比预测的模型,预测方法很简单,就是累计同比预测,把MTD展示出来. [video widt ...
- df-查看磁盘目录空间大小
查看磁盘分区挂载情况. 语法 df [option] 选项 -T 显示文件系统类型. -h 带单位显示. 示例 [root@localhost ~]# df -Th Filesystem Type S ...
- java接口多实现注入方法总结
1. 单实现接口注入方法 1.1 构造注入(推荐) @RequiredArgsConstructor public class TestController { // 其只有一个具体的实现类 priv ...
- CSP-J游记
祝大家 CSP-J/CSP-S 稳过第一轮 ~(- ∨ -)~ ~~ 建议扩大110%食用 ~~ 中秋快乐鸭(希望大家不会收到损友送的砖头月饼 : − ) :-) :−)) 咳咳,昨天是我们可爱初赛来 ...
- SmartIDE v0.1.18 已经发布 - 助力阿里国产IDE OpenSumi 插件安装提速10倍、Dapr和Jupyter支持、CLI k8s支持
SmartIDE v0.1.18 (cli build 3538) 已经发布,在过去的Sprint 18中,我们集中精力推进对 k8s 远程工作区 的支持,同时继续扩展SmartIDE对不同技术栈的支 ...
- JavaScript之parseInt()方法
parseInt(string, radix):用于解析一个字符串并返回指定基数的十进制整数或者NaN string参数为被解析的值,如果该值不是一个字符串,则会隐式的使用toString()方法转化 ...
- 『忘了再学』Shell基础 — 30、sed命令的使用
目录 1.sed命令说明 2.行数据操作 (1)查看文件中的数据 (2)删除文件中的数据 (3)向文件中追加数据 (4)向文件中插入数据 (5)修改文件中的多行数据(删除,追加,插入) (6)替换文件 ...
- mac M1 php扩展 xlswriter 编译安装爬坑记录
电脑配置 MacBook Pro(14英寸,2021年) 系统版本 macOS Monterey 12.4 芯片 Apple M1 Pro PHP环境 MAMP Pro Version 6.6.1 ( ...
- JS:表达式
js代码的形式: 1.直接量 2.表达式 3.语句 1; "a"; true; null; var a; function fn(){}; b; var c = 20; var f ...
- SAP - 拆包,组件入库
场景: 一个成品商品,例如汽车,有很多零部件:车轮,框架,发动机等.以整体形式发货过账,在遇到质量问题客户退货情况,需要把汽车拆开,然后零部件退回到库(按照BOM结构拆卸). MB1A/MIGO:发货 ...