从现象来看,更换为 MyCat 地址(10.0.0.58:3306/BLOGDB)后出现 HTTP 404 Not Found ,核心原因并非 MyCat 数据库连接失败(数据库失败通常报 500 错误),而是Web 应用的请求路径/资源映射异常,或 MyCat 配置导致应用层面的访问逻辑失效。以下是分步排查和解决思路:
一、先明确核心逻辑(关键区分)
| 配置类型 | 正常访问(直连MySQL) | 异常访问(MyCat) | 核心差异 |
|---|---|---|---|
| 数据库地址 | 10.0.0.51:3306/blog | 10.0.0.58:3306/BLOGDB | 地址+逻辑库名 |
| 错误类型 | 无(正常) | 404 Not Found | 不是数据库连接错误,是Web资源未找到 |
二、分步排查 & 解决
步骤 1:验证 MyCat 本身是否能正常访问(排除数据库层问题)
先通过 MySQL 客户端直接连接 MyCat,确认 BLOGDB 逻辑库可访问,避免「误以为 MyCat 问题,实际是应用问题」:
bash
# 连接 MyCat(默认端口 8066!不是 3306!)
mysql -uzrblog -p123 -h10.0.0.58 -P8066
# 执行以下命令验证:
show databases; # 需显示 BLOGDB
use BLOGDB;
show tables; # 需显示 blog 库的所有表
select count(*) from 某张表; # 能查到数据则 MyCat 正常
⚠️ 关键错误:你在 db.properties 中写的是 3306 端口,但 MyCat 的默认服务端口是 8066,3306 是 MySQL 的端口!这是最可能的核心问题!
步骤 2:修正 db.properties 中的 MyCat 端口(重中之重)
将 jdbcUrl 中的端口从 3306 改为 MyCat 的默认端口 8066,同时确认逻辑库名 BLOGDB 与 MyCat 配置一致:
properties
# 错误配置(用了MySQL端口3306)
# jdbcUrl=jdbc\:mysql\://10.0.0.58\:3306/BLOGDB?xxx
# 正确配置(改为MyCat端口8066)
jdbcUrl=jdbc\:mysql\://10.0.0.58\:8066/BLOGDB?characterEncoding\=UTF-8&allowPublicKeyRetrieval\=true&useSSL\=false&serverTimezone\=GMT
✅ 补充:MyCat 的端口规则
8066:客户端连接端口(应用/JDBC 需用这个);9066:管理端口(仅用于 MyCat 运维命令);3306:是后端 MySQL 的端口,不是 MyCat 的!
步骤 3:排查 Web 应用 404 的其他原因(若改端口后仍报错)
若修正端口后还是 404,说明是应用层面的资源映射问题,按以下顺序排查:
原因 1:应用启动时数据库连接失败,导致核心资源未加载
404 可能是「应用启动时连不上数据库,导致 Controller/页面未初始化」,需查看 Tomcat 日志:
bash
# 查看 Tomcat 日志(定位数据库连接错误)
tail -f /usr/local/tomcat/logs/catalina.out
# 重点找关键词:
# Communications link failure(连接失败)
# Access denied for user 'zrblog'(权限错误)
# Unknown database 'BLOGDB'(逻辑库名错误)
- 若报「Access denied」:检查 MyCat 的
server.xml中zrblog账号是否授权BLOGDB; - 若报「Unknown database」:检查 MyCat 的
schema.xml中BLOGDB拼写是否完全一致; - 若报「Communications link failure」:检查 MyCat 服务器的 8066 端口是否开放(
telnet 10.0.0.58 8066)。
原因 2:应用上下文路径/访问路径变化
-
直连 MySQL 时应用的访问路径是
http://ip:8080/blog,但改 MyCat 后是否误改了 Tomcat 部署路径? -
检查
webapps目录:确保blog文件夹仍在,且ROOT目录未被篡改; -
重启 Tomcat 确保配置生效:
bash/usr/local/tomcat/bin/shutdown.sh # 等待5秒 /usr/local/tomcat/bin/startup.sh
原因 3:MyCat 逻辑库名与应用预期的库名不匹配
应用代码中可能硬编码了物理库名 blog,但 MyCat 逻辑库名是 BLOGDB,导致代码中「按库名找表」失败,触发 404:
-
检查应用代码中是否有
use blog;或FROM blog.表名这类硬编码; -
若有,改为 MyCat 的逻辑库名
BLOGDB,或在 MyCat 的schema.xml中把逻辑库名改为blog(更简单):xml<!-- schema.xml 中修改逻辑库名,匹配应用预期 --> <schema name="blog" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>同时同步修改
db.properties中的库名:propertiesjdbcUrl=jdbc\:mysql\://10.0.0.58\:8066/blog?xxx
三、最终验证流程
- 修正
db.properties中的 MyCat 端口为 8066; - 重启 Tomcat;
- 访问 Web 网站,若仍 404,查看 Tomcat 日志;
- 若日志报数据库连接错误,回到步骤 1 重新验证 MyCat 连接;
- 若日志无错误但仍 404,检查应用访问路径/代码中的库名硬编码。
核心总结
你当前的核心错误是「把 MyCat 的端口写成了 MySQL 的 3306」,这会导致应用连不上 MyCat,启动时数据库初始化失败,最终表现为 Web 资源未加载(404)。先修正端口为 8066,再逐步排查其他问题即可解决。