MySQL运维与设计实战:从崩溃到稳如磐石的36小时蜕变
|
凌晨2点,监控告警刺破寂静:主库CPU飙至99%,连接数突破阈值,应用大面积超时。运维同事紧急登录,发现慢查询日志里堆积着数十条执行时间超300秒的SQL——一条未加索引的LIKE模糊查询正全表扫描千万级用户表,锁住整张表长达4分钟。 我们立即启用应急预案:先在从库验证并添加复合索引(status, created_at),再通过pt-online-schema-change在线添加,全程业务零感知;同时用SET SESSION max_execution_time=5000临时限制长事务,为优化争取窗口。30分钟内,慢查数量归零,TPS回升至正常水平的92%。 天亮后复盘发现,问题根源不在技术本身,而在设计惯性:开发提交的建表DDL中,仅为主键和外键设了索引,却忽略高频查询路径;DBA未参与接口评审,导致“按状态+时间范围查最新10条”这类典型场景未被索引覆盖。更隐蔽的是,历史数据归档机制缺失,user_log表三年未清理,物理大小达87GB,加剧I/O压力。 当天下午,团队协同重构数据生命周期:对日志类表启用按月分区(PARTITION BY RANGE COLUMNS(created_at)),配合事件调度器自动DROP过期分区;对核心业务表增加归档字段is_archived,并建立归档专用只读从库,分流报表类查询。所有变更均通过gh-ost灰度验证,确保回滚可逆。 第二天,我们落地三项防御机制:一是在MySQL配置中启用performance_schema + sys schema,默认采集等待事件与内存分配,替代侵入式监控代理;二是在应用层接入SQL审核网关,拦截无WHERE条件、全表UPDATE、未指定LIMIT的危险语句;三是在CI流程嵌入pt-query-digest自动化分析,每次发版前比对慢查基线,偏差超15%则阻断发布。 第三十六小时,系统经历了一次计划内压测:模拟峰值流量下并发执行500个含JOIN的复杂报表查询。监控显示QPS稳定在1200,平均响应38ms,InnoDB Buffer Pool命中率99.2%,无锁等待。值班同事笑着截屏发到群:“不再是救火队员,是守夜人。” 真正的稳定性,从不来自单点加固,而源于设计阶段对访问模式的预判、部署环节对数据规模的敬畏、以及每一次故障后将经验沉淀为自动化规则的坚持。当索引成为接口契约的一部分,当日志分区成为建表默认选项,当SQL审核像单元测试一样不可跳过——崩溃就不再是终点,而是系统进化的刻度。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

浙公网安备 33038102330577号