MySQL用戶和權限管理



 

 

總共28個權限:下面是具體的權限介紹:轉載的,記錄一下:

一.權限表

mysql數據庫中的3個權限表:user 、db、 host

權限表的存取過程是:

1)先從user表中的host、 user、 password這3個字段中判斷連接的IP、用戶名、密碼是否存在表中,存在則通過身份驗證;

2)通過權限驗證,進行權限分配時,按照useràdbàtables_privàcolumns_priv的順序進行分配。即先檢查全局權限表user,如果user中對應的權限為Y,則此用戶對所有數據庫的權限都為Y,將不再檢查db, tables_priv,columns_priv;如果為N,則到db表中檢查此用戶對應的具體數據庫,並得到db中為Y的權限;如果db中為N,則檢查tables_priv中此數據庫對應的具體表,取得表中的權限Y,以此類推。

二.MySQL各種權限(共27個)

(以下操作都是以root身份登陸進行grant授權,以p1@localhost身份登陸執行各種命令。)

1. usage

連接(登陸)權限,建立一個用戶,就會自動授予其usage權限(默認授予)。

mysql> grant usage on *.* to ‘p1′@’localhost’ identified by ‘123′;

該權限只能用於數據庫登陸,不能執行任何操作;且usage權限不能被回收,也即REVOKE用戶並不能刪除用戶。

2. select

必須有select的權限,才可以使用select table

mysql> grant select on pyt.* to ‘p1′@’localhost’;

mysql> select * from shop;

3. create

必須有create的權限,才可以使用create table

mysql> grant create on pyt.* to ‘p1′@’localhost’;

4. create routine

必須具有create routine的權限,才可以使用{create |alter|drop} {procedure|function}

mysql> grant create routine on pyt.* to ‘p1′@’localhost’;

當授予create routine時,自動授予EXECUTE, ALTER ROUTINE權限給它的創建者:

mysql> show grants for ‘p1′@’localhost’;

+—————————————————————————+

Grants for p1@localhost

+————————————————————————–+

| GRANT USAGE ON *.* TO ‘p1′@’localhost’ IDENTIFIED BY PASSWORD ‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257′ |

| GRANT SELECT, CREATE, CREATE ROUTINE ON `pyt`.* TO ‘p1′@’localhost’|

| GRANT EXECUTE, ALTER ROUTINE ON PROCEDURE `pyt`.`pro_shop1` TO ‘p1′@’localhost’ |

+————————————————————————————-+

5. create temporary tables(注意這里是tables,不是table)

必須有create temporary tables的權限,才可以使用create temporary tables.

mysql> grant create temporary tables on pyt.* to ‘p1′@’localhost’;

[mysql@mydev ~]$ mysql -h localhost -u p1 -p pyt

mysql> create temporary table tt1(id int);

6. create view

必須有create view的權限,才可以使用create view

mysql> grant create view on pyt.* to ‘p1′@’localhost’;

mysql> create view v_shop as select price from shop;

7. create user

要使用CREATE USER,必須擁有mysql數據庫的全局CREATE USER權限,或擁有INSERT權限。

mysql> grant create user on *.* to ‘p1′@’localhost’;

或:mysql> grant insert on *.* to p1@localhost;

8. insert

必須有insert的權限,才可以使用insert into ….. values….

9. alter

必須有alter的權限,才可以使用alter table

alter table shop modify dealer char(15);

10. alter routine

必須具有alter routine的權限,才可以使用{alter |drop} {procedure|function}

mysql>grant alter routine on pyt.* to ‘p1′@’ localhost ‘;

mysql> drop procedure pro_shop;

Query OK, 0 rows affected (0.00 sec)

mysql> revoke alter routine on pyt.* from ‘p1′@’localhost’;

[mysql@mydev ~]$ mysql -h localhost -u p1 -p pyt

mysql> drop procedure pro_shop;

