You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10连接DigitalOcean托管数据库遇SQLSTATE[HY000][2002]错误求助

解决Laravel 10连接DigitalOcean托管数据库时的SQLSTATE[HY000] [2002]错误

针对你遇到的Laravel无法连接DigitalOcean托管数据库,但本地MySQL客户端可以正常连接的问题,以下是排查和解决步骤:

1. 清除Laravel配置缓存

Laravel可能缓存了旧的数据库配置,导致新配置未生效:

php artisan config:clear
php artisan cache:clear

执行后再尝试运行迁移命令:php artisan migrate

2. 验证PHP MySQL扩展是否安装

虽然你安装了MySQL客户端,但PHP需要对应的扩展才能连接数据库。在Ubuntu 22.04上,根据你的PHP版本安装对应扩展(以PHP 8.1为例):

sudo apt update
sudo apt install php8.1-mysql
# 重启服务使扩展生效
sudo systemctl restart nginx php8.1-fpm

3. 确认数据库配置细节

检查.env文件的以下配置项,确保和DigitalOcean控制面板提供的信息完全一致:

  • DB_HOST:使用托管数据库的私有网络地址(同VPC下优先使用,避免公网解析问题)
  • DB_PORT:默认是25060,不要写成默认的3306
  • DB_SSL_MODE:设置为REQUIRED
  • DB_SSL_CA:确认证书路径正确(Ubuntu默认路径为/etc/ssl/certs/ca-certificates.crt,也可使用DigitalOcean提供的证书)

同时,确保config/database.php的mysql配置中包含SSL选项:

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'sslmode' => env('DB_SSL_MODE', 'REQUIRED'),
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('DB_SSL_CA'),
    ]) : [],
],

4. 测试PHP的DNS解析与连接能力

在项目根目录创建测试文件test-db.php,验证PHP是否能正确解析数据库主机并建立连接:

<?php
// 加载Laravel环境变量
require __DIR__.'/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

// 测试主机解析
$host = getenv('DB_HOST');
$ip = gethostbyname($host);
echo "Database Host: $host\nResolved IP: $ip\n";

// 测试PDO连接
try {
    $pdo = new PDO(
        "mysql:host=$host;port=".getenv('DB_PORT').";dbname=".getenv('DB_DATABASE'),
        getenv('DB_USERNAME'),
        getenv('DB_PASSWORD'),
        [
            PDO::MYSQL_ATTR_SSL_CA => getenv('DB_SSL_CA'),
        ]
    );
    echo "✅ PDO连接成功!";
} catch (PDOException $e) {
    echo "❌ 连接失败: ".$e->getMessage();
}

运行测试:

php test-db.php

如果输出无法解析主机地址,说明服务器DNS配置存在问题,可以尝试直接使用托管数据库的私有IP替换DB_HOST进行测试。

5. 确认数据库用户权限

虽然你能通过客户端连接,但需确保数据库用户拥有该数据库的全部权限,且允许从Droplet的IP地址访问(DigitalOcean托管数据库的可信源已添加Droplet的情况下,权限应已开放)。

内容的提问来源于stack exchange,提问作者Michel FW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:23:23