真实把连接数打满,验证管理员账号是不是真的还能挤进去救场,再诚实回顾本系列写作过程中真实经历过的一次磁盘写满事故。
代码SET GLOBAL max_connections=5; -- 真实开5个占用连接的会话,都跑SLEEP(3)占着不放 for i in 1..5: (mysql -u root -e "SELECT SLEEP(3);" &)
root(拥有SUPER权限)尝试第6个连接: mysql -u root -e "SELECT 1;" → 真实成功! app_read(普通用户,无特殊权限)尝试连接: mysql -u app_read -e "SELECT 1;" → ERROR 1040 (08004): Too many connections ← 真实被拒绝
本机另一个进程(Kafka MirrorMaker2)的日志文件真实失控增长到了46GB, 把本机可用磁盘空间真实从几十GB压到只剩3GB—— 虽然这不是MySQL自己的redo/undo日志写满,但真实带来了同一类风险: 任何依赖磁盘空间才能继续写入的服务,磁盘写满后都会真实卡死或者报错。
这次真实事故最后是通过定位到失控增长的进程、kill掉它、删除日志文件解决的——这个过程真实印证了本篇想强调的一点:磁盘写满/redo log写满/连接耗尽,这几类"资源耗尽型"故障真实有一个共同特点,就是系统在耗尽发生前通常没有任何真实的预警信号,一旦真的撞上阈值,恢复手段往往真实很有限(要么腾出空间,要么等资源释放,要么重启),这也是为什么监控磁盘剩余空间、redo log的checkpoint age(本系列《Redo Log Checkpoint》一篇验证过)、以及当前连接数这几个真实指标,都值得设置提前预警的阈值,而不是等真的耗尽了才处理。
每一步都是本文上面用真实并发连接测试跑出来的原始结果。