ThinkPHP 连接腾讯云 CDB 需严格匹配网络环境、字符集(utf8mb4)、权限隔离及读写分离三要素,否则导致连接失败、乱码或主从失效。

ThinkPHP 连接腾讯云 CDB(MySQL 版)时,配置文件本身不特殊,但必须严格匹配 CDB 实例的网络环境、权限结构和连接规范,否则会出现连不上、读写异常或主从失效等问题。关键不在“怎么写”,而在“写对什么”。
确保 CDB 实例可被 CVM 正确访问
CDB 默认不开放公网,必须与 CVM 部署在同一 VPC 和子网下,或通过内网专线/对等连接打通。若跨地域或跨 VPC,即使配置正确也会超时失败。
- 在腾讯云控制台确认 CDB 实例的「内网地址」(如 cdb-xxx.mysql.tencentyun.com),而非外网地址
- CVM 安全组需放行 CDB 所在安全组的入站 3306 端口(建议按源安全组授权,而非 IP 段)
- CDB 实例的「白名单」中必须包含 CVM 所在子网网段(如 10.0.1.0/24),不能只填单个 CVM 内网 IP
database.php 中必须显式声明 charset 和 prefix
腾讯云 CDB 默认字符集为 utf8mb4,若配置中缺失 charset 或值不一致(如写成 utf8),会导致中文乱码、emoji 插入失败甚至建表报错;prefix 虽非强制,但未设时 ThinkPHP 可能误判表名,尤其在多库共用同一账号场景下易出错。
- 务必设置 'charset' => 'utf8mb4'
- 即使无表前缀,也建议显式写 'prefix' => '',避免框架自动拼接逻辑干扰
- 若使用 PDO,DSN 中需包含 ;charset=utf8mb4,例如:
mysql:host=cdb-xxx.mysql.tencentyun.com;dbname=myshop;charset=utf8mb4
账号权限要最小化且适配主从角色
CDB 主实例与只读实例的账号权限是独立管理的。ThinkPHP 的读写分离配置依赖账号实际能力——只读账号连到主库会报错,主账号连只读库则可能因权限不足而 SELECT 失败。
支持从 AWS、阿里云、GCP、华为云、Azure 向腾讯云迁移的 Landing Zone 全流程客户端。通过远程 MCP Server 自动完成:扫描源云资源(5朵云13种资源)、AI智能填充调研问卷、生成设计文档、生成Terraform代码。当用户提到云迁移、Landing Zone、Terraform、扫...
立即学习“PHP免费学习笔记(深入)”;
- 为读操作单独创建账号(如 ro_user),仅授予 SELECT 权限,并绑定到只读实例
- 主账号(如 rw_user)需在主实例上拥有 ALL PRIVILEGES(除 GRANT),且不能在只读实例上存在同名账号
- 所有节点(主+从)的数据库名、用户名、密码必须完全一致,CDB 不支持跨实例权限同步
开启读写分离时必须满足 TP6 三要素
仅把只读地址填进 read 数组没用。ThinkPHP 6 要求同时满足三个硬性条件,缺一不可:
- deploy => 1:启用部署模式(非开发模式),否则读写分离逻辑不加载
- rw_separate => true(布尔值,不是字符串或数字)
-
read 必须是二维数组,哪怕只有一个只读实例也要套一层方括号:
[['hostname' => 'cdb-ro-xxx.mysql.tencentyun.com', 'port' => 3306, ...]]
事务与锁查询天然走主库,别指望从库分担
这是设计,不是缺陷。只要代码中出现以下任一情况,ThinkPHP 会自动将后续所有查询路由至主库:
- 调用 Db::startTrans() 后的任何 select/find 查询
- 使用 ->lock(true) 或 ->where(...)->find() 带 FOR UPDATE 场景
- 执行原生 SQL 含 SELECT ... FOR UPDATE、UPDATE、INSERT 等写意图语句
如果业务中有大量“先查再改”的逻辑,应评估是否真需要事务包裹读操作——多数情况下,普通读取可剥离出事务体外,交由从库承载。


















