從現象來看,更換為 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 的默認服務端口是 80663306 是 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.xmlzrblog 賬號是否授權 BLOGDB
  • 若報「Unknown database」:檢查 MyCat 的 schema.xmlBLOGDB 拼寫是否完全一致;
  • 若報「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
    

三、最終驗證流程

  1. 修正 db.properties 中的 MyCat 端口為 8066;
  2. 重啓 Tomcat;
  3. 訪問 Web 網站,若仍 404,查看 Tomcat 日誌;
  4. 若日誌報數據庫連接錯誤,回到步驟 1 重新驗證 MyCat 連接;
  5. 若日誌無錯誤但仍 404,檢查應用訪問路徑/代碼中的庫名硬編碼。

核心總結

你當前的核心錯誤是「把 MyCat 的端口寫成了 MySQL 的 3306」,這會導致應用連不上 MyCat,啓動時數據庫初始化失敗,最終表現為 Web 資源未加載(404)。先修正端口為 8066,再逐步排查其他問題即可解決。