從現象來看,更換為 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 問題,實際是應用問題」:
# 連接 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 配置一致:
# 錯誤配置(用了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 日誌:
# 查看 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 確保配置生效:
/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(更簡單):
同時同步修改<!-- schema.xml 中修改邏輯庫名,匹配應用預期 --> <schema name="blog" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>db.properties中的庫名:jdbcUrl=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,再逐步排查其他問題即可解決。