远程数据库连接需在 .env 中配置 DB_REMOTE_HOST、DB_REMOTE_DATABASE 等专用变量,并在 config/database.php 中定义 mysql_remote 连接;必须确保网络可达、权限授权、防火墙放行及 SSL(如需)正确配置。

远程数据库连接配置在 .env 里怎么写
远程数据库和本地数据库在 Laravel 中没有本质区别,关键在于 .env 中的连接参数是否指向可访问的远程地址。常见错误是直接复制本地配置(如 DB_HOST=127.0.0.1)却没改主机、端口或凭据。
-
DB_HOST必须填远程服务器的真实 IP 或域名(例如DB_HOST=192.168.10.50或DB_HOST=db.example.com) -
DB_PORT默认是3306,但有些云数据库(如阿里云 RDS、腾讯云 CDB)可能启用自定义端口,必须核对控制台信息 -
DB_DATABASE是远程库名,不是本地库名;注意大小写敏感性(Linux 环境下 MySQL 库名区分大小写) - 确保远程数据库已授权该 IP 访问:比如执行
GRANT ALL ON mydb.* TO 'myuser'@'123.45.67.89' IDENTIFIED BY 'mypass';,其中123.45.67.89是你 Laravel 服务器的公网 IP -
防火墙和安全组必须放行对应端口(如 TCP 3306),否则连接会卡在
Connection refused或超时
如何定义多个数据库连接(包括远程)
Laravel 允许在 config/database.php 中定义多个连接,每个连接用唯一键名标识。远程库不应复用 mysql 主连接,而应单独命名(如 mysql_remote),避免混淆和误用。
- 在
config/database.php的'connections'数组里新增一项:
'mysql_remote' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_REMOTE_HOST', '127.0.0.1'),
'port' => env('DB_REMOTE_PORT', '3306'),
'database' => env('DB_REMOTE_DATABASE', 'forge'),
'username' => env('DB_REMOTE_USERNAME', 'forge'),
'password' => env('DB_REMOTE_PASSWORD', ''),
'unix_socket' => env('DB_REMOTE_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
PDO::MYSQL_ATTR_SSL_CERT => env('MYSQL_ATTR_SSL_CERT'),
PDO::MYSQL_ATTR_SSL_KEY => env('MYSQL_ATTR_SSL_KEY'),
]) : [],
],
- 对应在
.env中添加远程专用变量:DB_REMOTE_HOST、DB_REMOTE_DATABASE等 - 如果远程库强制 SSL,必须配置
MYSQL_ATTR_SSL_CA等选项,并确保证书路径正确(推荐用绝对路径,如/var/www/myapp/certs/ca.pem)
在 Eloquent 或查询构造器中切换远程连接
不指定连接时,默认走 config('database.default'),即 mysql。要使用远程库,必须显式指定连接名,否则所有操作仍发生在本地库上。
- Eloquent 模型中通过
$connection属性绑定:
class RemoteUser extends Model
{
protected $connection = 'mysql_remote';
}
- 查询构造器临时切换:
DB::connection('mysql_remote')->table('users')->get() - 事务必须在同一个连接内进行:
DB::connection('mysql_remote')->transaction(function ($db) { ... });,跨连接事务不生效 - 关联查询(如
belongsTo)不会自动继承父模型的$connection,需手动在关联方法中指定:return $this->belongsTo(RemoteUser::class)->usingConnection('mysql_remote');(Laravel 10+ 支持usingConnection(),旧版本需重写newQuery)
连接失败时怎么快速定位问题
报错信息往往只显示 SQLSTATE[HY000] [2002] Connection refused 这类泛化提示,实际原因可能分布在网络、权限、配置三层。
- 先在 Laravel 服务器上命令行测试连通性:
mysql -h DB_REMOTE_HOST -P DB_REMOTE_PORT -u DB_REMOTE_USERNAME -p,绕过 Laravel 直接验证基础链路 - 检查
phpinfo()是否启用了pdo_mysql扩展(部分 Docker 镜像默认不装) - 开启 Laravel 查询日志:
DB::connection('mysql_remote')->enableQueryLog();后调用DB::connection('mysql_remote')->getQueryLog(),确认是否真发出了请求 - 注意时区差异:远程库若设为
UTC而本地应用设为Asia/Shanghai,可能导致时间字段写入/读取偏移,这不是连接问题,但常被误判 - 连接池或长连接场景下,远程库主动断开(如 AWS RDS 的
wait_timeout=300)会导致后续请求失败,需配置'options' => [PDO::ATTR_TIMEOUT => 10]并捕获Illuminate\Database\QueryException
远程数据库配置本身不复杂,难的是环境隔离和错误归因——网络不通、权限没开、SSL 证书路径错、甚至 DNS 解析失败,都表现为“连不上”。务必一层层剥离,别一上来就改 Laravel 配置。










