Mysql故障排查与生产环境优化
一、故障排查常用方法1. 连接问题排查检查网络与端口telnet host port # 测试端口连通性 ping host # 测试网络连通性检查 MySQL 服务状态systemctl status mysql # Linux 系统 # 或查看进程 ps -ef | grep mysql检查错误日志SHOW VARIABLES LIKE log_error; -- 查看日志路径常见错误权限不足Access denied、最大连接数满Too many connections。2. 性能问题排查查看当前连接与进程SHOW PROCESSLIST; -- 查看正在执行的线程 SHOW FULL PROCESSLIST; -- 查看完整 SQL 语句分析慢查询-- 开启慢查询日志 SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 2; -- 定义慢查询阈值秒 SHOW VARIABLES LIKE slow_query_log%; -- 查看日志路径检查锁等待SHOW ENGINE INNODB STATUS; -- 查看 InnoDB 引擎状态含锁信息3. 主从复制问题排查检查复制状态SHOW SLAVE STATUS\G -- 查看 Slave_IO_Running 和 Slave_SQL_Running 是否为 Yes常见错误主从数据不一致Last_SQL_Error网络中断导致的连接失败二进制日志binlog损坏二、生产环境优化策略1. 配置文件优化my.cnf[mysqld] # 内存相关 innodb_buffer_pool_size 70-80% 物理内存 # InnoDB 缓冲池最重要 innodb_log_file_size 256M-1G # 日志文件大小 innodb_flush_log_at_trx_commit 1 # 事务持久性0/1/2 权衡 # 连接与并发 max_connections 500-2000 # 最大连接数 thread_cache_size 64 # 线程缓存 # 慢查询与日志 slow_query_log 1 long_query_time 2 log_queries_not_using_indexes 1 # 记录未使用索引的查询2. SQL 与索引优化添加合适索引-- 查看索引使用情况 SHOW INDEX FROM table_name; -- 创建复合索引遵循最左前缀原则 CREATE INDEX idx_col1_col2 ON table_name(col1, col2);优化查询语句避免SELECT *只查需要的字段避免在WHERE子句中使用函数或表达式使用EXPLAIN分析执行计划EXPLAIN SELECT * FROM table_name WHERE col value;3. 架构优化读写分离通过主从复制实现主库写、从库读。分库分表垂直拆分按业务拆分表到不同库水平拆分将大表数据拆分到多个表如按 ID 哈希或范围引入缓存使用 Redis 等缓存热点数据减少数据库压力。三、日常运维建议定期备份mysqldump -u root -p --single-transaction --routines --triggers db_name backup.sql监控与告警关注指标QPS、TPS、连接数、缓冲池命中率、慢查询数量工具Prometheus Grafana、Percona Monitoring and Management (PMM)版本升级保持 MySQL 版本稳定定期升级小版本修复 Bug。四、典型故障案例死锁通过SHOW ENGINE INNODB STATUS查看最近的死锁日志优化事务逻辑。主从延迟检查从库配置如sync_binlog、innodb_flush_log_at_trx_commit或使用并行复制。内存 OOM调整innodb_buffer_pool_size避免内存溢出