成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

帶您深入了解MySQL的權限管理

數據庫 MySQL
MySQL 的權限表在數據庫啟動的時候就載入內存,當用戶通過身份認證后,就在內存中進行相應權限的存取,這樣,此用戶就可以在數據庫中做權限范圍內的各種操作了。

關于MySQL的權限管理,你了解嗎?

MySQL 的權限表在數據庫啟動的時候就載入內存,當用戶通過身份認證后,就在內存中進行相應權限的存取,這樣,此用戶就可以在數據庫中做權限范圍內的各種操作了。

一、權限表的存取

在權限存取的兩個過程中,系統會用到 “mysql” 數據庫(安裝 MySQL 時被創建,數據庫名稱叫“mysql”) 中 user、host 和 db 這3個最重要的權限表。

在這 3 個表中,最重要的表示 user 表,其次是 db 表,host 表在大多數情況下并不使用。

user 中的列主要分為 4 個部分:用戶列、權限列、安全列和資源控制列。

通常用的最多的是用戶列和權限列,其中權限列又分為普通權限和管理權限。普通權限用于數據庫的操作,比如 select_priv、super_priv 等。

當用戶進行連接時,權限表的存取過程有以下兩個過程:

  • 先從 user 表中的 host、user 和 password 這 3 個字段中判斷連接的 IP、用戶名、和密碼是否存在于表中,如果存在,則通過身份驗證,否則拒絕連接。
  • 如果通過身份驗證、則按照以下權限表的順序得到數據庫權限:user -> db -> tables_priv -> columns_priv。

在這幾個權限表中,權限范圍依次遞減,全局權限覆蓋局部權限。上面的***階段好理解,下面以一個例子來詳細解釋一下第二階段。

為了方便測試,需要修改變量 sql_mode

  1. // sql_mode 默認值中有 NO_AUTO_CREATE_USER (防止GRANT自動創建新用戶,除非還指定了密碼) 
  2.  
  3. SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' 

1. 創建用戶 zj@localhost,并賦予所有數據庫上的所有表的 select 權限

  1. MySQL [mysql]> grant select on *.* to zj@localhost; 
  2. Query OK, 0 rows affected, 2 warnings (0.00 sec) 
  3.  
  4. MySQL [mysql]> select * from user where user="zj" and host='localhost' \G; 
  5. *************************** 1. row *************************** 
  6.                   Host: localhost 
  7.                   User: zj 
  8.            Select_priv: Y 
  9.            Insert_priv: N 
  10.            Update_priv: N 
  11.            Delete_priv: N 
  12.            Create_priv: N 
  13.              Drop_priv: N 
  14.            Reload_priv: N 
  15. ...  

2. 查看 db 表

  1. MySQL [mysql]> select * from db where user='zj' \G ; 
  2.  
  3. Empty set (0.00 sec)  

可以發現,user 表的 select_priv 列是 “Y”,而 db 表中并沒有記錄,也就是說,對所有數據庫都具有相同的權限的用戶并不需要記錄到 db 表,而僅僅需要將 user 表中的 select_priv 改為 “Y” 即可。換句話說,user 表中的每個權限都代表了對所有數據庫都有權限。

3. 將 zj@localhost 上的權限改為只對 t2 數據庫上所有表的 select 權限。

  1. MySQL [mysql]> revoke select on *.* from zj@localhost; 
  2. Query OK, 0 rows affected, 1 warning (0.02 sec) 
  3.  
  4. MySQL [mysql]> grant select on t2.* to zj@localhost; 
  5. Query OK, 0 rows affected, 1 warning (0.04 sec) 
  6.  
  7. MySQL [mysql]> select * from user where user='zj' \G; 
  8. *************************** 1. row *************************** 
  9.                   Host: localhost 
  10.                   User: zj 
  11.            Select_priv: N 
  12.            Insert_priv: N 
  13.            Update_priv: N 
  14.            Delete_priv: N 
  15.            Create_priv: N 
  16.              Drop_priv: N 
  17.            Reload_priv: N 
  18. ... 
  19.  
  20. MySQL [mysql]> select * from db where user='zj' \G; 
  21. *************************** 1. row *************************** 
  22.                  Host: localhost 
  23.                    Db: t2 
  24.                  User: zj 
  25.           Select_priv: Y 
  26.           Insert_priv: N 
  27.           Update_priv: N 
  28.           Delete_priv: N 
  29.           Create_priv: N 
  30.             Drop_priv: N 
  31.            Grant_priv: N  

這時候發現,user 表中的 select_priv 變為 “N” ,而 db 表中增加了 db 為 t2 的一條記錄。也就是說,當只授予部分數據庫某些權限時,user 表中的相應權限列保持 “N”,而將具體的數據庫權限寫入 db 表。table 和 column 的權限機制和 db 類似。

