CentOS 上 MySQL 故障排查指南
一 快速定位流程
sudo systemctl status mysqld、sudo journalctl -xe | tail -n 100sudo tail -n 100 /var/log/mysqld.logsudo ss -tlnp | grep 3306(或 netstat -tlnp | grep 3306)sudo kill -9 <PID> 或调整 MySQL 端口/etc/my.cnf 或 /etc/mysql/my.cnf,核对 datadir、socket、log-error、portls -ld /var/lib/mysql,应为 mysql:mysqlfree -m、df -h、top/htopulimit -n、/etc/security/limits.conf、/etc/sysctl.confmysql -u root -p -h 127.0.0.1mysql -u user -p -h <服务器IP> -P 3306ping <IP>、telnet <IP> 3306 或 nc -vz <IP> 3306二 常见故障与处理清单
| 症状 | 关键检查 | 处理要点 |
|---|---|---|
| 服务无法启动/启动即停 | systemctl status mysqld、/var/log/mysqld.log |
修正配置语法、修复目录权限为 mysql:mysql、排查磁盘空间与内存、必要时 systemctl reset-failed 后重启 |
| Starting MySQL… PID file 未更新 | 错误日志、进程残留 | 确认无残留 mysqld 进程(`ps -ef |
| ERROR 2002 Can’t connect through socket | socket 路径、/var/lib/mysql 权限 |
确认 socket 配置与客户端一致、修复目录权限、确保服务已启动 |
| 远程连不上 | bind-address、firewalld、mysql.user 授权 |
配置 bind-address=0.0.0.0、放行 firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload、创建 'user'@'%' 或 'user'@'网段' 并 FLUSH PRIVILEGES; |
| ERROR 1045 Access denied | 用户名/密码/来源主机 | 校对密码、检查 SELECT host,user FROM mysql.user;、为来源主机授权并刷新权限 |
| Host ‘x.x.x.x’ is not allowed | 用户 host 字段 | 新建或调整用户 host 为客户端 IP 或 %(生产建议白名单网段) |
| 表损坏/异常 | mysqlcheck、mysql_upgrade |
执行 mysqlcheck --repair --all-databases;如遇系统表不一致,执行 mysql_upgrade -u root -p |
| CPU 飙高 | SHOW FULL PROCESSLIST;、EXPLAIN |
定位慢 SQL、补充索引、改写 SQL、必要时限流或优化参数 |
| SELinux 拦截 | getenforce、/var/log/audit/audit.log |
临时 setenforce 0 验证;生产环境使用 semanage/布尔值精细化放行,避免直接关闭 SELinux |
| 插件/库缺失(如 auth_socket) | 错误日志 | 安装缺失插件或改用密码认证,必要时重新初始化数据目录 |
| 以上条目覆盖了启动、连接、权限、系统与安全、性能等高频问题及处置路径。 |
三 日志与诊断命令速查
sudo tail -f /var/log/mysqld.log(启动失败、InnoDB 异常、权限问题首选)SET GLOBAL slow_query_log=1; SET GLOBAL long_query_time=1;SHOW VARIABLES LIKE 'slow_query_log_file';pt-query-digest /var/log/mysql/slow.logSHOW FULL PROCESSLIST;、KILL <ID>;SHOW ENGINE INNODB STATUS\G;SHOW GRANTS FOR 'app'@'10.0.%';mysqlcheck --repair --all-databasesmysql -u user -p -h <IP> -P 3306,或 telnet/nc 测端口连通性四 配置与加固要点
/etc/my.cnf 中 [mysqld] bind-address=0.0.0.0firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload'app'@'10.0.%' 这类白名单网段,避免滥用 '%'mysql_secure_installation(禁用匿名、禁止 root 远程、移除 test 库、设置复杂度)[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ciSET NAMES utf8mb4;innodb_buffer_pool_size 设为内存的约 50%–80%innodb_log_file_size 设为 128M–512Mmax_connections 结合并发与内存评估MySQLTuner / Percona Toolkit 持续巡检五 应急与回滚建议
mysqldump -u root -p --single-transaction --routines --triggers --databases <库名> > backup.sql/etc/my.cnf.bak,异常时 cp /etc/my.cnf.bak /etc/my.cnf && systemctl restart mysqlddatadir,从备份恢复或采用 mysql_install_db/mysqld --initialize 重建系统表后再导入业务数据ibdata1、mysql 系统库或执行 reset master 等破坏性操作,先定位日志与根因