賬戶權限信息被存儲在mysql數據庫的user、db、host、tables_priv、columns_priv和procs_priv表中。在MySQL啟動時并在5.7.7節,“權限更改何時生效”所說的情況時,服務器將這些數據庫表內容讀入內存。
GRANT和REVOKE語句所用的涉及權限的名稱顯示在下表,還有在授權表中每個權限的表列名稱和每個權限有關的上下文。關于每個權限的含義相關的詳細信息參見13.5.1.3節,“GRANT和REVOKE語法”。
權限 |
列 |
上下文 |
CREATE |
Create_priv |
數據庫、表或索引 |
DROP |
Drop_priv |
數據庫或表 |
GRANT OPTION |
Grant_priv |
數據庫、表或保存的程序 |
REFERENCES |
References_priv |
數據庫或表 |
ALTER |
Alter_priv |
表 |
DELETE |
Delete_priv |
表 |
INDEX |
Index_priv |
表 |
INSERT |
Insert_priv |
表 |
SELECT |
Select_priv |
表 |
UPDATE |
Update_priv |
表 |
CREATE VIEW |
Create_view_priv |
視圖 |
SHOW VIEW |
Show_view_priv |
視圖 |
ALTER ROUTINE |
Alter_routine_priv |
保存的程序 |
CREATE ROUTINE |
Create_routine_priv |
保存的程序 |
EXECUTE |
Execute_priv |
保存的程序 |
FILE |
File_priv |
服務器主機上的文件訪問 |
CREATE TEMPORARY TABLES |
Create_tmp_table_priv |
服務器管理 |
LOCK TABLES |
Lock_tables_priv |
服務器管理 |
CREATE USER |
Create_user_priv |
服務器管理 |
PROCESS |
Process_priv |
服務器管理 |
RELOAD |
Reload_priv |
服務器管理 |
REPLICATION CLIENT |
Repl_client_priv |
服務器管理 |
REPLICATION SLAVE |
Repl_slave_priv |
服務器管理 |
SHOW DATABASES |
Show_db_priv |
服務器管理 |
SHUTDOWN |
Shutdown_priv |
服務器管理 |
SUPER |
Super_priv |
服務器管理 |
當從早期的沒有CREATE VIEW、SHOW VIEW、CREATE ROUTINE、ALTER ROUTINE和EXECUTE權限的版本的MySQL中升級時,要想使用這些權限,你必須使用MySQL分發提供的mysql_fix_privilege_tables腳本升級 授權表。參見2.10.2節,“升級授權表”。
如果啟用了二進制記錄,要想創建或修改保存的程序,你還需要SUPER權限,詳細描述見20.4節,“存儲子程序和觸發程序的二進制日志功能”。
通過CREATE和DROP權限,你可以創建新數據庫和表,或刪除(移掉)已有數據庫和表。如果你將mysql數據庫中的DROP權限授予某用戶,用戶可以刪掉MySQL訪問權限保存的數據庫。
SELECT、INSERT、UPDATE和DELETE權限允許你在一個數據庫現有的表上實施操作。
SELECT語句只有在他們真正從一個表中檢索行時才需要SELECT權限。一些SELECT語句不訪問表,甚至沒有任何到服務器上的數據庫里的存取任何東西的許可。例如,你可使用mysql客戶端作為一個簡單的計算器來評估未引用表的表達式:
mysql> SELECT 1+1;
mysql> SELECT PI()*2;
INDEX權限允許你創建或刪除索引。INDEX適用已有表。如果你具有某個表的CREATE權限,你可以在CREATE TABLE語句中包括索引定義。
通過ALTER權限,你可以使用ALTER TABLE來更改表的結構和重新命名表。
需要CREATE ROUTINE權限來創建保存的程序(函數和程序),ALTER ROUTINE權限來更改和刪除保存的程序,EXECUTE來執行保存的程序。
GRANT權限允許你把你自己擁有的那些權限授給其他的用戶。可以用于數據庫、表和保存的程序。
FILE權限給予你用LOAD DATA INFILE和SELECT ... INTO OUTFILE語句讀和寫服務器上的文件,任何被授予FILE權限的用戶都能讀或寫MySQL服務器能讀或寫的任何文件。(說明用戶可以讀任何數據庫目錄下的文件,因為服務器可以訪問這些文件)。 FILE權限允許用戶在MySQL服務器具有寫權限的目錄下創建新文件。不能覆蓋已有文件。
其余的權限用于管理性操作,它使用mysqladmin程序或SQL語句實施。下表顯示每個管理性權限允許你執行的mysqladmin命令:
權限 |
權限擁有者允許執行的命令 |
RELOAD |
flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload |
SHUTDOWN |
shutdown |
PROCESS |
processlist |
SUPER |
kill |
reload命令告訴服務器將授權表重新讀入內存。flush-privileges是reload的同義詞,refresh命令清空所有表并打開并關閉記錄文件,其它flush-xxx命令執行類似refresh的功能,但是范圍更有限,并且在某些情況下可能更好用。例如,如果你只是想清空記錄文件,flush-logs比refresh是更好的選擇。
shutdown命令關掉服務器。只能從mysqladmin發出命令。沒有相應的SQL語句。
processlist命令顯示在服務器內執行的線程的信息(即其它賬戶相關的客戶端執行的語句)。kill命令殺死服務器線程。你總是能顯示或殺死你自己的線程,但是你需要PROCESS權限來顯示或殺死其他用戶和SUPER權限啟動的線程。參見13.5.5.3節,“KILL語法”。
擁有LOCK TABLES權限便可以直接使用LOCK TABLES語句來鎖定你擁有SELECT權限的表。包括使用寫鎖定,可以防止他人讀鎖定的表。
擁有REPLICATION CLIENT權限便可以使用SHOW MASTER STATUS和SHOW SLAVE STATUS。
REPLICATION SLAVE權限應授予從服務器所使用的將當前服務器連接為主服務器的賬戶。沒有這個權限,從服務器不能發出對主服務器上的數據庫所發出的更新請求。
擁有SHOW DATABASES權限便允許賬戶使用SHOW DATABASE語句來查看數據庫名。沒有該權限的賬戶只能看到他們具有部分權限的數據庫, 如果數據庫用--skip-show-database選項啟動,則根本不能使用這些語句。請注意全局權限指數據庫的權限。
總的說來,只授予權限給需要他們的那些用戶是好主意,但是你應該在授予FILE和管理權限時試驗特定的警告:
- FILE權限可以被濫用于將服務器主機上MySQL能讀取的任何文件讀入到數據庫表中。包括任何人可讀的文件和服務器數據目錄中的文件。可以使用SELECT訪問數據庫表,然后將其內容傳輸到客戶端上。
- GRANT權限允許用戶將他們的權限給其他用戶。有不同的權限并有GRANT權限的2個用戶可以合并權限。
- ALTER權限可以用于通過重新命名表來推翻權限系統。
- SHUTDOWN權限通過終止服務器可以被濫用完全拒絕為其他用戶服務。
- PROCESS權限能被用來察看當前執行的查詢的明文文本,包括設定或改變密碼的查詢。
- SUPER權限能用來終止其它用戶或更改服務器的操作方式。
- 授給mysql數據庫本身的權限能用來改變密碼和其他訪問權限信息。密碼被加密存儲,所以惡意的用戶不能簡單地讀取他們以知道明文密碼。然而,具有user表Password列寫訪問權限的用戶可以更改賬戶的密碼,并可以用該賬戶連接MySQL服務器。
有一些事情你不能用MySQL權限系統做到:
- 你不能明顯地指定某個給定的用戶應該被拒絕訪問。即,你不能明顯地匹配用戶然后拒絕連接。
- 你不能指定用戶有權創建立或刪除數據庫中的表,但不能創建或刪除數據庫本身。