一、權限
| 命令標識 |
授權表中對應的列 |
說明 |
| CREATE |
Create_priv |
創建數據庫、表或索引 |
| CREATE TEMPORARY TABLES |
Create_tmp_table_priv |
創建臨時數據表 |
| CREATE ROUTINE |
Create_routine_priv |
創建函數或存儲 |
| CREATE VIEW |
Create_view_priv |
創建視圖 |
| CREATE USER |
Create_user_priv |
創建用戶 |
| EXECUTE |
Execute_priv |
執行函數或存儲過程 |
| INDEX |
Index_priv |
建立索引 |
| REFERENCES |
References_priv |
建立約束 |
| DROP |
Drop_priv |
刪除表 |
| SELECT |
Select_priv |
查詢數據 |
| INSERT |
Insert_priv |
插入數據 |
| UPDATE |
Update_priv |
更新數據 |
| DELETE |
Delete_priv |
刪除數據 |
| LOCK TABLES |
Lock_tables_priv |
鎖定表格 |
| SHOW DATABASES |
Show_db_priv |
列出數據庫 |
| SHOW VIEW |
Show_view_priv |
列出視圖 |
| USAGE |
只有登錄權限,其他權限都沒有 |
|
| ALL |
所有權限,除了WITH GRANT OPTION |
|
| ALTER |
Alter_priv |
更改數據表 |
| ALTER ROUTINE |
Alter_routine_priv |
更改函數或存儲過程 |
| PROCESS |
Process_priv |
顯示連接進程和中斷連接進程 |
| FILE |
File_priv |
載入文件 |
| RELOAD |
Reload_priv |
可以用FLUSH |
| REPLICATION CLIENT |
Repl_client_priv |
可以檢查Masters和Slaves |
| REPLICATION SLAVE |
Repl_slave_priv |
在Slave里的特殊權限 |
| SHUTDOWN |
Shutdown_priv |
關閉MySQL |
| WITH GRANT OPTION |
Grant_priv |
可以將自己擁有的權限賦給其他用戶 |
| SUPER |
Super_priv |
執行kill線程,change master、purge master logs、set global等命令的權限 |
| create tablespace |
Create_tablespace_priv |
創建表空間 |
| Event |
Event_priv |
確定用戶能否創建、修改和刪除事件 |
| Trigger |
Trigger_priv |
確定用戶能否創建和刪除觸發器 |
二、權限級別
1、global level 全局權限控制,所有的信息都保存在mysql.user表中。
2、database level 作用域為指定某個數據庫中的所有對象,所有權限信息保存在mysql.db中。當執行grant命令時,通過“database.*”來限定作用域為database整個數據庫;也可以通過use命令選定授權的數據庫,然后通過“*”來限定作用域,這樣授權的作用域實際上就是當前選定的整個數據庫。
3、table level 作用范圍是授權語句中指定數據庫的指定表(database.table),權限信息保存在tables_priv中。
4、column level 作用域為某個指定的列,權限信息保存在columns_priv中。column level級別的權限僅有insert、select、update這三種。語法格式:grant select(id,value) on test.t2 to ‘abc’@‘%’。給abc用戶授予 test數據庫t2表的id、value列select權限.
5、routine level 針對的主要對象時procedure和function。目前暫時只有execute和alter routine兩種。語法格式:grant execute on test.p1 to 'abc' @'%';
6、with grant option。在授權時加上此命令,被授權用戶有傳遞權限的權限。
三、權限查看和更改
1、新加權限或者用戶。
GRANT 權限 ON 庫名.表名 TO 新用戶名@主機名 IDENTIFIED BY ‘密碼‘;
例:grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";新加的用戶名為test1 ,密碼為abc,對所有表有增刪查改的權限,在任何主機上可以登錄。
2、查看權限。
使用show grants 語句查看指定賬戶的權限;例如,要檢查Host和User值分別為pc84.example.com和bob的賬戶所授予的權限,應通過語句:
mysql> SHOW GRANTS FOR 'bob'@'pc84.example.com';
3、更改權限。
若通過直接修改權限表來更改權限,則修改完后都必須要執行“flush privileges”,通知mysql重新加載MySQL的權限信息;如果通過grant、revoke或drop user命令來修改權限,則不需要執行“flush privileges”命令。
4、權限更改何時生效
當mysqld啟動時,所有授權表的內容被讀進內存並且從此時生效。
當服務器注意到授權表被改變了時,現存的客戶端連接有如下影響:
· 表和列權限在客戶端的下一次請求時生效。
· 數據庫權限改變在下一個USE db_name命令生效。
· 全局權限的改變和密碼改變在下一次客戶端連接時生效。
如果用GRANT、REVOKE或SET PASSWORD對授權表進行修改,服務器會注意到並立即重新將授權表載入內存。
如果你手動地修改授權表(使用INSERT、UPDATE或DELETE等等),你應該執行mysqladmin flush-privileges或mysqladmin reload告訴服務器再裝載授權表,否則你的更改將不會生效,除非你重啟服務器。
如果你直接更改了授權表但忘記重載,重啟服務器后你的更改方生效。這樣可能讓你迷惑為什么你的更改沒有什么變化!
5、修改密碼
當使用setpassword、insert、update更改密碼時,必須使用PASSWORD()函數加密密碼。若果不使用PASSWORD()函數,密碼將不工作。
例如,下面的語句設置密碼,但沒能加密,因此用戶后面不能連接:
mysql> SET PASSWORD FOR 'abe'@'host_name' = 'eagle';
相反,應這樣設置密碼:
mysql> SET PASSWORD FOR 'abe'@'host_name' = PASSWORD('eagle');
當使用GRANT或CREATE USER語句或mysqladmin password命令指定密碼時,不需要PASSWORD()函數,它們會自動使用PASSWORD()來加密密碼。
四、權限表列值的規則
1、user 、host 、db表中值的規則
· 通配符字符“%”和“_”可用於表的Host和Db列。它們與用LIKE操作符執行的模式匹配操作具有相同的含義。如果授權時你想使用某個字符,必須使用反斜現引用。例如,要想在數據庫名中包括下划線(‘_’),在GRANT語句中用‘\_’來指定。
·在db表的'%'Host值意味着“任何主機”,在db表中空Host值意味着“對進一步的信息咨詢host表”。
·在host表的'%'或空Host值意味着“任何主機”。
·在三個表中的'%'或空Db值意味着“任何數據庫”。
·在user、db表中的空User值匹配匿名用戶
2、tables_priv和columns_priv表中值得規則
·通配符“%”並“_”可用在使用在兩個表的Host列。
·在兩個表中的'%'或空Host意味着“任何主機”。
·在兩個表中的Db、Table_name和Column_name列不能包含通配符或空。
3、mysql.host表的特殊點
mysql.host不是通過grant或revoke權限來授予或去除的,必須手工通過insert、update和delete命令來修改其中的數據。其中的權限無法單獨生效,必須與mysql.db權限表一起才能生效。當mysql.db中的信息不完整時,采取訪問mysql.host。
當想在db表的范圍之內擴展一個條目時,就會用到host表。舉例來說,如果某個db允許通過多個主機訪問的話,那么超級用戶就可以讓db表內將host列為空,然后用必要的主機名填充host表。
五、訪問控制
階段1:連接核實
當你試圖連接MySQL服務器時,服務器基於你的身份以及你是否能通過供應正確的密碼驗證身份來接受或拒絕連接。如果不是,服務器完全拒絕你的訪問,否則,服務器接受連接,然后進入階段2並且等待請求。
你的身份基於2個信息:
·你從那個主機連接
·你的MySQL用戶名
身份檢查使用3個user表(Host, User和Password)范圍列執行。服務器只有在user表記錄的Host和User列匹配客戶端主機名和用戶名並且提供了正確的密碼時才接受連接。
階段2:請求核實
一旦你建立了連接,服務器進入訪問控制的階段2。對在此連接上進來的每個請求,服務器檢查你想執行什么操作,然后檢查是否有足夠的權限來執行它。這正是在授權表中的權限列發揮作用的地方。這些權限可以來自user、db、host、tables_priv或columns_priv表。
六、query 處理權限校驗流程

七、常做操作所需權限
1、備份
備份用戶會通過mysqldump來做備份,一般只需要用到select和lock tables 兩項權限。如果使用帶-tab選項的mysqldump來做tab分界符文件的導出,或者是用select into outfile,那么還需要一個file權限。
例:grant select,lock tables,file on *.* to backup@localhost
為了保證許多備份操作的一致性,還會用到flush tables with read lock,所以還需要reload權限。
2、操作和監控
維護系統或修復故障需要用到kill或show命令,還需要關閉服務器。所以需要用到process和shutdown權限。