從上例可以看出,當用戶通過權限認證,進行權限分配時,將按照 user -> db -> tables_priv -> columns_priv 的順序進行權限分配,即先檢查全局權限表 user,如果 user 中對應 權限為 “Y”,則此用戶對所有數據庫的權限都為“Y”,將不再檢查 db、tables_priv 和 columns_priv;如果為“N”,則到 db 表中檢查此用戶對應的具體數據庫,并得到 db 中為 “Y”的權限;如果 db 中相應權限為 “N”,則再依次檢查tables_priv 和 columns_priv 中的權限,如果所有的都為“N”,則判斷為不具備權限。

二、賬號管理

主要包括賬號的創建,權限的更改和賬號的刪除。

1. 創建賬號

使用 grant 語法創建,示例:

(1) 創建用戶 zj ,權限為可以在所有數據庫上執行所有權限,只能從本地進行連接。

  1. MySQL [mysql]> grant all privileges on *.* to zj@localhost; 
  2. Query OK, 0 rows affected, 2 warnings (0.00 sec) 
  3.  
  4. MySQL [mysql]> select * from user where user="zj" and host="localhost" \G; 
  5. *************************** 1. row *************************** 
  6.                   Host: localhost 
  7.                   User: zj 
  8.            Select_priv: Y 
  9.            Insert_priv: Y 
  10.            Update_priv: Y 
  11.            Delete_priv: Y 
  12.            Create_priv: Y 
  13.              Drop_priv: Y 
  14.            Reload_priv: Y 
  15.          Shutdown_priv: Y  

可以發現,除了 grant_priv 權限外,所有權限在 user 表里面都是 “Y”。

(2) 在 (1) 基礎上,增加對 zj 的 grant 權限

  1. MySQL [(none)]> grant all privileges on *.* to zj@localhost with grant option
  2. Query OK, 0 rows affected, 1 warning (0.01 sec) 
  3.  
  4. MySQL [mysql]> select * from user where user="zj" and host='localhost' \G ; 
  5. *************************** 1. row *************************** 
  6.                   Host: localhost 
  7.                   User: zj 
  8.            Select_priv: Y 
  9.            Insert_priv: Y 
  10.            Update_priv: Y 
  11.            Delete_priv: Y 
  12.            Create_priv: Y 
  13.              Drop_priv: Y 
  14.            Reload_priv: Y 
  15.          Shutdown_priv: Y 
  16.           Process_priv: Y 
  17.              File_priv: Y 
  18.             Grant_priv: Y 
  19. ...  

(3) 在 (2) 基礎上,設置密碼為 “123”

  1. MySQL [mysql]> grant all  privileges on *.* to zj@localhost identified by '123' with grant option
  2. Query OK, 0 rows affected, 2 warnings (0.01 sec) 
  3.  
  4. MySQL [mysql]> select * from user where user="zj" and host="localhost" \G ; 
  5. *************************** 1. row *************************** 
  6.                   Host: localhost 
  7.                   User: zj 
  8.            Select_priv: Y 
  9.            Insert_priv: Y 
  10.            Update_priv: Y 
  11.            Delete_priv: Y 
  12.            Create_priv: Y 
  13.              Drop_priv: Y 
  14.            Reload_priv: Y 
  15. ......   
  16.  authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E0***A257 
  17.       password_expired: N 
  18.  password_last_changed: 2017-09-25 20:29:42 
  19.      password_lifetime: NULL  

可以發現,密碼變成了一堆加密后的字符串。

(4) 創建新用戶 zj2,可以從任何 IP 連接,權限為對 t2 數據庫里的所有表進行 select 、update、insert 和 delete 操作,初始密碼為“123”

  1. MySQL [mysql]> grant select ,insert, update,delete on t2.* to 'zj2'@'%' identified by '123'; 
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. MySQL [mysql]> select * from user where user='zj2' and host="%" \G; 
  5. *************************** 1. row *************************** 
  6.                   Host: % 
  7.                   User: zj2 
  8.            Select_priv: N 
  9.            Insert_priv: N 
  10.            Update_priv: N 
  11.            Delete_priv: N 
  12.            Create_priv: N 
  13.              Drop_priv: N 
  14. ...... 
  15.  authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E0***A257 
  16.       password_expired: N 
  17.  password_last_changed: 2017-09-25 20:37:49 
  18.      password_lifetime: NULL 
  19.  
  20. MySQL [mysql]> select * from db where user="zj2" and host='%' \G; 
  21. *************************** 1. row *************************** 
  22.                  Host: % 
  23.                    Db: t2 
  24.                  User: zj2 
  25.           Select_priv: Y 
  26.           Insert_priv: Y 
  27.           Update_priv: Y 
  28.           Delete_priv: Y 
  29.           Create_priv: N 
  30.             Drop_priv: N 
  31. ......  

