Typecho 出现数据库连接失败 Code 1045 错误,本质是 MySQL 服务器拒绝了 PHP 脚本的认证请求,最常见原因是配置文件中的密码错误或用户主机权限不匹配。
先说结论:1045 错误属于 MySQL 认证失败,需优先核对 Typecho 配置文件中的数据库账号密码,并确认 MySQL 用户允许从当前主机连接。
- 先确认:检查 typecho 根目录下的 config.inc.php 或安装页面的数据库凭证输入
- 先处理:验证 MySQL 用户是否存在且 host 权限匹配(localhost 与 127.0.0.1 不同)
- 再验证:使用命令行 mysql -u 用户 -p 测试相同凭证能否登录
命令速用版
若服务器有命令行权限,可直接通过以下命令快速定位是配置问题还是数据库服务问题。
# 1. 查看 Typecho 配置文件中的数据库信息
cat config.inc.php | grep \"db\"
# 2. 使用相同凭证在命令行测试连接
mysql -u 数据库用户名 -p -h 数据库主机
# 3. 若命令行也报错 1045,登录 MySQL 检查用户权限
mysql -u root -p
SELECT User, Host FROM mysql.user WHERE User = '你的用户名';为什么会这样
1045 错误核心原因是 MySQL 在登录握手阶段拒绝了连接请求,并非 PHP 代码逻辑错误。
MySQL 内部将「用户名」与「主机名」组合为身份元组,例如 'root'@'localhost' 和 'root'@'127.0.0.1' 被视为两个完全不同的账号。Typecho 通过 PHP PDO 扩展连接数据库,若配置文件中的 host 填写 localhost,但 MySQL 用户仅授权了 127.0.0.1,或密码包含不可见空格,都会触发 Access denied 错误。此外,MySQL 8.0+ 默认使用的 caching_sha2_password 认证插件可能与旧版 PHP 环境不兼容,导致认证失败。
分步处理
按顺序执行以下步骤,每步完成后观察错误是否消失。
步骤一:核对配置文件凭证
检查 Typecho 根目录下的 config.inc.php 文件(或安装界面输入框),确认 dbUser、dbPassword 和 dbHost 字段。
- 适用场景:刚迁移网站或修改过密码
- 操作动作:手动重新输入密码,避免复制粘贴带入空格
- 风险边界:修改 config.inc.php 前请备份文件
步骤二:验证 MySQL 用户主机权限
登录 MySQL 服务器,查询用户允许的主机范围。
SELECT User, Host FROM mysql.user WHERE User = '你的数据库用户名';- 适用场景:命令行测试也报 1045 错误
- 操作动作:若 Host 不匹配,执行 CREATE USER 或 GRANT 命令补充权限
- 验证结果:确保查询结果中包含配置文件里填写的 host 值
步骤三:重置密码(如遗忘)
若密码不确定,需重置 MySQL 用户密码。
ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码';
FLUSH PRIVILEGES;- 适用场景:确认用户存在但密码错误
- 操作动作:执行上述 SQL 后更新 config.inc.php 中的密码
- 风险边界:MySQL 8.0+ 需注意认证插件兼容性
怎么验证是否生效
完成配置修改后,刷新 Typecho 安装页面或后台登录页面。
- 成功标志:页面不再提示数据库连接错误,进入下一步安装或后台界面
- 日志检查:若仍失败,查看服务器错误日志(如 /var/log/nginx/error.log 或 PHP 错误日志),确认是否仍为 SQLSTATE[HY000] [1045]
- 命令行验证:在服务器终端执行 mysql -u 用户 -p -h 主机,若能成功登录则证明数据库侧配置无误
常见坑
- localhost 与 127.0.0.1 混用:MySQL 将两者视为不同主机,配置文件填 localhost 但用户只授权了 127.0.0.1 会报错
- 密码隐藏字符:从文档复制密码时可能包含不可见空格,建议手动输入
- 认证插件不兼容:MySQL 8.0+ 默认插件可能导致旧版 PHP 连接失败,需切换为 mysql_native_password
- 配置文件权限:config.inc.php 若权限设置过严可能导致 PHP 无法读取,但通常报其他错误而非 1045
常见问题
忘记数据库密码怎么重置?
需通过 skip-grant-tables 模式启动 MySQL 后修改密码。
停止 MySQL 服务,使用 mysqld_safe `--skip-grant-tables` 启动,登录后可直接 UPDATE mysql.user 设置新密码,完成后重启服务。
为什么命令行能连上但 Typecho 连不上?
因为命令行与 PHP 运行环境的主机身份不同。
命令行可能使用了 socket 连接,而 PHP 使用 TCP 连接,需检查 MySQL 用户是否同时授权了 localhost 和 127.0.0.1。
MySQL 8.0 连接报错 caching_sha2_password 怎么办?
这是认证插件不兼容问题,不是密码错误。
执行 ALTER USER '用户'@'主机' IDENTIFIED WITH mysql_native_password BY '密码'; 将认证方式改为传统模式。
参考来源
- MySQL 错误代码 1045 怎么解决_排查用户权限与主机限制
- PHP 连接 MySQL 报错 1045?:3 分钟快速定位并解决 Access denied 错误
- PHP PDO 连接 MySQL 访问拒绝错误 (1045) 故障排除指南
- MySQL 数据库 root 用户连接错误 错误代码:1045
- ThinkPHP 数据库连接失败怎么办_ThinkPHP 数据库配置常见报错排查方法