mysql.user 表中 Host 字段的 %、localhost、127.0.0.1 看似相通,實則對應三套完全獨立的權限檢查鏈路。誤解這一點是導致「本機能連、遠程不能連」或反之的首因。
| Host 值 | 匹配連接方式 | 協議/傳輸 | 典型命令 |
|---|---|---|---|
% | 任意 IP(TCP/IP) | TCP/IP | mysql -h 192.168.1.100 |
localhost | 本機 Socket/管道 | Unix Socket / Named Pipe | mysql -h localhost 或 mysql |
127.0.0.1 | 本機 TCP 回環 | TCP/IP | mysql -h 127.0.0.1 |
'root'@'%' 不能 通過 mysql -h localhost 登錄'root'@'localhost' 不能 通過 mysql -h 127.0.0.1 登錄-- 創建三個同名不同 Host 用戶
CREATE USER 'test'@'%' IDENTIFIED BY 'p1';
CREATE USER 'test'@'localhost' IDENTIFIED BY 'p2';
CREATE USER 'test'@'127.0.0.1' IDENTIFIED BY 'p3';
-- 分別測試
mysql -u test -p -h 192.168.1.10 # 需輸入 p1
mysql -u test -p -h localhost # 需輸入 p2
mysql -u test -p -h 127.0.0.1 # 需輸入 p3
GRANT ALL ON *.* TO 'app'@'%'; -- 只有 TCP/IP 遠程能用,本機 localhost/127.0.0.1 依然拒絕
-- 1. 遠程 TCP/IP
GRANT ALL ON db.* TO 'app'@'%' IDENTIFIED BY 'pass';
-- 2. 本機 Socket(最常用)
GRANT ALL ON db.* TO 'app'@'localhost' IDENTIFIED BY 'pass';
-- 3. 本機 TCP 回環(部分框架默認用此)
GRANT ALL ON db.* TO 'app'@'127.0.0.1' IDENTIFIED BY 'pass';
FLUSH PRIVILEGES;
SELECT User, Host FROM mysql.user WHERE User='your_user'; 確認三條記錄是否存在SHOW GRANTS FOR 'your_user'@'%'; 分別查看三組權限-h 參數對應哪種 Hostskip_name_resolve 設置(影響 DNS 解析)CREATE USER IF NOT EXISTS 'app'@'%' IDENTIFIED BY 'pass';
CREATE USER IF NOT EXISTS 'app'@'localhost' IDENTIFIED BY 'pass';
CREATE USER IF NOT EXISTS 'app'@'127.0.0.1' IDENTIFIED BY 'pass';