温馨提示×

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/内存:topfree -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;核对 datadirsocketport 等关键项是否一致且路径存在。
    • 数据目录权限:执行 sudo chown -R mysql:mysql /var/lib/mysql;必要时检查 /var/run/mysqld 的属主与权限。
  • 端口冲突:执行 sudo lsof -i :3306ss -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.cnfsocket 路径与客户端一致;
    • 确保 /var/run/mysqld 存在且属主为 mysql:mysqlsudo 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 :3306ss -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);
      • 执行过的命令与返回结果。
    • 在求助社区/工单中提供上述信息,可显著提升定位效率。
      以上命令与做法覆盖日常排障的高频动作与信息收集要点。

0