首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java SSH 項目部署阿里云服務器連不上 MySQL:Access denied 根因排查與解決

     編輯:程式設計疑難解答

錯誤堆棧

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException...
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection...

環境差異對比

項目開發環境 (正常)部署環境 (報錯)
OSWindows 7 64位Windows Server 32位
MySQL 版本5.6.14 64位5.6.31 32位
字符集Server/DB/Client 均 utf8Server/DB latin1, Client gbk
JDBC URLjdbc:mysql://127.0.0.1:3306/lgs?useUnicode=true&characterEncoding=UTF-8同左
用戶/密碼root/adminroot/admin

核心原因分析

1. MySQL 用戶主機授權不匹配(首因)

部署環境 MySQL `root` 用戶僅授權 `localhost`,而 JDBC URL 使用 `127.0.0.1`(TCP 連接),MySQL 將其視為 `root@127.0.0.1`,與 `root@localhost` (Socket 連接) 權限分離,導致拒絕訪問。

-- 查看用戶授權
SELECT User, Host FROM mysql.user WHERE User='root';
-- 可能輸出
+------+-----------+
| User | Host      |
+------+-----------+
| root | localhost |
| root | 127.0.0.1 |  -- 缺少這行或密碼不同
+------+-----------+

2. 字符集不一致導致連接握手異常(次因)

部署環境 Server/DB 為 `latin1`,Client 為 `gbk`,JDBC 指定 `characterEncoding=UTF-8`,三端編碼衝突可能導致握手階段認證信息解析錯誤,表現為 Access denied。

解決方案

方案一:授權 root@127.0.0.1(立即生效)

mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'admin' WITH GRANT OPTION;
FLUSH PRIVILEGES;

或通配符授權(不推薦生產):`'root'@'%'`

方案二:統一字符集為 utf8mb4(推薦)

  1. 修改 `my.ini`:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
  1. 重啟 MySQL 服務。
  2. 重建數據庫:`CREATE DATABASE lgs CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`
  3. JDBC URL 追加 `&characterEncoding=utf8mb4`(Connector/J 5.1.13+ 支持)。

方案三:JDBC URL 改用 localhost(走 Socket,繞過 TCP 授權)

jdbc:mysql://localhost:3306/lgs?useUnicode=true&characterEncoding=UTF-8

需確保 MySQL `skip-networking` 未開啟,且 `root@localhost` 密碼正確。

最終結果

提問者反饋:「嘗試了各種方法,最好重裝了一個 MySQL server,搞定」。重裝過程中默認初始化了 `root@%` 或 `root@127.0.0.1` 授權,且字符集可選 utf8mb4,從而繞過上述所有坑。

避坑指南

  • 生產環境**禁止**使用 root 直連,應創建專用應用用戶、最小權限、指定主機。
  • 統一開發/測試/生產環境 MySQL 版本、字符集、SQL_MODE。
  • 部署腳本自動化:授權 SQL、字符集配置、防火牆規則納入 Ansible/Dockerfile。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved