温馨提示×

ubuntu lamp数据库连接失败怎么办

小樊
41
2026-01-04 20:07:44
栏目: 智能运维

Ubuntu LAMP 数据库连接失败排查与修复

一 快速自检

  • 确认数据库服务已启动:sudo systemctl status mysql(若为 MariaDB 可用 sudo systemctl status mariadb);未运行则启动:sudo systemctl start mysql
  • 本地套接字直连测试:mysql -u root -p,若报“ERROR 2002 (HY000) 无法通过套接字”,多半是服务未起或 socket 路径不一致。
  • 本机 TCP 直连测试:mysql -h 127.0.0.1 -P 3306 -u root -p;能连说明 TCP 正常,问题可能在 PHP 的 localhost 解析或 socket 配置。
  • 监听与端口检查:sudo netstat -tulnp | grep :3306,正常应看到 0.0.0.0:3306:::3306
  • 防火墙与云安全组:本机防火墙 sudo ufw status,必要时放行 3306/tcp;云服务器需在控制台放行安全组入站 3306
  • 日志定位:数据库日志 /var/log/mysql/error.log;Web 服务日志 /var/log/apache2/error.log;PHP-FPM 日志(如启用)/var/log/php*-fpm.log

二 常见错误与对应修复

  • 错误 2002:无法通过套接字连接

    1. 确认服务运行:sudo systemctl start mysql;2) 核对 socket 路径,查看 /etc/mysql/mysql.conf.d/mysqld.cnf 与客户端使用的路径是否一致(常见为 /var/run/mysqld/mysqld.sock);3) 若目录缺失或权限异常,执行:sudo mkdir -p /var/run/mysqld && sudo chown mysql:mysql /var/run/mysqld 后重启;4) 用 mysql -h 127.0.0.1 -P 3306 -u root -p 验证是否为 TCP 可用而 socket 配置问题。
  • 错误 2003:无法连接到 MySQL 服务器

    1. 服务未起:启动 mysql;2) 监听地址限制:编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,将 bind-address 设为 0.0.0.0(或注释掉该行)后重启;3) 防火墙/安全组:放行 3306/tcp;4) 监听检查:netstat -tulnp | grep :3306 应看到 0.0.0.0:3306;5) 远程连通性:mysql -h 服务器IP -P 3306 -u 用户名 -p
  • 错误 1045:Access denied

    1. 核对用户名/密码;2) 检查用户主机权限:SELECT User, Host FROM mysql.user;;3) 授权示例:GRANT ALL PRIVILEGES ON . TO ‘your_user’@‘%’ IDENTIFIED BY ‘your_password’; FLUSH PRIVILEGES;(生产环境建议限制来源 IP 而非使用 %);4) 若忘记 root 密码,可用 sudo mysql_secure_installation 或按官方流程重置。
  • 错误 1129/Host is blocked
    连接错误过多被屏蔽,执行:mysqladmin -u root -h 服务器IP flush-hosts,并检查应用连接池与重试逻辑。

三 PHP 连接排查与修复

  • 安装与启用扩展:sudo apt install php libapache2-mod-php php-mysql,确保模块已启用。

  • 测试脚本验证(/var/www/html/db_test.php):

    <?php
    $servername = "localhost";   // 若本机 TCP 正常但 PHP 仍失败,可改为 "127.0.0.1"
    $username   = "my_user";
    $password   = "my_password";
    $dbname     = "my_database";
    
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    }
    echo "连接成功";
    ?>
    

    访问 http://服务器IP/db_test.php 查看结果;若 “localhost” 失败而 127.0.0.1 成功,通常是 PHP 以 socket 方式连接且路径/权限不一致。

  • 进一步定位:查看 /var/log/apache2/error.log/var/log/php-fpm.log* 获取具体报错与行号。

四 远程连接配置要点

  • MySQL 配置:编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,设置 bind-address = 0.0.0.0,重启 mysql
  • 用户授权:仅授予必要权限与来源,例如:GRANT ALL PRIVILEGES ON mydb. TO ‘app’@‘192.168.1.%’ IDENTIFIED BY ‘StrongPass!’; FLUSH PRIVILEGES;*。
  • 防火墙与云安全组:本机 sudo ufw allow 3306/tcp;云服务器在控制台放行 3306 入站。
  • 监听与连通性:netstat -tulnp | grep :3306 应看到 0.0.0.0:3306;远程测试 mysql -h 公网IP -P 3306 -u app -p
  • 安全建议:避免使用 root 远程;限制来源网段;使用强密码与 TLS 加密(如启用 SSL/TLS)。

五 仍未解决时的高效定位建议

  • 收集现场信息:
    1. 服务状态:systemctl status mysql;2) 监听端口:netstat -tulnp | grep :3306;3) 本机直连:mysql -h 127.0.0.1 -P 3306 -u root -p;4) 错误日志:/var/log/mysql/error.log/var/log/apache2/error.log;5) 防火墙:ufw status
  • 复现最小案例:用上面的 db_test.php 排除应用代码干扰;必要时抓包或增加日志。
  • 变更留痕与回滚:对 /etc/mysql//etc/apache2/ 等配置变更前先备份,变更后用 systemctl restart 生效并观察日志。

0