這些信息會(huì)被頻繁訪問,所以會(huì)加載到內(nèi)存里。如果手動(dòng)修改了上述的表,就需要調(diào)用FLUSH PRIVILEGES來重新加載內(nèi)存。 通過GRANT,REVOKE, CREATE USER, DROP USER來修改權(quán)限的話,就會(huì)自動(dòng)更新內(nèi)存里的權(quán)限信息,無需調(diào)用FLUSH PRIVILEGES
3、主要依靠這幾張表中存儲(chǔ)的權(quán)限信息。?
表名
代表的權(quán)限級別
mysql.User
global level
mysql.db
database level
mysql.table_priv
table level
mysql.column_priv
column level?
查詢權(quán)限的時(shí)候,也是從global -> db -> table ....level從大到小的順序查詢的。 也就是說,如果mysql.User表中有匹配到row,就會(huì)使用該行數(shù)據(jù)進(jìn)行權(quán)限判斷,不會(huì)再繼續(xù)往后查找是否還有匹配的信息了。 如果查詢到多行,則會(huì)使用host信息最接近的,其余的都不會(huì)使用。
4、授予或者取消用戶的權(quán)限
1、global level權(quán)限
其作用域是所有數(shù)據(jù)庫中的所有對象。要授予global level權(quán)限,只需在執(zhí)行GRANT命令時(shí),用“*.*”指定適用范圍是Global即可GRANT SELECT,UPDATE,DELETE,INSERT ON *.* TO 'username'@'localhost'
@后面的是用戶的來訪主機(jī)
2、database level
其作用域是整個(gè)數(shù)據(jù)庫中所有的對象。database level相對于global level少了以下幾個(gè)權(quán)限。CREATE USER、FILE、PROCESS、RELOAD、REPLICATION CLIENT、REPLICATION SLAVE、SHOW DATABASES、SHUTDOWN、SUPER和USAGE。要授予database level權(quán)限,只需通過"database.*"即可
GRANT ALTER ON test.* TO 'username'@'localhost';獲取用戶在某個(gè)來訪主機(jī)下的訪問權(quán)限:
SHOW GRANTS FOR username@localhost也可以先通過USE一個(gè)數(shù)據(jù)庫,把作用域限定在該數(shù)據(jù)庫下,然后直接"*"即可。
USE test;
GRANT ALTER ON * TO 'username'@'localhost';給多個(gè)用戶授權(quán),用,分隔即可。
grant create on perf.* to 'abc'@'localhost','def'@'localhost';username@host表示授予的用戶以及允許該用戶登錄的IP地址。其中Host有以下幾種類型:
localhost:只允許該用戶在本地登錄,不能遠(yuǎn)程登錄。
%:允許在除本機(jī)之外的任何一臺(tái)機(jī)器遠(yuǎn)程登錄。
192.168.52.32:具體的IP表示只允許該用戶從特定IP登錄。
3、table level
授予table level權(quán)限,通過"database.table"即可。
僅有ALTER,CREATE,DELETE,DROP,INDEX,SELECT,INSERT,UPDATE八種權(quán)限。grant INDEX ON `test`.`t1` TO 'abc'@'%.xxx.com';
把INDEX權(quán)限,在t1表的權(quán)限,授予abc用戶。該用戶的來訪主機(jī)必須是.xxx.com后綴的。
4、column level
方法如下:
grant select(id,value) ON test.t2 TO 'abc'@'localhost';
5、routine level
只有EXECUTE,ALTER ROUTINE兩種,針對procedure(存儲(chǔ)過程)和function(函數(shù))
如:grant EXECUTE ON test.p1 to 'abc'@'localhost'; 注意: GRANT權(quán)限很特殊,擁有GRANT權(quán)限的用戶,可以將自身擁有的任何權(quán)限都授予其他用戶。 可以通過GRANT ALL語句,把某個(gè)level的所有可用權(quán)限授予某個(gè)用戶。 grant all on test.t5 to 'abc';grant all on perf.* to 'abc';show grants for 'abc'; 注意:即使內(nèi)存里的權(quán)限信息更新了。 global level的權(quán)限也不會(huì)對已經(jīng)連接上的session生效,而是對新建的連接生效。 db level的權(quán)限,只有在use db命令執(zhí)行后才會(huì)生效 table、column的權(quán)限,有需使用權(quán)限的query請求時(shí)就會(huì)生效。
5、查看用戶權(quán)限
查看當(dāng)前用戶自己的權(quán)限: show grants; 查看其他 MySQL 用戶權(quán)限: show grants for?dba@localhost;
6、撤銷用戶權(quán)限
使用revoke 命令來注銷用戶的權(quán)限,具體語法: 要撤銷所有權(quán)限,需使用以下語法。此語法用于取消對于已命名的用戶的所有全局層級、數(shù)據(jù)庫層級、表層級和列層級的權(quán)限。 REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] … 指定具體的權(quán)限: REVOKE SELECT FROM username@localhost 注意: 使用GRANT或REVOKE,操作者必須擁有GRANT OPTION權(quán)限. 2 使用REVOKE撤銷全部權(quán)限, 操作者必須擁有mysql數(shù)據(jù)庫的全局CREATE USER權(quán)限或UPDATE權(quán)限。