远程mysql连接需显式指定ip/域名和端口,确保bind-address非127.0.0.1、账号授权来源ip、防火墙放行3306、dsn含charset=utf8mb4,ci4须用pdo或mysqli并清理缓存。

远程MySQL地址和端口必须显式指定,不能只写localhost
本地开发时用 localhost 可能连得上,但远程数据库服务器几乎从不响应这个地址——它实际走的是 Unix socket,而远程连接必须走 TCP。你得填真实 IP 或域名,比如 10.12.34.56 或 db.example.com;如果 MySQL 不在默认 3306 端口,必须在配置里加 port 字段(CI3)或 'port' => 3307(CI4),否则会卡在“Connection refused”。
常见错误现象:mysqli_connect(): (HY000/2002): Connection refused 或 SQLSTATE[HY000] [2002] No such file or directory——后者其实是 PHP 尝试连本地 socket 的典型表现,说明地址没配对。
- CI3:在
application/config/database.php中补全$db['default']['port'] = 3306; - CI4:在
app/Config/Database.php的$default数组里加'port' => 3306 - 确认远程 MySQL 的
bind-address没锁死为127.0.0.1(需改为0.0.0.0或具体网卡 IP)
账号权限必须允许从网站服务器IP登录
MySQL 默认只允许 root@localhost,远程连接必须显式授权来源 IP。比如你的网站服务器公网 IP 是 203.0.113.42,就得执行:
CREATE USER 'webuser'@'203.0.113.42' IDENTIFIED BY 'strong_password'; GRANT ALL ON mydb.* TO 'webuser'@'203.0.113.42'; FLUSH PRIVILEGES;
别用 'webuser'@'%',除非测试阶段且网络可控;生产环境暴露通配符账号是高危操作。
- 若网站和数据库都在内网(如阿里云 VPC),用内网 IP 授权,更安全也更快
- 检查 MySQL 错误日志,出现
Access denied for user 'xxx'@'yyy'说明账号或来源限制没过 - 某些云数据库(如腾讯云 CDB)还需在控制台白名单里添加网站服务器 IP
CI4 必须用 PDO 或 MySQLi,且 DSN 要完整
CI4 已彻底移除 mysql 驱动,填 'DBDriver' => 'mysql' 会静默失败。用 PDO 时,'DSN' 字段不是可选项——它决定了字符集、时区等关键行为,漏写会导致中文乱码或时间错位。
正确示例(CI4):
'DSN' => 'mysql:host=10.12.34.56;port=3306;dbname=mydb;charset=utf8mb4;timezone=+08:00'
-
charset=utf8mb4必须带上,否则 emoji 和四字节 UTF-8 字符存不进去 - 不用 PDO 时选
'DBDriver' => 'MySQLi',但无法用命名参数(:name),prepare 绑定只能用问号占位 - 配完务必运行
php spark cache:clear,CI4 缓存配置极强,改了不清理等于没改
防火墙和安全组经常被忽略
数据库连不通,80% 情况下不是代码或配置问题,而是网络链路被拦。MySQL 默认只监听 3306,但这个端口常被云服务商安全组、服务器 iptables 或 Windows 防火墙封掉。
- 在数据库服务器上执行
ss -tuln | grep :3306,确认监听的是*:3306而非127.0.0.1:3306 - 从网站服务器执行
telnet 10.12.34.56 3306,能通才说明网络层没问题 - 阿里云/腾讯云后台的安全组规则,要放行「入方向」的 3306 端口,源地址填网站服务器 IP 段
字符集、账号权限、网络通路这三环只要断一环,DBDebug => true 报的错就只会是模糊的“连接失败”,而不是具体原因——所以别跳过验证步骤。











