1.權限表
MYSQL是一個多用戶的數據庫,MYSQL的用戶可以分為兩大類:
(1) 超級管理員用戶(root),擁有全部權限
(2) 普通用戶,由root創建,普通用戶只擁有root所分配的權限
1.1 權限表的位置
數據庫:mysql
與權限相關的數據表:user,db,host,tables_priv,columns_priv,procs_priv等
1.2 user表
User表存儲了:
(1)用戶的信息:hots(用戶所在的主機),user(用戶名),password(密碼)
(2)用戶的權限信息:_priv
(3)安全性相關的信息:ssl_,x509,記錄用戶登錄的驗證操作等
(4)與資源分配相關的信息:max_,
max_questions表示用戶在一個小時內最多可以進行的查詢次數。
max_updates表示用戶在一個小時內最多可以進行的更新次數,也包括增加數據、刪除數據。
Max_connections:表示用戶最多可以建立的連接數
1.2.1 user表的內容
(1)host列
Localhost表示本機的用戶或者超級管理員
%表示任何主機上的root用戶
說明:_priv權限是全局權限,不受數據庫的范圍限制
1.3 DB表
(1)與用戶相關的字段:hots(用戶所在的主機),user(用戶名),
(2)與權限相關的字段:_priv,DB字段規定了_priv權限的有效范圍。
1.4 host表
(1)與用戶相關的字段:hots(用戶所在的主機)
(2)與權限相關的字段:_priv,DB字段規定了_priv權限的有效范圍。
說明:
(1) 記錄主機上的用戶對數據庫擁有的權限,側重點在主機,而不在用戶,例如假設select_priv=Y,那個這個主機上的所有數據庫用戶都擁有select權限。
(2) Host表的優先級大於db表,如果db表規定這個用戶沒有權限,但是host表規定了這台主機的用戶有權限,那么db的這個用戶也是擁有權限的。
1.5 tables_priv表
設定了用戶對某個表擁有的權限,該表記錄了用戶的信息,以及某個表的權限信息table_priv(select ,lnsert,alter等等),以及表上的某個列的權限信息column_priv。
1.6 column_priv表
記錄某用戶對某表的某個列所擁有的權限。
1.7procs_priv 表
規定了用戶關於存儲過程及存儲函數的操作權限,主要字段:proc_priv
2. 創建數據庫用戶
2.1 創建普通用戶
2.1.1 CREATE USER
CREATE USER ‘用戶名稱’ [@’主機名稱’]
例:CREATE USER 'user1';
驗證是否創建成功:
mysql> SELECT user FROM mysql.user;
+-------+
| user |
+-------+
| user1 |
| root |
| root |
| |
| pma |
| root |
+-------+
6 rows in set (0.00 sec) 說明新創建的用戶已經進入user表內
說明:使用CREATE USER來創建的用戶,均無任何權限,user表的權限字段的值均為N
(1)創建帶有主機名的用戶
CREATE USER ‘用戶名稱’ [@’主機名稱’] [INDENTIFIED BY ‘用戶密碼’]
CREATE USER 'user2' @'localhost';
mysql> select user,host from mysql.user;
+-------+---------------------+
| user | host |
+-------+---------------------+
| user1 | % |
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| pma | localhost |
| root | localhost |
| user2 | localhost |
+-------+---------------------+
7 rows in set (0.00 sec)
說明:host字段的%表示不受任何主機的限制
(2)創建帶密碼的用戶
CREATE USER 'user3' @'localhost' [INDENTIFIED BY ‘用戶密碼’];
例子:
CREATE USER 'user3' @'localhost' IDENTIFIED BY '123333';
驗證:
mysql> SELECT user,password,host FROM mysql.user;
+-------+-------------------------------------------------------------------------+-----------+
| user | password | host |
+-------+-------------------------------------------------------------------------+-----------+
| root | | localhost |
| root | | 127.0.0.1 |
| root | | ::1 |
| | | localhost |
| pma | | localhost |
| user1 | | % |
| user2 | | localhost |
| user3 | *0166E21E66009700F528CA21179AF9AD81120DA2 | localhost |
+-------+-------------------------------------------------------------------------+-----------+
8 rows in set (0.00 sec)
說明:密碼是哈希碼的形式顯示的
2.1.2 使用GRANT來創建用戶,以及授予權限
GRANT是用來給用戶授權的,但是也可以用來創建用戶,GRANT在給用戶進行授權的時候,如果用戶是不存在的,那么GRANT會自動創建這個用戶,然后再給這個用戶進行授權。
(1)添加權限
grant 權限 on 數據庫.表 to '用戶名'@'登錄主機' [INDENTIFIED BY ‘用戶密碼’];
權限: select ,update,delete,insert(表數據)、create,alert,drop(表結構)、references(外鍵)、create temporary tables(創建臨時表)、index(操作索引)、create view,show view(視圖)、create routine,alert routine,execute(存儲過程)、all,all privileges(所有權限)
數據庫:數據庫名或者*(所有數據庫)
表:表名或者*(某數據庫下所有表),*.*表示所有數據庫的所有表
主機:主機名或者%(任何其他主機)
例:grant selec,insert,update,delete on *.* to 'jifei'@'%';
GRANT SELECT ON *.* TO 'user4' @'localhost' IDENTIFIED BY '123333';
mysql> SELECT user,password,host FROM mysql.user;
+-------+-------------------------------------------------------------------------------+-----------+
| user | password | host |
+-------+-------------------------------------------------------------------------------+-----------+
| root | | localhost |
| root | | 127.0.0.1 |
| root | | ::1 |
| | | localhost |
| pma | | localhost |
| user1 | | % |
| user2 | | localhost |
| user3 | *0166E21E66009700F528CA21179AF9AD81120DA2 | localhost |
| user4 | *0166E21E66009700F528CA21179AF9AD81120DA2 | localhost |
+-------+-------------------------------------------------------------------------------+-----------+
9 rows in set (0.00 sec)
(2) 為用戶授予指定數據庫、指定表、指定列的權限:
GRANT UPDATE(cid,cname) ON mysqlpart2.custom TO 'user3'@'localhost';
授權成功后,可以在以下表中查看到授權信息:
數據庫: mysql » 表: tables_priv "Table privileges"
數據庫: mysql » 表: columns_priv "Column privileges"
(3)用戶權限表
位置:數據庫: information_schema »表: USER_PRIVILEGES
表的說明:
GRANTEE:授權者
PRIVILEGE_TYPE:權限名稱
用戶表:數據庫: mysql »表: user "Users and global privileges"
說明:user表中,”_priv”的值域USER_PRIVILEGES表的PRIVILEGE_TYPE的值是一一對應的。
(4)權限的層級關系
①權限的層級關系,就是指權限的適用范圍。
②權限的最高層級是全局級,所謂全局級就是可以在任何數據庫的任何數據表上進行操作。
③數據庫級:只能在某個數據庫上進行操作。
④表級:權限信息所在位置:數據庫: mysql »表: tables_priv "Table privileges"
⑤列級:權限信息所在位置:數據庫: mysql »表: columns_priv "Column privileges"
⑥子程序級:權限信息所在位置:數據庫: mysql »表: procs_priv "Procedure privileges"
(5)撤銷權限
REVOKE 權限 ON 數據庫.表 FROM '用戶名'@'登錄主機;
說明:賦權與撤銷權限的區別,就是REVOKE是將to改為from
例:revoke all on *.* from ‘jifei’ @’%’;
REVOKE UPDATE(cid,cname) ON mysqlpart2.custom FROM 'user3'@'localhost';
(6) 查看權限
SHOW GRANTS;//自己
SHOW GRANTS FOR 用戶名稱@主機名稱;
例:
SHOW GRANTS FOR dba@localhost;//指定用戶指定host
mysql> SHOW GRANTS FOR user3@localhost;
+---------------------------------------------------------------------------------------------------------------+
| Grants for user3@localhost |
+---------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'user3'@'localhost' IDENTIFIED BY PASSWORD '*975B2CD4FF9AE554FE8AD33168FBFC326D2021DD' |
| GRANT UPDATE (cname, cid) ON `mysqlpart2`.`custom` TO 'user3'@'localhost' |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
說明:所有SHOW關鍵字后面的詞都是復數,所有CREATE關鍵字后面的詞都是單數
通過mysql.columns_priv表來查看權限:
SELECT * FROM mysql.columns_priv WHERE user='user3' AND host='localhost';
mysql> SELECT * FROM mysql.columns_priv WHERE user='user3' AND host='localhost'\G
*************************** 1. row ***************************
Host: localhost
Db: mysqlpart2
User: user3
Table_name: custom
Column_name: cid
Timestamp: 0000-00-00 00:00:00
Column_priv: Update
*************************** 2. row ***************************
Host: localhost
Db: mysqlpart2
User: user3
Table_name: custom
Column_name: cname
Timestamp: 0000-00-00 00:00:00
Column_priv: Update
2 rows in set (0.00 sec)
2.1.3 關於以直接向user表插入記錄的方式來創建用戶
可以使用INSERT的方式,直接向user表插入記錄,以此來創建用戶,但是因為user表的字段很多,而且全部字段均不允許為空,這就需要為每一個列賦值,所以不推薦使用這種方式來創建用戶。
2.1.4 CREATE USER 與 GRANT 兩種方式創建用戶的區別
(1)CREATE USER 創建用戶的優點:語法簡單
(2)CREATE USER 創建用戶的不足:用戶無權限
(3)GRANT 創建用戶的優勢:創建的用戶有權限
(4)GRANT 創建用戶的不足:語法較CREATE USER 繁瑣
3. 刪除MYSQL的用戶
delete from mysql.user where user='用戶名稱' and host='主機名稱';
例:DELETE FROM mysql.user WHERE user='user3' AND host='localhost';
刪除后使用:FLUSH PRIVILEGES 來刷新權限
說明:
使用DELETET刪除用戶后,必須使用FLUSH PRIVILEGES 來刷新權限,否則將無法繼續創建用戶名與已刪用戶的用戶名相同的用戶,即使在user表中看不到已刪除的用戶,如果不刷新權限,也是無法再新建的。
例:
刪除用戶user3:
mysql> DELETE FROM mysql.user WHERE user='user3' AND host='localhost';
Query OK, 1 row affected (0.00 sec)
查看用戶表,user3已刪除成功:
mysql> select user from mysql.user;
+-------+
| user |
+-------+
| user1 |
| root |
| root |
| |
| pma |
| root |
| user2 |
| user4 |
+-------+
8 rows in set (0.00 sec)
創建用戶user3失敗:
mysql> CREATE USER 'user3' @'localhost' IDENTIFIED BY 'pwd';
ERROR 1396 (HY000): Operation CREATE USER failed for 'user3'@'localhost'
刷新權限:
FLUSH PRIVILEGES;
再次創建用戶,成功:
mysql> CREATE USER 'user3' @'localhost' IDENTIFIED BY 'pwd';
Query OK, 0 rows affected (0.00 sec)
4. 修改用戶密碼:
UPDATE mysql.user SET password=PASSWORD('新密碼') WHERE user='用戶名
[AND host=’主機名稱’]';
UPDATE mysql.user SET password=PASSWORD('111111') WHERE user='root';
注意:
(1)如果不加WHERE 條件,則會把所有用戶的密碼都修改為’新密碼’
(2)密碼修改完成后,需要進行權限刷新操作才能生效,FLUSH PRIVILEGES;
例:
UPDATE mysql.user SET password=PASSWORD('111') WHERE user='user1';
(1)修改密碼的權限
ROOT用戶可以修改自己的密碼,也可以修改其他用戶的密碼
其他用戶只能修改自己的密碼
(2)PASSWORD函數
用於把密碼明文進行加密,所得到的密碼為原密碼的哈希值。
例:
mysql> SELECT PASSWORD('111');
+-------------------------------------------+
| PASSWORD('111') |
+-------------------------------------------+
| *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |
+-------------------------------------------+
1 row in set (0.07 sec)
(3)ROOT用戶、普通用戶修改自己的密碼
SET PASSWORD=PASSWORD(‘新密碼’);
(4)ROOT 用戶為其他用戶修改密碼:
SET PASSWORD FOR ‘用戶名稱’ @’主機名稱’ = password(‘新密碼’);
例,以下兩種修改密碼的方式結果相同:
SET PASSWORD FOR 'user1' @'%'=PASSWORD('111');
UPDATE mysql.user SET password=PASSWORD('111') WHERE user='user1';