加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0516zz.com/)- 智能数字人、图像技术、AI硬件、数据标注、数据治理!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL运维设计实战:36小时崩溃到稳如磐石

发布时间:2026-10-22 14:28:05 所属栏目:MySql教程 来源:DaWei
导读:  去年七月,我蹲在IDC三号机房的冷凝水管道下面盯屏——空调滴水正好砸在显示器右下角,十七分钟没挪过位置。那个“36小时崩溃到稳如磐石”的课,我跟完前十八小时就听见隔壁工位老周把茶杯墩在桌上说:“又来了,一讲主从

  去年七月,我蹲在IDC三号机房的冷凝水管道下面盯屏——空调滴水正好砸在显示器右下角,十七分钟没挪过位置。那个“36小时崩溃到稳如磐石”的课,我跟完前十八小时就听见隔壁工位老周把茶杯墩在桌上说:“又来了,一讲主从切换就放PPT上画箭头,真切一次倒退三分钟。”我原以为是排版偷懒,结果他顺手点开自己的监控面板,show slave status里Seconds_Behind_Master从二百三十七跳回零只用了两秒——但跳完第三秒,IO线程就自己断了,连重连都没触发,就卡在Connecting。这我敢打包票。


  优胜劣汰?对。不是教材里那种温吞水式迭代淘汰,是半夜三点被PagerDuty炸醒、手指发抖按错Ctrl+C中断kill -9进程、然后发现根本没kill掉,它还在/tmp/.mysql.sock底下用另一个PID续着命——这种淘汰。我们线上那套双主半同步,上周刚把binlog_format从MIXED换成ROW,第二天凌晨四点十九分,某业务库突然开始报ERROR 1032,delete找不到记录。排查?先看relay-log,再查gtid_purged,最后翻出运维同学上周手动删过的那个临时表结构快照——哦,人家删的是test_user_backup_v2_2023,而应用连的是test_user_backup_v2。中间差了个下划线,差了整整三个事务。这不是设计失误,是人在压测时边啃煎饼边改SQL,煎饼渣掉进键盘F7键缝里,按了两次没反应,就以为没生效。


  机房顶灯有块频闪,每四十三秒闪一次,每次闪都让Zabbix告警框跳一下。我就盯着那跳动数秒,数到二十七的时候,张工推门进来,左耳戴着蓝牙耳机,右耳挂着半截没摘下的降噪耳塞,手里拎着盒还没拆封的酸辣粉——外卖单上备注写“不要香菜”,可汤底浮着三片绿。他往我肩上拍一巴掌:“主库CPU飙到九十六,但load只有零点七!”我扭头看他工牌挂绳已经磨出毛边,上面印的入职日期是2018年十一月,比我还早半年。他说话时下巴抬得有点高,后槽牙嚼得很快,好像怕酸辣粉凉了。


  这课的优点不在它教你怎么设innodb_buffer_pool_instances,而在它逼你亲手删掉一个slave_sql_running=No的节点——不许重启mysqld,不许touch任何配置文件,就靠一条CHANGE MASTER TO跳过去。我们试了六次,第五次成功,第六次反而因GTID_MODE=ON却漏了SET GLOBAL gtid_purged导致整个集群拒绝执行任何事务。这时候没人骂人,小李直接拉开抽屉掏出一包山楂片,一片一片掰开,扔进嘴里咔嚓咔嚓嚼,声音像在咬硬盘背板。我说你干啥呢,他说:“缓冲情绪,防止手抖敲错drop。”


  有次我在调试semi-sync超时阈值,把rpl_semi_sync_master_timeout调成一百二十万微秒,结果主库commit延迟突然卡死。后来发现是网络驱动层有个隐藏bug:当timeout超过十万微秒,内核会误判为socket已关闭并释放资源,但MySQL自己还不知道。这事我没写进报告,因为复现条件太怪——得刚好在tcp_retries2=5且本地时钟漂移超过一百一十毫秒时触发。说不准,但我觉得跟那个总在凌晨五点零七分打来的电话有关。电话是供应商技术支持打的,每次一响,机柜散热风扇声就突然低两档,像被按了静音。他问“你们是不是改了sysctl.conf”,我答“没动”,他说“确定吗”,我说“确定”,他顿了三秒,挂了。之后那台DB再没出过半同步假成功。


  去年七月十七号下午,我在打印店等一份灾备切换checklist,老板娘递过来热腾腾的A4纸,边擦手边念叨:“今天这雨下得邪乎,地砖冒潮气。”我拿起来翻,第一页标题还湿了一小块,墨迹晕成毛边,写着“步骤八:校验GTID_EXECUTED一致性”。我就站在那儿没走,看着水痕慢慢爬过“EXECUTED”四个字,最后一个D的竖笔被洇开,像一根歪斜的钉子。旁边穿蓝制服的快递员蹲在门口抽烟,烟头明明灭灭,影子投在墙上晃,晃得像MySQL错误日志里那些重复出现又消失的Got an error reading communication packets。


文章配图,仅供参考

  我不信什么“稳如磐石”。磐石是死的,数据库是活的,在内存里呼吸,在磁盘上翻身,在网络丢包的间隙里偷偷补全checksum。这课厉害就厉害在它不假装能锁住所有变量——它让你在第35小时发现慢查询日志里埋着一个凌晨一点零三分自动创建的临时表,create_time和update_time居然差了四分钟零六秒。你翻遍所有cron、event scheduler、甚至k8s job历史,最后发现是运维同学那天调完pt-online-schema-change,忘关--sleep参数,脚本跑完没杀干净,残魂在后台续了四百二十秒。这事没法编进教程,只能写在值班日志第二页背面,用红笔圈出来,底下一行小字:“建议下次煎饼摊换家。”


  我桌上现在还摆着那张没用完的checklist复印件,水痕早干了,但字还是有点翘。下周要带新同事走一遍同城双活链路切流,他们问起“36小时课到底值不值”,我大概会说:值得,只要你敢在第29小时亲手disable掉那个你一直不敢动的semi-sync插件,然后听着它发出三声不同的报错声——第一声是warning,第二声是error,第三声……是安静。那安静比什么都有说服力。至于怎么听清第三声?你得先把耳朵里那根耳机线拽出来,再关掉微信语音提醒。其他的,再说。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!