ERROR 1370 (42000): alter routine command denied to user ‘p1′@’localhost’ for routine ‘pyt.pro_shop’

11. update

必須有update的權限,才可以使用update table

mysql> update shop set price=3.5 where article=0001 and dealer=’A';

12. delete

必須有delete的權限,才可以使用delete from ….where….(刪除表中的記錄)

13. drop

必須有drop的權限,才可以使用drop database db_name; drop table tab_name;

drop view vi_name; drop index in_name;

14. show database

通過show database只能看到你擁有的某些權限的數據庫,除非你擁有全局SHOW DATABASES權限。

對於p1@localhost用戶來說,沒有對mysql數據庫的權限,所以以此身份登陸查詢時,無法看到mysql數據庫:

mysql> show databases;

+——————–+

| Database |

+——————–+

| information_schema|

| pyt |

| test |

+——————–+

15. show view

必須擁有show view權限,才能執行show create view。

mysql> grant show view on pyt.* to p1@localhost;

mysql> show create view v_shop;

16. index

必須擁有index權限,才能執行[create |drop] index

mysql> grant index on pyt.* to p1@localhost;

mysql> create index ix_shop on shop(article);

mysql> drop index ix_shop on shop;

17. excute

執行存在的Functions,Procedures

mysql> call pro_shop1(0001,@a);

+———+

| article |

+———+

| 0001 |

| 0001 |

+———+

mysql> select @a;

+——+

| @a |

+——+

| 2 |

+——+

18. lock tables

必須擁有lock tables權限,才可以使用lock tables

mysql> grant lock tables on pyt.* to p1@localhost;

mysql> lock tables a1 read;

mysql> unlock tables;

19. references

有了REFERENCES權限,用戶就可以將其它表的一個字段作為某一個表的外鍵約束。

20. reload

必須擁有reload權限,才可以執行flush [tables | logs | privileges]

mysql> grant reload on pyt.* to p1@localhost;

ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

mysql> grant reload on *.* to ‘p1′@’localhost’;

Query OK, 0 rows affected (0.00 sec)

mysql> flush tables;

21. replication client

擁有此權限可以查詢master server、slave server狀態。

mysql> show master status;

ERROR 1227 (42000): Access denied; you need the SUPER,REPLICATION CLIENT privilege for this operation

mysql> grant Replication client on *.* to p1@localhost;

或:mysql> grant super on *.* to p1@localhost;

mysql> show master status;

+——————+———-+————–+——————+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+——————+———-+————–+——————+

| mysql-bin.000006 | 2111 | | |

+——————+———-+————–+——————+

mysql> show slave status;

22. replication slave

擁有此權限可以查看從服務器,從主服務器讀取二進制日志。

mysql> show slave hosts;

ERROR 1227 (42000): Access denied; you need the REPLICATION SLAVE privilege for this operation

mysql> show binlog events;

ERROR 1227 (42000): Access denied; you need the REPLICATION SLAVE privilege for this operation

mysql> grant replication slave on *.* to p1@localhost;

mysql> show slave hosts;

Empty set (0.00 sec)

mysql>show binlog events;

+—————+——-+—————-+———–+————-+————–+

| Log_name | Pos | Event_type | Server_id| End_log_pos|Info | 

+—————+——-+————–+———–+————-+—————+

| mysql-bin.000005 | 4 | Format_desc | 1 | 98 | Server ver: 5.0.77-log, Binlog ver: 4 | |mysql-bin.000005|98|Query|1|197|use `mysql`; create table a1(i int)engine=myisam|

……………………………………

23. Shutdown

關閉MySQL:

[mysql@mydev ~]$ mysqladmin shutdown

重新連接:

[mysql@mydev ~]$ mysql

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

[mysql@mydev ~]$ cd /u01/mysql/bin

[mysql@mydev bin]$ ./mysqld_safe &

[mysql@mydev bin]$ mysql

24. grant option

