MySQL 擁有一套先進但非標準的安全/授權系統。掌握其授權機制是操作 MySQL 數據庫的第一步,也是許多熟悉 SQL 基礎操作的人感到最難理解的部分。本文通過揭示授權系統的運作機制,幫助你更好地操作和使用這個優秀的數據庫系統。
內容主要參考 MySQL 官方手冊第六章。如有疑問,歡迎交流。
SELECT、INSERT、UPDATE、DELETE 權限LOAD DATA INFILE)等關鍵概念:MySQL 用戶名 與作業系統用戶名無關。雖然客戶端允許用當前登錄名連接,但標準做法是显式指定 --user 選項。
在 MySQL 中,「主機 + 用戶」的組合視為唯一標識。主機 1 上的 lee 與主機 2 上的 lee 是兩個完全不同的用戶,權限可完全不同。核心問題是:如何授予從某主機登錄的某用戶對某數據庫的使用權限。
所有授權信息存儲在 mysql 系統數據庫的三張表中:
user:全局權限(基礎授權)db:數據庫級權限host:安全主機列表(輔助 db 表)可通過 mysql -u root -p mysql 連接,再用 SELECT * FROM user/db/host 查看內容。
使用 PASSWORD('明文密碼') 函數加密。**絕不能直接填寫明文密碼**,否則導致無法訪問。
user 表:全局基礎權限,適用於所有數據庫,除非 db 表另有定義db 表:數據庫級權限,host 字段為空時結合 host 表判斷host 表:維護「安全主機列表」,配合 db 表使用MySQL 按照 user → db → host 的順序搜索,取第一條匹配記錄。但「第一條」不是按插入順序,而是按具體性排序:
| 表 | 排序規則(優先級高→低) |
|---|---|
user |
Host 無通配符 → Host 有通配符 → Host 為空;同 Host 下,User 同理 |
db |
Host 無通配符 → Host 有通配符 → Host 為空 |
host |
Host 無通配符 → Host 有通配符 → Host 為空 |
%:匹配任意主機/用戶/數據庫%,表示任意+-----------+---------+ | Host | User | +-----------+---------+ | % | root | | % | jeffrey | | localhost | root | | localhost | | +-----------+---------+
搜索順序:
localhost/root(具體 Host + 具體 User)localhost/任何用戶(具體 Host + 通配 User)任何主機/jeffrey(通配 Host + 具體 User)任何主機/root(通配 Host + 具體 User)陷阱警示:若 localhost 的 jeffrey 連接,匹配的是第 2 條(localhost/%),而非第 3 條(%/jeffrey)。錯誤配置極易導致權限異常!
更改授權表後,必須執行 mysqladmin reload 或 FLUSH PRIVILEGES 才能生效。