- 首页 >
- 问答 >
-
云计算 >
- ubuntu中mysql如何进行故障排查
ubuntu中mysql如何进行故障排查
小樊
34
2025-11-16 15:49:16
Ubuntu 上 MySQL 故障排查流程
一 快速定位与通用检查
- 确认服务状态与启动失败原因:执行 sudo systemctl status mysql,若失败,优先查看 /var/log/mysql/error.log 获取具体报错。
- 查看实时日志:执行 sudo tail -f /var/log/mysql/error.log,动态观察启动或运行期间的错误。
- 检查关键系统资源:
- CPU/内存:top、free -h
- 磁盘空间:df -h(InnoDB 恢复、二进制日志、临时文件对磁盘敏感)
- 修改配置后使生效:sudo systemctl restart mysql
- 如安装了 AppArmor,确认其对 /var/lib/mysql、/var/log/mysql 等路径无拒绝访问日志(/var/log/kern.log)。
以上步骤能覆盖大多数“起不来、异常退出、性能骤降”的初步定位需求。
二 服务无法启动的专项排查
- 配置与权限:
- 主配置常见路径:/etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf;核对 datadir、socket、port 等关键项是否一致且路径存在。
- 数据目录权限:执行 sudo chown -R mysql:mysql /var/lib/mysql;必要时检查 /var/run/mysqld 的属主与权限。
- 端口冲突:执行 sudo lsof -i :3306 或 ss -lntp | grep 3306,若被占用,停止占用进程或修改 MySQL 的 port。
- 表损坏修复:
- InnoDB 表:先确保能启动,再用 mysqlcheck --all-databases --auto-repair 检查修复。
- MyISAM 表:使用 myisamchk(需停库或在维护窗口操作)。
- 资源与日志:
- 磁盘满会导致启动失败或异常,清理无用文件(含错误日志过大)。
- 必要时临时清理日志以便重启:sudo truncate -s 0 /var/log/mysql/error.log(先备份)。
- 再次启动并观察日志:完成上述修正后执行 sudo systemctl start mysql 并复查 error.log。
以上为启动失败的高频根因与处置路径。
三 连接失败的排查
- 本机 socket 连接错误(如 “Can’t connect to local MySQL server through socket …”):
- 确认服务已启动,核对 /etc/mysql/my.cnf 中 socket 路径与客户端一致;
- 确保 /var/run/mysqld 存在且属主为 mysql:mysql:sudo mkdir -p /var/run/mysqld && sudo chown mysql:mysql /var/run/mysqld。
- 远程连接失败:
- 配置 bind-address(如设为 0.0.0.0 以监听所有地址,或注释该行);确认 port=3306;
- 防火墙放行:sudo ufw status 查看,sudo ufw allow 3306/tcp 放行端口;
- 云服务器需同时检查安全组/NACL 规则。
- 认证与账户问题:
- “Access denied for user” 时,核对用户名、主机、密码;必要时在 MySQL 中执行:
- ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘new_password’; FLUSH PRIVILEGES;
- 主机被阻断(max_connect_errors 超限):执行 mysqladmin -u root -h your_mysql_ip flush-hosts。
- 网络连通性:从客户端 ping 服务器 IP,必要时 telnet your_mysql_ip 3306 验证端口可达。
以上步骤覆盖本地/远程连接的高频问题点与修复方法。
四 性能与慢查询排查
- 启用与验证慢查询日志:
- 查看状态:SHOW VARIABLES LIKE ‘slow_query_log’;、SHOW VARIABLES LIKE ‘long_query_time’;、SHOW VARIABLES LIKE ‘slow_query_log_file’;
- 动态开启(重启失效):SET GLOBAL slow_query_log=‘ON’; SET GLOBAL long_query_time=1;
- 永久开启:在 [mysqld] 下配置
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 1
- 分析慢日志:
- 自带工具:mysqldumpslow -s t -t 10 /var/log/mysql/slow.log(按耗时取前 10 条);
- 深度分析:pt-query-digest /var/log/mysql/slow.log(Percona Toolkit)。
- 执行计划与优化:
- 使用 EXPLAIN 检查 type、key、rows、Extra(避免 ALL、Using filesort、Using temporary);
- 结合索引设计(联合索引、覆盖索引)与 SQL 改写(减少 JOIN/子查询、分页优化)。
以上流程可快速定位“哪类 SQL 慢、为何慢、如何优化”。
五 常用命令与最小复现建议
- 常用命令清单:
- 服务:sudo systemctl status|start|restart mysql
- 日志:sudo tail -f /var/log/mysql/error.log
- 端口:sudo lsof -i :3306 或 ss -lntp | grep 3306
- 权限:sudo chown -R mysql:mysql /var/lib/mysql
- 修复:sudo mysqlcheck --all-databases --auto-repair
- 远程放行:sudo ufw allow 3306/tcp
- 最小复现与求助:
- 复现问题时,记录并保留:
- 完整错误提示/告警;
- /var/log/mysql/error.log 相关片段;
- 相关配置片段(如 mysqld.cnf 的 bind-address、port、datadir、socket);
- 执行过的命令与返回结果。
- 在求助社区/工单中提供上述信息,可显著提升定位效率。
以上命令与做法覆盖日常排障的高频动作与信息收集要点。