擁有grant option,就可以將自己擁有的權限授予其他用戶(僅限於自己已經擁有的權限)

mysql> grant Grant option on pyt.* to p1@localhost;

mysql> grant select on pyt.* to p2@localhost;

25. file

擁有file權限才可以執行 select ..into outfile和load data infile…操作,但是不要把file, process, super權限授予管理員以外的賬號,這樣存在嚴重的安全隱患。

mysql> grant file on *.* to p1@localhost;

mysql> load data infile ‘/home/mysql/pet.txt’ into table pet;

26. super

這個權限允許用戶終止任何查詢;修改全局變量的SET語句;使用CHANGE MASTER,PURGE MASTER LOGS。

mysql> grant super on *.* to p1@localhost;

mysql> purge master logs before ‘mysql-bin.000006′;

27. process

通過這個權限,用戶可以執行SHOW PROCESSLIST和KILL命令。默認情況下,每個用戶都可以執行SHOW PROCESSLIST命令,但是只能查詢本用戶的進程。

mysql> show processlist;

+—-+——+———–+——+———+——+——-+——————+

| Id | User | Host | db | Command | Time | State | Info |

+—-+——+———–+——+———+——+——-+——————+

| 12 | p1 | localhost | pyt | Query | 0 | NULL | show processlist |

+—-+——+———–+——+———+——+——-+——————+

另外,

管理權限(如 super, process, file等)不能夠指定某個數據庫,on后面必須跟*.*

mysql> grant super on pyt.* to p1@localhost;

ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

mysql> grant super on *.* to p1@localhost;

Query OK, 0 rows affected (0.01 sec)

https://blog.csdn.net/wulantian/article/details/38230635





MySQL用戶權限表

MySQL的認證是“用戶”加“主機”而權限是訪問資源對象,MySQL服務器通過權限表來控制用戶對數據庫的訪問,權限表存放在mysql數據庫中,由mysql_install_db腳本初始化。存儲賬戶權限信息表主要有:user,db,tables_priv,columns_priv,procs_priv這五張表(5.6之前還有host表,現在已經把host內容整合進user表),五張表其含義分別是:

user表

user表時MySQL中最重要的一個權限表,記錄允許連接到服務器的賬號信息,里面的權限是全局級的。例如:一個用戶在user表中被授予了DELETE權限,則該用戶可以刪除MySQL服務器上所有數據庫的任何記錄。MySQL5.6中user表有43個字段,這些字段大概可以分為4類,分別是用戶列、權限列、安全列和資源控制列,詳細解釋如下圖:

MySQL用戶和權限管理

db表

db表存儲了用戶對某個數據庫的操作權限,決定用戶能從哪個主機存儲哪個數據庫。User表中存儲了某個主機對數據庫的操作權限,配置和db權限表對給定主機上數據庫級操作權限做更細致的控制。這個權限表不受GRANT和REVOKE語句的影響,字段大致可以分為兩類:用戶列和權限列,詳細解釋如下圖:

MySQL用戶和權限管理

tables_priv and columns_priv表

tables_priv表用來對表設置操作權限,有8個字段分別是Host、Db、User、Table_name、Grantor、Timestamp、Table_priv和Column_priv,各個字段說明如下:

1)  Host、Db、User和Table_name4個字段分表示主機名、數據庫名、用戶名和表明。

2)  Grantor表示修改該記錄的用戶。

3)  Timestamp字段表示修改該記錄的時間。

4)  Table_priv表示對表的操作權限包括、select、insert、update、delete、create、drop、grant、references、index和alter。

5)  Column_priv字段表示對表中的列的操作權限,包括select、insert、update和references。

procs_priv表

存儲過程和存儲函數相關的權限,分別是Host、Db、User、Routine_name、Routine_type、Grantor、Proc_priv和Timestamp,各個字段的說明如下:

1)  Host、Db和User字段分別表示主機名、數據庫名和用戶名。Routine_name表示存儲過程或函數的名稱。

