禅道迁移后 MySQL 连不上怎么排查:先定位这 3 类原因

编程狮(w3cschool.cn) 2026-10-22 07:07:51 浏览数 (44)
反馈

先给结论:禅道迁移后连不上数据库,原因基本落在三类里——凭据与认证插件不对(MySQL 8 默认的 caching_sha2_password 是头号嫌疑)、监听地址与网络链路不通、以及库表本身没迁全。按这个顺序逐层排除,比反复改配置文件快得多。

禅道迁移后 MySQL 连接失败的三类原因定位

迁移最容易踩的坑在于:旧服务器上的 MySQL 版本、认证方式、授权记录,跟新服务器往往都不一样。禅道自己只是拿数据库连接配置去连,它报出来的错误经常只有一句"数据库连接失败",看不出到底是哪一层断了。所以排查要跳出禅道的报错,直接用命令行确认每一层。

本文给出三层排查的具体命令、每层的典型错误码与修复动作,以及一份可以照着执行的验证清单。文中命令与错误码以 MySQL 官方文档为准(证据类型:官方文档),涉及禅道配置文件具体路径的部分为编辑推断,请以你安装的版本为准。

先看结论

  • 先测连通性,不急着改配置:在禅道那台机器上用 mysql 客户端直接连一次,看报的是哪一类错。
  • 凭据层:用户名、密码、host 授权记录、认证插件,四样都要对。
  • 链路层:新库的 bind-address、端口、防火墙与安全组,任何一个挡住都会报连接超时。

命令记不清时,翻 MySQL 速查手册 最快。

一、最小场景与预期行为

任务定死:禅道从 A 服务器迁到 B 服务器,数据库也一并迁到了 B 上的 MySQL 8。打开禅道首页提示数据库连接失败。

第一步不要去改禅道的配置文件,而是先在新服务器上用客户端直接连一次:

mysql -h 127.0.0.1 -P 3306 -u zentao -p

这条命令做的是:绕开禅道,直接用命令行验证账号密码与本机监听是否正常。它成功,说明问题在禅道的配置或网络路径;它失败,看错误码就知道是哪一层。

预期结果(未在本机执行):成功时进入 mysql 提示符;失败时会给出明确错误码——1045 是账号或权限问题,2059 或 2058 是认证插件问题,2003 是连不上端口,2002 是套接字路径不对。

二、凭据、权限与认证插件

凭据层、链路层与数据层的排查顺序

2.1 授权记录里的 host 不匹配

MySQL 的账号是"用户名加来源主机"的组合,zentao@localhost 和 zentao@% 是两个不同的账号。禅道与数据库不在同一台机器上时,只建了 localhost 的账号就一定连不上。

SELECT user, host, plugin FROM mysql.user WHERE user = 'zentao';

这条语句做的是列出该账号允许从哪些主机连、以及用的是哪个认证插件。如果 host 列只有 localhost 或 127.0.0.1,而禅道是从另一台机器连过来的,就需要补一条授权。

CREATE USER 'zentao'@'%' IDENTIFIED BY '换成你的密码';
GRANT ALL PRIVILEGES ON zentao.* TO 'zentao'@'%';
FLUSH PRIVILEGES;

这段做的是新建一个允许从任意主机连接的账号并授权到禅道库。生产环境建议把 % 换成禅道所在机器的具体 IP,别图省事放开全网。

2.2 MySQL 8 的认证插件是头号嫌疑

MySQL 8 把默认认证插件改成了 caching_sha2_password,而很多老版本的 PHP MySQL 扩展、老客户端并不支持它,表现就是报 2059 或 2058,提示认证插件无法加载。

ALTER USER 'zentao'@'%'
  IDENTIFIED WITH mysql_native_password BY '换成你的密码';

这条语句做的是把该账号的认证方式改回兼容的 mysql_native_password。改完不需要重启服务,但要重新执行 FLUSH PRIVILEGES 让改动生效。

适用边界要讲清:mysql_native_password 是兼容性选择,不是安全上的推荐做法。新环境更好的解法是把禅道运行环境的客户端库升到支持新插件的版本,实在升不了再退回旧插件。

2.3 配置里的库名与端口

迁移后库名、端口经常跟着变。禅道的数据库连接配置一般保存在安装目录下的配置文件里(开源版常见为 config/my.php,具体路径以你安装的版本为准),要逐项核对 host、port、账号、密码、库名五项。

三、监听地址与网络链路

凭据没问题还连不上,就轮到链路层。最常见的三个原因:

  1. 只监听了本机:配置文件里 bind-address 写的是 127.0.0.1,外部一律连不进来。
  2. 端口没开:防火墙或云安全组没有放行 3306。
  3. 改了默认端口:迁移时把端口改成了非 3306,而禅道配置里还写着 3306。

