如果啟動 mysqld 伺服器時沒有使用 --skip-grant-tables
選項,它會在啟動順序期間將所有權限表內容讀取到記憶體中。此時,記憶體中的資料表會生效以進行存取控制。
如果您使用帳戶管理陳述式間接修改權限表,伺服器會注意到這些變更並立即再次將權限表載入記憶體中。帳戶管理陳述式會在第 15.7.1 節 「帳戶管理陳述式」中說明。範例包括 GRANT
、REVOKE
、SET PASSWORD
和 RENAME USER
。
如果您使用 INSERT
、UPDATE
或 DELETE
(不建議) 等陳述式直接修改權限表,除非您告知伺服器重新載入資料表或重新啟動伺服器,否則這些變更不會對權限檢查產生影響。因此,如果您直接變更權限表但忘記重新載入它們,則這些變更在您重新啟動伺服器之前 不會產生影響。這可能會讓您想知道為什麼您的變更似乎沒有任何作用!
若要告知伺服器重新載入權限表,請執行刷新權限作業。這可以透過發出 FLUSH PRIVILEGES
陳述式或執行 mysqladmin flush-privileges 或 mysqladmin reload 命令來完成。
權限表重新載入會如下影響每個現有用戶端工作階段的權限
資料表和資料行權限變更會在用戶端的下一個請求時生效。
資料庫權限變更會在用戶端下次執行
USE
陳述式時生效。db_name
注意用戶端應用程式可能會快取資料庫名稱;因此,如果沒有實際變更為不同的資料庫,可能看不到此影響。
連線用戶端的靜態全域權限和密碼不受影響。這些變更僅在後續連線的階段作業中生效。動態全域權限的變更會立即生效。如需靜態和動態權限之間差異的資訊,請參閱靜態與動態權限。)
階段作業中作用角色集的變更會立即生效,僅限於該階段作業。 SET ROLE
陳述式會執行階段作業角色啟用和停用 (請參閱第 15.7.1.11 節,「SET ROLE 陳述式」)。
如果伺服器以 --skip-grant-tables
選項啟動,則不會讀取授權表或實作任何存取控制。任何使用者都可以連線並執行任何操作,這是非常不安全的。 若要讓如此啟動的伺服器讀取表格並啟用存取檢查,請清除權限。