MySQL 维护稳定系统
这一章主要讲怎么把 MySQL 维护得稳定、排查性能问题、容量规划、锁问题、故障恢复这些内容。
一、稳定系统的基础
想要数据库稳定,硬件、虚拟机环境、操作系统、网络、应用程序这些环节都不能出问题。硬件故障、虚拟化资源争抢、磁盘性能差、网络波动,都会直接搞崩 MySQL。共享服务器上面别的程序抢资源,也会拖累数据库,这部分简单了解就行。
二、容量规划(重点)
要提前做好容量规划,不能等资源跑满了再处理。
- 监控指标:持续监控 CPU、内存、磁盘 IO、磁盘空间,看资源增长趋势,提前预判压力。
- 计算存储大小:可以通过估算表的行大小,或者直接查询 information_schema,也可以看文件系统,算出数据大概占多少存储空间。
- 可扩展性
- 横向扩展:多加多台服务器分担压力。
- 纵向扩展:给单台机器升级 CPU、内存硬件。
要提前做压力测试,验证扩容之后能不能扛住业务访问。
三、排查问题思路(重点)
数据库出问题的时候, 不能乱改配置。
- 先确定问题:是突然变慢,还是慢慢变差;是一直报错,还是特定时间才出问题。对比系统、MySQL 历史状态,找到变化点。
- 收集信息:日志、系统资源、SQL 执行情况,定位到底是硬件、配置、SQL 语句,还是应用侧的问题。
- 定位慢查询:大部分性能问题,根源都是写得不好的 SQL。可以优化 SQL、调整索引来提升效率。
四、InnoDB 锁机制(本章核心重点)
InnoDB 会有各种各样的锁,锁冲突会造成等待、SQL 卡住。
- 锁的类型:行锁、表锁,还有意向锁。事务之间抢锁,就会出现锁等待,严重直接死锁。
- 排查锁等待:可以用show engine innodb status,还有performance_schema、information_schema里面相关的锁视图,查看是谁在持有锁,哪个会话在等待锁。
- 出现锁等待,会影响业务吞吐量,写业务 SQL 的时候要尽量减少锁冲突,缩短事务执行时间。
五、InnoDB 故障恢复(重点)
数据库异常断电、崩溃之后,InnoDB 依靠 redo、undo 日志自动做崩溃恢复。
启动的时候会读取日志,把已经提交的数据落盘,回滚没提交的事务,保证数据一致性。
如果遇到损坏,也可以调整启动参数尝试强制恢复,抢救数据,不过强制恢复会有数据丢失风险。
六、其他次要内容
简单提了测试实例搭建、系统参数调整,配置修改之后要观察数据库运行状态。数据库维护核心就是:持续监控、提前规划容量、遇到故障按步骤排查、重点处理锁和崩溃恢复。