温馨提示×

Ubuntu PHP日志中的数据库连接问题怎么解决

小樊
40
2025-12-19 20:56:10
栏目: 编程语言

Ubuntu PHP 数据库连接问题的排查与修复

一 快速定位与日志定位

  • 确认服务是否运行:检查 MySQL/MariaDBPHP-FPM(或 Apache)状态,必要时重启服务。
    命令示例:
    sudo systemctl status mysql
    sudo systemctl status php7.x-fpm
    sudo systemctl restart mysql && sudo systemctl restart php7.x-fpm
  • 查看错误日志:
    MySQL 错误日志通常在 /var/log/mysql/error.log
    PHP-FPM 日志在 /var/log/php7.x**-fpm.log** 或 /var/log/php-fpm/error.log
    Nginx 错误日志在 /var/log/nginx/error.log(LNMP 场景)。
    命令示例:
    sudo tail -f /var/log/mysql/error.log
    sudo tail -f /var/log/php7.x-fpm.log
  • 在 PHP 中输出连接错误以便快速定位:
    • MySQLi:
      $conn = new mysqli($host, $user, $pass, $db);
      if ($conn->connect_error) { die("Connect failed: " . $conn->connect_error); }
    • PDO:
      try { new PDO(“mysql:host=$host;dbname=$db”, $user, $pass); }
      catch (PDOException $e) { die("PDO Error: " . $e->getMessage()); }
      以上步骤能迅速缩小问题范围,并获取明确的错误码与错误信息用于后续处理。

二 常见原因与对应修复

  • 数据库服务未启动:启动 MySQL/MariaDB 并设为开机自启。
    命令示例:sudo systemctl start mysql && sudo systemctl enable mysql
  • 连接参数错误:核对 主机名/端口/用户名/密码/数据库名;本地优先用 127.0.0.1(避免 localhost 走 Unix socket 引发误判),远程使用服务器 内网/公网 IP 与端口(默认 3306)。
  • 远程访问未放行:
    • MySQL 配置:编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,注释或调整 bind-address = 127.0.0.1 以允许远程;重启 MySQL。
    • 防火墙:放行数据库端口(如 3306)。
      命令示例:sudo ufw allow 3306/tcp
  • 用户权限不足或主机限制:确保数据库用户可从 PHP 所在主机连接并具备相应权限。
    示例:
    SHOW GRANTS FOR ‘your_user’@‘your_host’;
    GRANT ALL PRIVILEGES ON your_db.* TO ‘your_user’@‘your_host’;
    FLUSH PRIVILEGES;
    如需从任意主机连接,可使用 ‘your_user’@‘%’(生产环境请限定来源网段)。
  • PHP 扩展缺失:安装并启用对应扩展(如 mysqli、pdo_mysql)。
    命令示例:sudo apt-get install php7.x-mysql(或 php-mysql)。
    以上为最常见且高命中率的故障面,逐项核对通常即可恢复连接。

三 不同运行环境的差异点

  • LAMP(Apache + PHP):确认 ApachePHP 模块加载正常;修改 php.ini 后需重启 Apache
    命令示例:sudo systemctl restart apache2
  • LNMP(Nginx + PHP-FPM):确认 PHP-FPMNginx 正常运行;Nginx 通过 fastcgi_pass 与 PHP-FPM 通信,配置变更后需重启两者。
    命令示例:sudo systemctl restart nginx && sudo systemctl restart php7.x-fpm
  • SELinux/AppArmor:若启用,确认策略未阻断 3306 或 PHP-FPM 访问数据库套接字/端口。
  • 主机名解析:本机测试可用 127.0.0.1 排除 DNS/hosts 问题;远程连接务必使用可达的 IP/域名
    这些差异点决定了“服务重启对象”和“配置生效方式”,排查时需对应环境执行。

四 一键自检脚本与最小示例

  • 最小连通性测试脚本(保存为 test_db.php,访问触发后查看页面或 PHP 错误日志):connect_error) { die("MySQLi Connect failed: " . $conn->connect_error); } echo "MySQLi OK"; $conn->close(); try { $pdo = new PDO("mysql:host=$host;port=$port;dbname=$db", $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo " | PDO OK"; } catch (PDOException $e) { echo " | PDO Error: " . $e->getMessage(); } ?>
  • 网络连通性测试(在 Web 服务器上执行):
    telnet 数据库IP 3306 或 nc -vz 数据库IP 3306
    若不通,优先检查云安全组/服务器防火墙与数据库 bind-address 配置。
    该脚本可快速判断是凭据/扩展问题,还是网络/权限/配置问题。

五 高频错误码与处理要点

  • 2002 Connection refused / Can’t connect to MySQL server:服务未启动、端口不对、监听地址限制或防火墙阻断。检查 systemctl status mysqlbind-address、以及 ufw/安全组 是否放行 3306
  • 1045 Access denied for user:用户名或密码错误,或用户主机限制不匹配。核对凭据,使用 SHOW GRANTS 检查并调整用户主机(如 ‘user’@‘localhost’‘user’@‘%’ 的区别)。
  • 1130 Host ‘xxx’ is not allowed to connect to this MySQL server:数据库未授权该来源主机连接。为用户添加对应来源主机的权限或调整授权策略。
  • 2006 MySQL server has gone away:超时/包过大/服务重启等。可适当增大 wait_timeout/max_allowed_packet,或检查网络稳定性与服务状态。
    结合错误码与日志定位,能显著缩短排障时间。

0