查看原文
其他

如何正确地关闭 MySQL 数据库?99%的 DBA 都是错的!

破产码农 InsideMySQL 2022-10-13
前两篇文章关于国产数据库聊的蛮多蛮透的,想说的和能说的,姜老师都已经说了,剩下的就大家自己领悟吧。
今天回归技术,来聊聊一个实战话题:如何正确地关闭 MySQL 数据库?
“噗~~~姜老师,这也算问题?MySQL DBA 还不会关机?业务开发同学,测试环境关闭、开启、重启 MySQL 数据库,都是很普遍的操作呀。”
嗯,但如果姜老师跟你说:“99%的人操作都是错误的呢?
不信?那你来看图:
不好意思,发错了,图片应该是这样的:

这是在 IMG 社区微信群做的统计,可以看到 96% 的同学答案是选项1、2、3,但是这些答案都是错的。
生产环境,正确关闭 MySQL 数据库的方法有且仅有
kill -9 `pidof mysqld`
也就是选项4是正确的。
然而,即便有4%的同学答对,但是当姜老师一个个去问他们为什么选4的时候,几乎回答都是:因为那时 MySQL 已经有问题了,所以紧急处理用 kill -9。

4%的人是蒙对的,换句话说,本题基本是团灭,几乎没有人答对。
来,接着让姜老师来告诉你,为什么是错的呢?
首先,选项1、2、3本质都是同样的命令,也就是所谓的关闭 MySQL 数据库的命令,只是形式略有不同。
那么请问,作为单选题,既然1、2、3这三个答案都是一样的,是不是用反证法可以推导出这题的正确答案就是选项4呢?
嗯,姜老师觉得这个推导过程是最完美的,大道至简。
站在出题人的角度思考问题,这一看就是绝世高手。
不过呢,这种黑科技肯定很多同学不认可。
“姜老师,你不是一直强调底层逻辑么?请问这题的底层逻辑是什么?”
这题的底层逻辑是如果在生产环境,MySQL 数据库肯定都是有主从复制的架构,而且大概率是半同步的复制架构。
这时问题就来了,上述1、2、3正常关闭的 MySQL 命令,会导致 Master 节点不等待半同步 Slave 节点是否收到二进制日志的 ACK 回包,而选择直接停止数据库服务,从而可能导致主从数据不一致!!!
因此,从数据库规范角度看,为避免线上数据一致性问题,DBA 关闭数据库使用的命令有且仅有:kill -9 `pidof mysqld`
有同学会说,kill -9 是强制关闭命令,只适用于无法正常关闭数据库的场景,一般并不推荐使用。
的确,kill -9 会立即关闭数据库,脏页没有在关闭时刷新,重启数据库后需要通过重做日志恢复到最新的数据。
然而,kill -9 命令并不会导致 Master 节点少数据,也不会导致 Slave 节点少数据。
因此,它才是最安全和正确的命令。
对数据库而言,数据一致性与可靠性高于一切。
现在答案已经告诉各位同学,但原因知道了没?
姜老师给个提示,看下图:
不好意思,又发错图片。可能是年纪大了,正确的应该是:
提示已经给了,聪明的同学顺藤摸瓜应该就可以找到答案了吧。
没有找到答案的小伙伴也没关系,因为姜老师会在周五晚上21点的抖音直播解答这个问题,记得关注抖音号:破产码农
为了不错过任何一场直播分享,推荐大家加入 IMG社区 的微信群。仅限码农入群,猎头或其他行业勿加,入群请加姜老师个人微信 82946772,并备注:码农入IMG群

BTW,想要购买姜老师《MySQL技术内幕:InnoDB存储引擎》签名版的,可扫下方二维码:



END


全文完,感谢你的耐心阅读。

微信平台改变了推送规则,如果你还想看到我的文章,请一定给本文“点赞”、“在看”、“分享” 三连,新文章推送才会第一时间出现在你的微信里。认识这么久,我可不想丢掉你。

每周五、六,不定期直播,分享技术干货



IMG群是码农的交流社区,IMG微信群交流内容包括但不限于技术、经济、军事、八卦等话题。欢迎有态度的码农们加入IMG大家庭。
IMG目前有少林群、武当群、峨眉群、华山群、M悦会(高端VIP群)。
仅限码农入群,猎头或其他行业勿加,入群请加姜老师个人微信 82946772,并备注:码农入IMG群

往期推荐



国外教授怒怼国产数据库,但我觉得是他格局小了

ClickHouse 将会是 OLAP 最亮的仔!

Oracle、 PostgreSQL DBA们,你们过得还好么?

来试试这道 MySQL 面试题吧,比 Leecode 好玩多了~~~

从职高到麻省理工计算机博士,他是传奇!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存