Ubuntu 上 MySQL 连接问题的排查与修复指南
一 快速排查流程
- 检查服务是否运行:执行命令:sudo systemctl status mysql;若未运行,启动:sudo systemctl start mysql,并建议设为开机自启:sudo systemctl enable mysql。
- 检查端口监听:执行:sudo netstat -tulnp | grep 3306,正常应看到 0.0.0.0:3306 或 :::3306。
- 本机连通性测试:执行:mysql -h 127.0.0.1 -P 3306 -u 用户名 -p。
- 远程连通性测试:从客户端执行:mysql -h 服务器IP -P 3306 -u 用户名 -p;若仅本机能连、远程失败,多为网络/防火墙/配置/权限问题。
- 查看错误日志:执行:sudo tail -f /var/log/mysql/error.log,根据报错关键词定位。
二 常见原因与对应修复
- 服务未启动或异常退出:用 systemctl status 查看原因并修复,必要时 restart;确认数据目录权限与磁盘空间正常。
- 防火墙阻断:UFW 执行:sudo ufw status、sudo ufw allow 3306/tcp;云服务器还需在控制台安全组放行 TCP 3306 入站。
- 配置限制远程:编辑 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/mysql/my.cnf,将 bind-address 设为 0.0.0.0(或注释掉该行)以允许远程;确保 port=3306;修改后重启:sudo systemctl restart mysql。
- 用户权限不足:登录 MySQL 检查:SELECT User, Host FROM mysql.user;;按需授权,例如:GRANT ALL PRIVILEGES ON . TO ‘username’@‘%’ IDENTIFIED BY ‘password’; FLUSH PRIVILEGES;(生产环境建议限制为指定 IP/网段 而非 %)。
- 网络不通或端口未放行:在客户端 ping 服务器IP,并确认中间网络与云安全组策略允许 3306/TCP。
三 常见报错对照与处理
| 错误码/提示 |
典型原因 |
处理要点 |
| ERROR 2003 (HY000) |
服务未启动、端口未监听、防火墙/安全组阻断、bind-address 限制 |
启动服务、监听 0.0.0.0:3306、放行 3306、检查云安全组 |
| ERROR 2002 (HY000) |
无法通过 socket 连接,常见于服务未运行或 socket 路径错误 |
启动服务;用 mysql_config --socket 查看路径;连接时指定 -S /var/run/mysqld/mysqld.sock |
| ERROR 1045 (28000) |
用户名/密码错误或 Host 不匹配 |
核对密码;检查用户 Host 字段;必要时重置密码:ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘new_password’; FLUSH PRIVILEGES; |
| ERROR 1130 (HY000) |
主机未被授权连接 |
授权对应来源:GRANT … TO ‘user’@‘client_ip’;或临时 ‘user’@‘%’;再 FLUSH PRIVILEGES; |
| Host is blocked |
连接错误过多触发保护 |
执行:mysqladmin -u root -h 服务器IP flush-hosts 解除封禁 |
四 远程访问配置清单
- 服务器端配置:编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,设置 bind-address=0.0.0.0,port=3306;重启:sudo systemctl restart mysql。
- 防火墙与安全组:UFW 放行 3306/TCP;云服务器在控制台安全组入站放行 TCP 3306(来源限制为业务所需 IP/网段)。
- 用户授权:创建或调整用户仅允许指定来源,例如:CREATE USER ‘app’@‘192.168.1.%’ IDENTIFIED BY ‘StrongPass!’; GRANT ALL PRIVILEGES ON db. TO ‘app’@‘192.168.1.%’; FLUSH PRIVILEGES;*
- 监听与连通性验证:确认 netstat -tulnp | grep 3306 显示 0.0.0.0:3306;从客户端测试:mysql -h 服务器IP -P 3306 -u app -p。
五 仍未解决时的定位建议
- 抓取最新错误日志:sudo tail -n 200 /var/log/mysql/error.log,关注启动失败、权限加载、插件认证、地址绑定等行。
- 复核关键配置与网络:确认 bind-address/port、监听地址、UFW/安全组、路由与 ACL;必要时抓包或在不同网络段测试。
- 避免高风险操作:仅在维护窗口进行重大变更,变更前备份数据与配置;如确需重置,先备份 /var/lib/mysql 与配置文件。