如果 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
選項,則它不會讀取授權表或實作任何存取控制。任何使用者都可以連線並執行任何操作,這是非常不安全的。 若要讓以此方式啟動的伺服器讀取表格並啟用存取檢查,請刷新權限。