mysql權限管理

1、權限

命令標識mysql

受權表中對應的列sql

說明數據庫

CREATE服務器

Create_priv函數

建立數據庫、表或索引加密

CREATE TEMPORARY TABLESspa

Create_tmp_table_priv線程

建立臨時數據表對象

CREATE ROUTINEblog

Create_routine_priv

建立函數或存儲

CREATE VIEW

Create_view_priv

建立視圖

CREATE USER

Create_user_priv

建立用戶

EXECUTE

Execute_priv

執行函數或存儲過程

INDEX

Index_priv

創建索引

REFERENCES

References_priv

創建約束

DROP

Drop_priv

刪除表

SELECT

Select_priv

查詢數據

INSERT

Insert_priv

插入數據

UPDATE

Update_priv

更新數據

DELETE

Delete_priv

刪除數據

LOCK TABLES

Lock_tables_priv

鎖定表格

SHOW DATABASES

Show_db_priv

列出數據庫

SHOW VIEW

Show_view_priv

列出視圖

USAGE

 

只有登陸權限,其餘權限都沒有

ALL

 

全部權限,除了WITH GRANT OPTION

ALTER

Alter_priv

更改數據表

ALTER ROUTINE

Alter_routine_priv

更改函數或存儲過程

PROCESS

Process_priv

顯示鏈接進程和中斷鏈接進程

FILE

File_priv

載入文件

RELOAD

Reload_priv

能夠用FLUSH

REPLICATION CLIENT

Repl_client_priv

能夠檢查Masters和Slaves

REPLICATION SLAVE

Repl_slave_priv

在Slave裏的特殊權限

SHUTDOWN

Shutdown_priv

關閉MySQL

WITH GRANT OPTION

Grant_priv

能夠將本身擁有的權限賦給其餘用戶

SUPER

Super_priv

執行kill線程,change master、purge master logs、set global等命令的權限

create tablespace

Create_tablespace_priv 

建立表空間

Event

Event_priv 

肯定用戶可否建立、修改和刪除事件

Trigger

Trigger_priv 

肯定用戶可否建立和刪除觸發器

 

2、權限級別

一、global level 全局權限控制,全部的信息都保存在mysql.user表中。

二、database level 做用域爲指定某個數據庫中的全部對象,全部權限信息保存在mysql.db中。當執行grant命令時,經過「database.*」來限定做用域爲database整個數據庫;也能夠經過use命令選定受權的數據庫,而後經過「*」來限定做用域,這樣受權的做用域實際上就是當前選定的整個數據庫。

三、table level 做用範圍是受權語句中指定數據庫的指定表(database.table),權限信息保存在tables_priv中。

四、column level 做用域爲某個指定的列,權限信息保存在columns_priv中。column level級別的權限僅有insert、select、update這三種。語法格式:grant select(id,value) on test.t2 to ‘abc’@‘%’。給abc用戶授予 test數據庫t2表的id、value列select權限.

五、routine level 針對的主要對象時procedure和function。目前暫時只有execute和alter routine兩種。語法格式:grant execute on test.p1 to 'abc' @'%';

六、with grant option。在受權時加上此命令,被受權用戶有傳遞權限的權限。

3、權限查看和更改

一、新加權限或者用戶。 

  GRANT 權限 ON 庫名.表名 TO 新用戶名@主機名 IDENTIFIED BY ‘密碼‘;

  例:grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";新加的用戶名爲test1 ,密碼爲abc,對全部表有增刪查改的權限,在任何主機上能夠登陸。

 

二、查看權限。

   使用show grants 語句查看指定帳戶的權限;例如,要檢查Host和User值分別爲pc84.example.com和bob的帳戶所授予的權限,應經過語句:

mysql> SHOW GRANTS FOR 'bob'@'pc84.example.com';

 

三、更改權限。

   若經過直接修改權限表來更改權限,則修改完後都必需要執行「flush privileges」,通知mysql從新加載MySQL的權限信息;若是經過grant、revoke或drop user命令來修改權限,則不須要執行「flush privileges」命令。

 

四、權限更改什麼時候生效

當mysqld啓動時,全部受權表的內容被讀進內存而且今後時生效。

當服務器注意到受權表被改變了時,現存的客戶端鏈接有以下影響:

· 表和列權限在客戶端的下一次請求時生效。

· 數據庫權限改變在下一個USE db_name命令生效。