user 表中的權限都是“N”,db 表中增加的記錄權限則都是“Y”。一般的,只授予用戶適當的權限,而不會授予過多的權限。

本例中的 IP 限制為所有 IP 都可以連接,因此設置為 “*”,mysql 數據庫中是通過 user 表的 host 字段來進行控制,host 可以是以下類型的賦值。

  • Host 值可以是主機名或IP號,或 “localhost” 指出本地主機。
  • 可以在 Host 列值使用通配符字符 “%” 和 “_”
  • Host 值 “%” 匹配任何主機名,空 Host 值等價于 “%”,它們的含義與 like 操作符的模式匹配操作相同。

注意: mysql 數據庫的 user 表中 host 的值為 “*” 或者空,表示所有外部 IP 都可以連接,但是不包括本地服務器 localhost,因此,如果要包括本地服務器,必須單獨為 localhost 賦予權限。

(5) 授予 super、process、file 權限給用戶 zj3@%

  1. MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%'
  2.  
  3. Query OK, 0 rows affected, 1 warning (0.00 sec)  

因為這幾個權限都是屬于管理權限,因此不能夠指定某個數據庫,on 后面必須跟 “.”,下面語法將提示錯誤

  1. MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%'
  2.  
  3. ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES  

(6) 只授予登錄權限給 zj4@localhost

  1. MySQL [mysql]> grant usage on *.* to 'zj4'@'localhost'
  2. Query OK, 0 rows affected, 2 warnings (0.01 sec) 
  3.  
  4. MySQL [mysql]> exit 
  5. Bye 
  6.  
  7. zj@bogon:~$ mysql -uzj4 -p 
  8. Enter password:  
  9. Welcome to the MySQL monitor.  Commands end with ; or \g. 
  10. Your MySQL connection id is 78 
  11. Server version: 5.7.18-log Source distribution 
  12.  
  13. Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. 
  14.  
  15. Oracle is a registered trademark of Oracle Corporation and/or its 
  16. affiliates. Other names may be trademarks of their respective 
  17. owners. 
  18.  
  19. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
  20.  
  21. MySQL [(none)]> show databases; 
  22. +--------------------+ 
  23. Database           | 
  24. +--------------------+ 
  25. | information_schema | 
  26. +--------------------+ 
  27. 1 row in set (0.02 sec)  

usage 權限只能用于數據庫登錄,不能執行任何操作

2. 查看賬號權限

賬號創建好后,可以通過如下命令查看權限:

  1. show grants for user@host; 

示例:

  1. MySQL [(none)]> show grants for zj@localhost; 
  2. +-------------------------------------------------------------------+ 
  3. | Grants for zj@localhost                                           | 
  4. +-------------------------------------------------------------------+ 
  5. GRANT ALL PRIVILEGES ON *.* TO 'zj'@'localhost' WITH GRANT OPTION | 
  6. +-------------------------------------------------------------------+ 
  7. 1 row in set (0.01 sec)  

3. 更改賬號權限

可以進行權限的新增和回收。和創建賬號一樣,權限變更也有兩種方法:使用 grant(新增) 和 revoke (回收) 語句,或者更改權限表。

示例:

(1) zj4@localhost 目前只有登錄權限

  1. MySQL [(none)]> show grants for zj4@localhost; 
  2. +-----------------------------------------+ 
  3. | Grants for zj4@localhost                | 
  4. +-----------------------------------------+ 
  5. GRANT USAGE ON *.* TO 'zj4'@'localhost' | 
  6. +-----------------------------------------+ 
  7. 1 row in set (0.00 sec)  

(2) 賦予 zj4@localhost 所有數據庫上的所有表的 select 權限

  1. MySQL [(none)]> grant select on *.* to 'zj4'@'localhost'
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. MySQL [(none)]> show grants for zj4@localhost; 
  5. +------------------------------------------+ 
  6. | Grants for zj4@localhost                 | 
  7. +------------------------------------------+ 
  8. GRANT SELECT ON *.* TO 'zj4'@'localhost' | 
  9. +------------------------------------------+ 
  10. 1 row in set (0.00 sec)  

(3) 繼續給 zj4@localhost 賦予 select 和 insert 權限,和已有的 select 權限進行合并

  1. MySQL [(none)]> show grants for 'zj4'@'localhost'
  2. +--------------------------------------------------+ 
  3. | Grants for zj4@localhost                         | 
  4. +--------------------------------------------------+ 
  5. GRANT SELECTINSERT ON *.* TO 'zj4'@'localhost' | 
  6. +--------------------------------------------------+ 
  7. 1 row in set (0.00 sec)  

revoke 語句可以回收已經賦予的權限,對于上面的例子,這里決定要收回 zj4@localhost 上的 insert 和 select 權限:

  1. MySQL [(none)]> revoke select,insert on *.* from zj4@localhost; 
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. MySQL [(none)]> show grants for zj4@localhost; 
  5. +-----------------------------------------+ 
  6. | Grants for zj4@localhost                | 
  7. +-----------------------------------------+ 
  8. GRANT USAGE ON *.* TO 'zj4'@'localhost' | 
  9. +-----------------------------------------+ 
  10. 1 row in set (0.00 sec)  

usage 權限不能被回收,也就是說,revoke 用戶并不能刪除用戶。

4. 修改賬號密碼

(1) 可以用 mysqladmin 命令在命令行指定密碼。

  1. shell> mysqladmin -u user_name -h host_name password "123456" 

(2) 執行 set password 語句。

  1. mysql> set password for 'username'@'%' = password('pwd'); 

如果是更改自己的密碼,可以省略 for 語句

  1. mysql> set password=password('pwd'); 

(3) 可以在全局級別使用 grant usage 語句(在“.”)來指定某個賬戶的密碼而不影響賬戶當前的權限。

  1. mysql> grant usage on *.* to 'username'@'%' identified by 'pwd'

5. 刪除賬號

要徹底的刪除賬號,可以使用 drop user :

  1. drop user zj@localhost; 

6. 賬號資源限制

創建 MySQL 賬號時,還有一類選項稱為賬號資源限制,這類選項的作用是限制每個賬號實際具有的資源限制,這里的“資源”主要包括:

  • max_queries_per_hour count : 單個賬號每小時執行的查詢次數
  • max_upodates_per_hour count : 單個賬號每小時執行的更新次數
  • max_connections_per_hour count : 單個賬號每小時連接服務器的次數
  • max_user_connections count : 單個賬號并發連接服務器的次數 
責任編輯:龐桂玉 來源: segmentfault
相關推薦

2010-10-12 15:30:04

MySQL權限管理

2010-10-28 10:19:29

oracle權限管理

2010-10-14 11:25:39

2010-10-15 11:27:21

Mysql臨時表

2010-10-15 15:32:06

Mysql外部鎖定

2010-11-22 11:09:00

MySQL索引類型

2010-10-11 16:45:18

MySQL ifnul

2010-10-14 11:33:42

MySQL用戶

2010-10-09 14:08:52

MYSQL Cast函

2010-11-19 15:53:28

oracle管理表空間

2010-11-16 14:43:25

Oracle SQL計

2010-10-29 10:04:27

2010-11-11 13:39:57

SQL連接查詢

2010-10-19 13:26:45

SQL Server事

2010-09-28 10:46:39

sql字段類型

2010-10-27 15:58:01

Oracle臨時表

2010-10-29 14:57:12

Oracle歸檔模式

2010-10-26 11:28:33

ORACLE運行方式

2010-11-01 15:06:52

MYSQL字符串連接

2010-11-08 10:16:41

SQL Server數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产电影一区二区 | 中文字幕日韩欧美一区二区三区 | 久久亚洲视频网 | 欧美一区二区三区在线观看视频 | 成人激情视频在线播放 | 97精品国产97久久久久久免费 | 亚洲精品视频一区 | 国产高清在线精品一区二区三区 | 免费黄色片在线观看 | 亚洲精品www. | 在线播放中文字幕 | 精品1区 | 国产精品久久久久久久久久久久午夜片 | 欧美亚洲另类在线 | 韩日在线视频 | 国产成人综合久久 | 欧美成人影院 | 国产欧美日韩在线一区 | 视频一区二区在线观看 | 欧美一级二级三级视频 | 成人h视频在线 | 麻豆视频在线免费观看 | 午夜一区二区三区在线观看 | 在线观看av网站永久 | 午夜a√| 精品久久久久久久久久久久久久 | 国产欧美在线 | 国产资源网 | 在线一区 | 一级片免费视频 | 色综合一区二区三区 | 天天爱天天操 | 日韩欧美在线观看视频网站 | 免费黄色录像视频 | 日韩一区二区三区在线观看视频 | 亚洲国产成人精品久久 | 久久99精品久久久久久秒播九色 | 久久精品二区亚洲w码 | 99精品欧美一区二区蜜桃免费 | 国产精品久久久久久久久久 | av 一区二区三区 |