ThinkPHP多数据库连接需在database.php的connections数组中预定义唯一键名(如'mysql_read'),每个连接必须完整配置type、hostname、database等字段,且键名仅支持小写字母和下划线;Db::connect()参数须为该键名,传错则报Connection not found。

ThinkPHP 支持多个数据库连接,但不是靠“自动识别库名”或“模型里写个数据库名”就能跨库工作——连接必须在 config/database.php 里预定义键名,且每个连接的 type、hostname、database 都得写全;传错键名、漏写 type、用点号命名连接,都会直接报错。
database.php 里怎么加第二个 MySQL 连接
不能只复制 default 配置改个 database 就完事。ThinkPHP 的多库机制依赖 connections 数组下的**唯一键名**(比如 'mysql_read'),每个键对应一套完整配置。常见错误是复制后忘了改 hostname 或 database,结果两个连接连到同一个库上。
-
'mysql_write'和'mysql_read'是典型命名方式,键名只能是小写字母+下划线,不能含点号(mysql.read会失败)或大写 - 每个连接必须显式声明
'type' => 'mysql',否则框架会拿默认mysql类去解析 PostgreSQL 配置,报Class 'PDO' not found - 如果连接只读,建议加
'write_master' => false,避免关联操作误触发写入 - 字符集不一致时(如主库 utf8mb4、备份库 gbk),必须在各自配置里写明
'charset' => 'utf8mb4',否则中文插入会截断
Db::connect() 传什么参数才有效
Db::connect() 的参数不是数据库名,也不是模型名,而是 config/database.php 中 connections 下定义的**连接键名**。传错就抛 Connection not found: xxx。
- 正确:
Db::connect('mysql_read')→ 加载配置并返回新 Query 实例 - 错误:
Db::connect('user_db')(键名不存在)、Db::connect('User')(模型名)、Db::connect(['hostname' => ...])(临时数组,高并发下耗尽连接数) - 这个调用不改变全局默认连接,每次查询都要显式调用;也不能运行时修改已创建连接的 host/port —— 那些属于配置项,只能预设
模型类里 $connection = 'xxx' 的实际作用边界
模型的 $connection 属性只在模型类**首次初始化时读取一次**,后续 reload config 不会刷新。更关键的是:它不支持跨库 JOIN。
立即学习“PHP免费学习笔记(深入)”;
- 设置
protected $connection = 'mysql_read'后,User::select()确实走只读库,但User::with('profile')::select()中的profile关联模型,仍按它自己的$connection走,不会自动路由到主库 - 想查主库 user + 从库 log,得手动分两次查:
Db::connect('mysql')->table('user')->...;和Db::connect('mysql_log')->table('log')->...; - MySQL 原生跨库 JOIN(如
SELECT * FROM db1.user JOIN db2.log)仅限同一实例,且需权限支持;ThinkPHP 不会帮你拼库前缀,得手写原生 SQL 或用Db::query()
同步数据时为什么不能用 limit + offset 分页
同步过程持续时间长,期间源表可能被删行、插新行,limit 5000 offset 10000 会跳过新增数据或重复处理已删 ID,导致漏同步或主键冲突。
- 必须按主键范围分片:
WHERE id BETWEEN ? AND ?,配合min(id)/max(id)动态计算区间 - 写入目标库必须用
insertAll(),禁止 foreach +insert(),否则事务和性能都扛不住 - 高并发同步建议加 checkpoint 表记录最后成功同步的
id,断点续传
最易忽略的一点:环境变量覆盖配置时,要用 database.connections.mysql_read.hostname 这种二维语法,而不是 database_mysql_read_hostname;写错格式,.env 里的值根本不会生效。



