· 全局權限的改變和密碼改變在下一次客戶端鏈接時生效。

若是用GRANT、REVOKE或SET PASSWORD對受權表進行修改,服務器會注意到並當即從新將受權表載入內存。

若是你手動地修改受權表(使用INSERT、UPDATE或DELETE等等),你應該執行mysqladmin flush-privileges或mysqladmin reload告訴服務器再裝載受權表,不然你的更改將不會生效,除非你重啓服務器。

若是你直接更改了受權表但忘記重載,重啓服務器後你的更改方生效。這樣可能讓你迷惑爲何你的更改沒有什麼變化!

 

 

五、修改密碼

當使用setpassword、insert、update更改密碼時,必須使用PASSWORD()函數加密密碼。若果不使用PASSWORD()函數,密碼將不工做。

例如,下面的語句設置密碼,但沒能加密,所以用戶後面不能鏈接:

    mysql> SET PASSWORD FOR 'abe'@'host_name' = 'eagle';

相反,應這樣設置密碼:

mysql> SET PASSWORD FOR 'abe'@'host_name' = PASSWORD('eagle');

當使用GRANT或CREATE USER語句或mysqladmin password命令指定密碼時,不須要PASSWORD()函數,它們會自動使用PASSWORD()來加密密碼。

4、權限表列值的規則

一、user 、host 、db表中值的規則

· 通配符字符「%」和「_」可用於表的Host和Db列。它們與用LIKE操做符執行的模式匹配操做具備相同的含義。若是受權時你想使用某個字符,必須使用反斜現引用。例如,要想在數據庫名中包括下劃線(‘_’),在GRANT語句中用‘\_’來指定。

·在db表的'%'Host值意味着「任何主機」,在db表中空Host值意味着「對進一步的信息諮詢host表」。

·在host表的'%'或空Host值意味着「任何主機」。

·在三個表中的'%'或空Db值意味着「任何數據庫」。

·在user、db表中的空User值匹配匿名用戶

 

二、tables_priv和columns_priv表中值得規則

·通配符「%」並「_」可用在使用在兩個表的Host列。

·在兩個表中的'%'或空Host意味着「任何主機」。

·在兩個表中的Db、Table_name和Column_name列不能包含通配符或空。

三、mysql.host表的特殊點

mysql.host不是經過grant或revoke權限來授予或去除的,必須手工經過insert、update和delete命令來修改其中的數據。其中的權限沒法單獨生效,必須與mysql.db權限表一塊兒才能生效。當mysql.db中的信息不完整時,採起訪問mysql.host。

當想在db表的範圍以內擴展一個條目時,就會用到host表。舉例來講,若是某個db容許經過多個主機訪問的話,那麼超級用戶就可讓db表內將host列爲空,而後用必要的主機名填充host表。

5、訪問控制

階段1:鏈接覈實

當你試圖鏈接MySQL服務器時,服務器基於你的身份以及你是否能經過供應正確的密碼驗證身份來接受或拒絕鏈接。若是不是,服務器徹底拒絕你的訪問,不然,服務器接受鏈接,而後進入階段2而且等待請求。

你的身份基於2個信息:

·你從那個主機鏈接

·你的MySQL用戶名

身份檢查使用3個user表(Host, User和Password)範圍列執行。服務器只有在user表記錄的Host和User列匹配客戶端主機名和用戶名而且提供了正確的密碼時才接受鏈接。

 

階段2:請求覈實

一旦你創建了鏈接,服務器進入訪問控制的階段2。對在此鏈接上進來的每一個請求,服務器檢查你想執行什麼操做,而後檢查是否有足夠的權限來執行它。這正是在受權表中的權限列發揮做用的地方。這些權限能夠來自user、db、host、tables_priv或columns_priv表。

 

6、query 處理權限校驗流程

7、常作操做所需權限

一、備份

備份用戶會經過mysqldump來作備份,通常只須要用到select和lock tables 兩項權限。若是使用帶-tab選項的mysqldump來作tab分界符文件的導出,或者是用select into outfile,那麼還須要一個file權限。

例:grant select,lock tables,file on *.* to backup@localhost

爲了保證許多備份操做的一致性,還會用到flush tables with read lock,因此還須要reload權限。

 

二、操做和監控

維護系統或修復故障須要用到killshow命令,還須要關閉服務器。因此須要用到processshutdown權限。

相關文章
相關標籤/搜索