2)  Routine_type表示存儲過程或函數的類型。

3)  Routine_type字段有兩個值,分別是FUNCTION和PROCEDURE。FUNCTION表示這是一個函數;PROCEDURE表示這是一個存儲過程。

4)  Grantor是插入或修改該記錄的用戶。

5)  Proc_priv表示擁有的權限,包括Execute、Alter Routine、Grant這3種。

6) Timestamp表示記錄更新時間。

MySQL訪問控制兩階段

階段1:客戶端連接核實階段

階段2:客戶端操作核實階段

客戶端連接核實階段,當連接MySQL服務器時,服務器基於用戶的身份以及用戶是否能通過正確的密碼身份驗證,來接受或拒絕連接。即客戶端用戶連接請求中會提供用戶名稱、主機地址和密碼,MySQL使用user表中的三個字段(Host、User、Password)執行身份檢查,服務器只有在user表記錄的Host和User字段匹配客戶端主機名和用戶名,並且提供正確的面貌時才接受連接。如果連接核實沒有通過,服務器完全拒絕訪問;否則,服務器接受連接,然后進入階段2等待用戶請求。

客戶端操作核實階段,當客戶端的連接請求被MySQL服務器端通過其身份認證后。那么接下來就可以發送數據庫的操作命令給服務器端處理,服務器檢查用戶要執行的操作,在確認權限時,MySQL首先檢查user表,如果指定的權限沒有在user表中被授權;MySQL將檢查db表,db表時下一安全層級,其中的權限限定於數據庫層級,在該層級的SELECT權限允許用戶查看指定數據庫的所有表中的數據;如果在該層級沒有找到限定的權限,則MySQL繼續檢查tables_priv表以及columns_priv表,如果所有權限表都檢查完畢,但還是沒有找到允許的權限操作,MySQL將返回錯誤信息,用戶請求的操作不能執行,操作失敗。其過程大概如下圖:

MySQL用戶和權限管理

MySQL用戶及密碼管理

MySQL提供許多語句用來管理用戶賬號,這些語句可以用來管理包括登陸和退出MySQL服務器、創建用戶、刪除用戶、密碼管理和權限管理等內容。MySQL數據庫的安全性,需要通過賬戶管理來保證。下面介紹四種用來管理賬號密碼的方式:

1)通過Mysqladmin工具(只能改密碼)

2)通過CREATE USER語句

創建登錄用戶,MySQL的登錄用戶必須是’USERNAME’@’HOST’(用戶名加主機名),如’mysql’@’172.16.16.1′,含義是只有在172.16.16.1這台主機上才可以使用mysql用戶登錄MySQL數據庫(還可以指定只允許登錄那個數據庫)。

HOST的表現方式:

1. IP地址,如172.16.16.1;

2. 主機名,如localhost;

3. 網絡地址,如172.16.0.0

4. 通配符,如

%:匹配任意字符

_:匹配任意單個字符如172.16.16._(允許172.16.16.1-172.16.16.9)

3)通過直接修改mysql.user表的用戶記錄

 

4)通過GRANT指令(只能用於添加新用戶)

雖然介紹了好幾種方法創建用戶,但真正在使用中,最好直接使用GRANT或者CREATE USER語句,而不要直接將用戶信息插入user表中,因為user表中存儲了全局級別的權限以及其他的賬戶信息,如果意外破壞了user表中的記錄,則可能會對MySQL服務器造成很大的影響。

MySQL管理員密碼找回

1)關閉MySQL

 

2)在配置文件中[mysqld]字段添加skip-grant-tables指令,跳過授權表

3)給root用戶登錄mysql設置密碼為redhat並以加密方式

MySQL5.7修改密碼

 

MySQL權限管理

