先上總結圖:
對于賦予權限或者收回權限還是創建用戶,都會涉及兩個操作:
1、磁盤,mysql.user表,用戶行所有表示權限的字段的值的修改
2、內存,acl_users找到用戶對應的對象,將access值修改
grant授權
創建用戶 ’ua’@’%’,密碼是 pa
create user 'ua'@'%' identified by 'pa';
全局權限
grant all privileges on *.* to 'ua'@'%' with grant option;
grant命令對于全局權限,同時更新了磁盤和內存。命令完成后即時生效,接下來新創建的連接也會使用新權限
2、對于一個已經存在的連接,它的全局權限不受grant命令影響。(也就是說,如果全局權限信息已經在線程對象中,revoke操作影響布道這個線程對象)
回收權限可以這樣:
revoke all privileges on *.* from 'ua'@'%';
庫級別權限
grant all privileges on db1.* to 'ua'@'%' with grant option;
只要拿到了庫的權限,在切換出這個庫之前,線程對象對這個庫一直有權限。而只connect而不use,也就是沒有拿到庫的權限,這個庫權限被收走后,該線程對象就操作不了這個庫了。對于一個已經存在的連接,它的庫權限受grant命令影響
表權限和列權限
賦權語句如下:
create table db1.t1(id int, a int);
grant all privileges on db1.t1 to 'ua'@'%' with grant option;
GRANT SELECT(id), INSERT (id,a) ON mydb.mytbl TO 'ua'@'%' with grant option;
與db權限類似,對于這個兩個權限的操作,也會馬上影響到已經存在的連接。
flush privileges命令
該命令會清空acl_users
數組,然后從mysql.user
表中讀取數據重新加載,重新構造一個acl_user
數組。
即以數據表中的數據為準,會將全局、db、表、列權限內存數組重新加載一遍
用途:正常的grant命令之后,沒有必要跟著執行flush privileges
只有當磁盤數據表中權限數據和內存中的權限數據不一致時,才需要該語句來重建內存數據,達到一致狀態。
就如上面情況。