在 config/database.php 的 'connections' 数组中添加完整结构的新连接项(如 'mysql_backup'),确保名称不冲突、参数无遗漏,并配合 .env 环境变量与 php artisan config:clear 清缓存。

怎么在 config/database.php 里加第二个 MySQL 连接
Laravel 不限制数据库连接数量,只要在配置文件里定义新连接名就行。关键不是“能不能”,而是“名字别冲突、参数别漏填”。
常见错误现象:InvalidArgumentException: Database [xxx] not configured,说明配置里没这个键,或者拼错了。
- 在
config/database.php的'connections'数组里直接加一项,比如'mysql_backup' - 必须完整复制一份
mysql的结构,不能只改'host'或'database'—— 少了'driver'或'username'都会报错 - 如果用的是环境变量(推荐),确保
.env里有对应变量,比如DB_BACKUP_HOST=10.0.1.20,并在配置中用env('DB_BACKUP_HOST')引用 - 注意:Laravel 默认只读取
DB_CONNECTION指定的连接,新加的连接不会自动生效,得显式调用
如何在模型或查询中临时切换到另一个数据库
切换不是改全局配置,而是告诉 Eloquent “这次查哪个库”。最常用的是 on() 方法,它只影响当前链式调用,不污染后续操作。
使用场景:主库查用户,备份库查历史日志;或者灰度期间双写比对。
-
User::on('mysql_backup')->find(123)—— 模型级切换,只对这次查询生效 -
DB::connection('mysql_backup')->table('logs')->where(...)->get()—— 查询构造器级切换 - 不要用
Config::set('database.default', 'mysql_backup'),这会改全局默认连接,多线程/并发下极危险 - 事务跨连接不被支持:
DB::connection('a')->transaction(...)里不能混用connection('b')的查询
为什么 php artisan migrate 不跑新连接的迁移
因为 migrate 命令默认只走 DB_CONNECTION 配置的连接,不会自动遍历所有连接。想给 mysql_backup 跑迁移,得手动指定。
- 运行
php artisan migrate --database=mysql_backup,--database参数值必须和配置里的连接名完全一致 - 迁移文件本身不绑定连接,同一个
create_users_table可以在不同库执行,但表结构得你自己保证兼容 - 如果用了多连接 + 多租户,别把迁移全堆在一个命令里跑 —— 容易漏掉某个库,建议写个简单脚本循环触发
-
php artisan migrate:status --database=mysql_backup可查该连接的迁移状态,避免重复执行
连接名写错、环境没加载、配置缓存没清——最容易卡住的三个点
90% 的“切换失败”问题不在代码逻辑,而在环境和缓存层面。尤其是本地开发切得好好的,上预发就报错。
- 检查
config/database.php是否真被加载:在任意路由里dd(config('database.connections.mysql_backup')),返回null就是配置没生效 - 确认
.env文件里对应变量存在且没拼错,比如DB_BACKUP_DATABASE写成DB_BAK_DATABASE就会静默 fallback 到空字符串 - 改完配置后必须清缓存:
php artisan config:clear,否则 Laravel 仍用旧的缓存配置 —— 这个坑连老手都踩过两回
多连接本身不复杂,难的是每个环节都得对得上:配置名、环境变量名、代码里写的连接名、artisan 命令传的参数,四个地方少一个字母就不通。