SHOW VARIABLES LIKE 'bind_address';
SHOW VARIABLES LIKE 'port';
SHOW VARIABLES LIKE 'skip_networking';

这三条语句做的是确认监听地址、端口,以及是否禁用了 TCP 连接。skip_networking 为 ON 时只允许本地套接字连接,远程一律失败。

在禅道所在机器上验证端口是否可达:

mysql -h 数据库IP -P 3306 -u zentao -p -e "SELECT 1"

这条命令做的是跨机连通性测试。报 2003 说明端口不通,先查防火墙与安全组;报 1045 说明路通了但账号不对,回到上一节。

四、数据没迁全与验证清单

前面两层都通过、禅道还是报连不上,就要怀疑迁移本身没做完。迁移的完整步骤,Mysql Migration 教程 里有更系统的说明。

4.1 库在但表不全

迁移时只导了部分表,或者导入中断。核对方式是数表:

USE zentao;
SHOW TABLES;
SELECT COUNT(*) FROM information_schema.tables
  WHERE table_schema = 'zentao';

这段做的是列出并统计禅道库里的表数量,与旧库的数字比对。数量差得多就说明导入没跑完,需要重新导入并查看导入日志里的报错。

4.2 字符集与排序规则变了

旧库用 utf8、新库默认 utf8mb4,或者排序规则不一致,会造成查询报非法混合排序规则、或者中文检索结果不对。

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

这两条语句做的是确认服务端字符集与排序规则。应与禅道库创建时使用的设置保持一致,不一致时在配置文件里显式指定。

4.3 验证清单

  • 检查:在新服务器上用命令行直连,确认能进入 mysql 提示符
  • 运行:从禅道所在机器跨机连一次,确认端口可达
  • 预期:两次都成功,且库表数量与旧库一致
  • 失败:本机通、跨机不通 → 监听地址或防火墙问题
  • 修复:调整 bind-address 与防火墙规则,重启数据库服务
  • 验证:重启禅道服务并打开首页,确认不再报数据库连接失败

上面这些步骤做的是逐层排除、跨机复验、比对数据量。预期结果(未在本机执行)是三次验证结论一致;若重启服务后又失败,多半是配置文件被覆盖回了旧值。

三类原因的典型错误码与对应修复动作

总结

禅道迁移后连不上 MySQL,按"凭据 → 链路 → 数据"三层顺序排查最快:凭据层重点看 host 授权和 MySQL 8 的认证插件,链路层重点看 bind-address 与防火墙,数据层重点看表数量与字符集。命令行直连给出的错误码,比禅道页面的提示有用得多。

三条要点带走:

  • 2059 或 2058 基本就是认证插件不兼容,改回 mysql_native_password 可解;
  • MySQL 的账号包含来源主机,localhost 与 % 是两个账号;
  • 跨机测试要在禅道所在机器上跑,服务端本机通不代表外面通。

下一步建议把迁移后的连接参数写进部署文档,每次迁移照着核一遍五项:地址、端口、账号、密码、库名。连接相关的更多命令,MySQL 教程 里有更完整的清单。

常见问题

Q:报 2059 错误是什么原因?

A:客户端不支持 MySQL 8 默认的 caching_sha2_password 认证插件。把该账号改成 mysql_native_password 可以解决,或者升级客户端库。

Q:本机连得上,禅道连不上是怎么回事?

A:先看两者是不是同一台机器。不在同一台机器时,localhost 账号连不上,bind-address 也可能只监听了本机,需要补授权并放开监听。

Q:改了配置文件为什么还是连不上?

A:常见原因是改错了文件,或者服务重启后配置被部署脚本覆盖。改完先在命令行用同样的参数直连验证,再重启禅道服务。

Q:怎么确认数据是完整迁过来的?

A:用 information_schema 统计表数量,与旧库比对。数量对不上说明导入中断,重新导入并查看导入日志。

Q:数据库的端口改了要改哪些地方?

A:禅道连接配置里的端口、防火墙放行规则、以及安全组规则三处都要同步改。只改一处会出现"配置对了还是连不上"。

延伸学习

想把数据库连接这块练熟,可以按这个顺序来:

  1. 读一篇相关笔记 MySQL 报错 2058,把认证插件的兼容问题看清;
  2. 想系统补一遍基础,MySQL 入门课程 可以跟一遍;
  3. 想看数据库与应用的联动写法,PHP+MySQL 教程 里有完整示例。

0 人点赞