前两篇文章关于国产数据库聊的蛮多蛮透的,想说的和能说的,姜老师都已经说了,剩下的就大家自己领悟吧。今天回归技术,来聊聊一个实战话题:如何正确地关闭 MySQL 数据库?“噗~~~姜老师,这也算问题?MySQL DBA 还不会关机?业务开发同学,测试环境关闭、开启、重启 MySQL 数据库,都是很普遍的操作呀。”
嗯,但如果姜老师跟你说:“99%的人操作都是错误的呢?”
这是在 IMG 社区微信群做的统计,可以看到 96% 的同学答案是选项1、2、3,但是这些答案都是错的。
生产环境,正确关闭 MySQL 数据库的方法有且仅有:然而,即便有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存储引擎》签名版的,可扫下方二维码:
全文完,感谢你的耐心阅读。
微信平台改变了推送规则,如果你还想看到我的文章,请一定给本文“点赞”、“在看”、“分享” 三连,新文章推送才会第一时间出现在你的微信里。认识这么久,我可不想丢掉你。
每周五、六,不定期直播,分享技术干货
IMG群是码农的交流社区,IMG微信群交流内容包括但不限于技术、经济、军事、八卦等话题。欢迎有态度的码农们加入IMG大家庭。IMG目前有少林群、武当群、峨眉群、华山群、M悦会(高端VIP群)。仅限码农入群,猎头或其他行业勿加,入群请加姜老师个人微信 82946772,并备注:码农入IMG群