權限管理主要是對登錄到MySQL的用戶進行權限驗證,所有用戶的權限都存儲在MySQL的權限表中,不合理的權限規划會給MySQL服務器帶來安全隱患。數據庫管理員要對所有用戶的權限進行合理規划管理。MySQL權限系統的主要功能時證實連接到一台給定主機的用戶,並且賦予該用戶在數據庫上的SELECT/INSERT/UPDATE和DELETE權限。

一、MySQL權限說明

賬戶權限信息被存儲在MySQL數據庫的幾張權限表中,在MySQL啟動時,服務器將這些數據庫表中權限信息的內容讀入內存。其中GRANT和REVOKE語句所涉及的常用權限大致如下這些:CREATE、DROP、SELECT、INSERT、UPDATE、DELETE、INDEX、ALTER、CREATE、ROUTINE、FILE等,還有一個特殊的proxy權限,是用來賦予某個用戶具有給他人賦予權限的權限。

二、MySQL用戶授權

授權就是為某個用戶授予權限,合理的授權可以保證數據庫的安全,MySQL中可以使用GRANT語句為用戶授予權限。授權可以分為多個層次:

全局層級:全局權限適用於一個給定服務器中的所有數據庫,這些權限存儲在mysql.user表中。

數據庫層級:數據庫權限適用於一個給定數據庫中的所有目標,這些權限存儲在mysql.db表中。

表層級:表權限適用於一個給定表中的所有列,這些權限存儲在mysql.tables_priv表中。

列層級:列權限使用於一個給定表中的單一列,這些權限存儲在mysql.columns_priv表中。

子程序層級:CREATE ROUTINE、ALTER ROUTINE、EXECUTE和GRANT權限適用於已存儲的子程序。這些權限可以被授予為全局層級和數據庫層級。而且,除了CREATE ROUTINE外,這些權限可以被授予子程序層級,並存儲在mysql.procs_priv表中。

PS:MySQL中必須擁有GRANT權限的用戶才可以執行GRANT語句。

1)GRANT賦予用戶權限

all表示賦予用戶全部權限(包含存儲過程、存儲函數等創建和執行)。當數據庫名稱.表名稱被*.*代替,表示賦予用戶操作服務器上所有數據庫所有表的權限。用戶地址可以是localhost,也可以是ip地址、機器名字、域名。也可以用’%’表示從任何地址連接。而’連接口令’不能為空,否則創建失敗。

2)REVOKE移除用戶權限

3)SHOW查看用戶的權限

PS:使用REVOKE收回權限之后,用戶帳戶的記錄將從db、host、tables_priv、columns_priv表中刪除,但是用戶帳號記錄依然在user表中保存。

三、PROXY特殊權限

如果想讓某個用戶具有給他人賦予權限的能力,那么就需要proxy權限了。當你給一個用戶賦予all權限之后,你查看mysql.user表會發現Grant_priv字段還是為N,表示其沒有給他人賦予權限的權限。

我們可以查看一下系統默認的超級管理員權限:

可以看到其本身有PROXY權限,並且這個語句跟一般授權語句還不太一樣。所以如果想讓一個遠程用戶有給他人賦予權限的能力,就需要給此用戶PROXY權限,如下:

四、數據庫開發人員,創建表、索引、視圖、存儲過程、函數等權限授權

grant創建、修改、刪除MySQL數據表結構權限

grant操作MySQL外鍵權限

grant操作MySQL臨時表權限。

grant操作MySQL索引權限

grant操作MySQL視圖、查看視圖源代碼 權限

grant操作MySQL存儲過程、存儲函數權限

等等。。。

 http://www.ywnds.com/?p=3714



MySQL修改密碼

第一種方式:

最簡單的方法就是借助第三方工具Navicat for MySQL來修改,方法如下:

1、登錄mysql到指定庫,如:登錄到test庫。

2、然后點擊上方“用戶”按鈕。

3、選擇要更改的用戶名,然后點擊上方的“編輯用戶”按鈕。

4、出現如圖界面,輸入新密碼,並確認新密碼,點擊“保存”按鈕即可。

 

 

第二種方式:

方法1: 用SET PASSWORD命令   

首先登錄MySQL。  

格式:mysql> set password for 用戶名@localhost = password('新密碼');  

例子:mysql> set password for root@localhost = password('123');  

方法2:用mysqladmin   

格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼  

例子:mysqladmin -uroot -p123456 password 123  

方法3:用UPDATE直接編輯user表   

首先登錄MySQL。  

mysql> use mysql;  

mysql> update user set password=password('123') where user='root' and host='localhost';  

mysql> flush privileges;  

方法4:在忘記root密碼的時候,可以這樣   

以windows為例:   

1. 關閉正在運行的MySQL服務。  

2. 打開DOS窗口,轉到mysql\bin目錄。  

3. 輸入mysqld --skip-grant-tables 回車。--skip-grant-tables 的意思是啟動MySQL服務的時候跳過權限表認證。  

4. 再開一個DOS窗口(因為剛才那個DOS窗口已經不能動了),轉到mysql\bin目錄。  

5. 輸入mysql回車,如果成功,將出現MySQL提示符 >。  

6. 連接權限數據庫: use mysql; 。  

7. 改密碼:update user set password=password("123") where user="root";(別忘了最后加分號) 。  

8. 刷新權限(必須步驟):flush privileges; 。  

 9. 退出 quit。  

10. 注銷系統,再進入,使用用戶名root和剛才設置的新密碼123登錄。

第三種方式:

  1. 打開mysql.exe和mysqld.exe所在的文件夾,復制路徑地址

    mysql數據庫忘記密碼時如何修改
  2. 2

    打開cmd命令提示符,進入上一步mysql.exe所在的文件夾。

    mysql數據庫忘記密碼時如何修改
  3. 3

    輸入命令  mysqld --skip-grant-tables  回車,此時就跳過了mysql的用戶驗證。注意輸入此命令之后命令行就無法操作了,此時可以再打開一個新的命令行。注意:在輸入此命令之前先在任務管理器中結束mysqld.exe進程,確保mysql服務器端已結束運行。

    mysql數據庫忘記密碼時如何修改
  4. 4

    然后直接輸入mysql,不需要帶任何登錄參數直接回車就可以登陸上數據庫。

    mysql數據庫忘記密碼時如何修改
  5. 5

    輸入show databases;   可以看到所有數據庫說明成功登陸。

    mysql數據庫忘記密碼時如何修改
  6. 6

    其中mysql庫就是保存用戶名的地方。輸入 use mysql;   選擇mysql數據庫。

    mysql數據庫忘記密碼時如何修改
  7. 7

    show tables查看所有表,會發現有個user表,這里存放的就是用戶名,密碼,權限等等賬戶信息。

    mysql數據庫忘記密碼時如何修改
  8. 8

    輸入select user,host,password from user;   來查看賬戶信息。

    mysql數據庫忘記密碼時如何修改
  9. 9

    更改root密碼,輸入update user set password=password('123456') where user='root' and host='localhost';

    mysql數據庫忘記密碼時如何修改
  10. 10

    再次查看賬戶信息,select user,host,password from user;   可以看到密碼已被修改。

    mysql數據庫忘記密碼時如何修改
  11. 11

    退出命令行,重啟mysql數據庫,用新密碼嘗試登錄。

    mysql數據庫忘記密碼時如何修改
  12. 12

    測試不帶密碼登錄mysql,發現還是能夠登陸上,但顯示數據庫時只能看到兩個數據庫了,說明重啟之后跳過密碼驗證已經被取消了。

    mysql數據庫忘記密碼時如何修改
  13. 13

    我這地方重啟數據庫之后之所以不帶密碼任然能夠登錄是因為我的數據庫里存在設無須口令的賬戶。

    mysql數據庫忘記密碼時如何修改

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM