MySQL受權系統主要經過五個表(user、db、host、tables_priv和columns_priv)來實現,其中用於訪問數據庫的各類用戶信息都保存在mysql庫的user表中。帳戶權限信息被存儲在mysql數據庫的user、db、host、tables_priv、columns_priv和procs_priv表中。html
user表——該表決定是否容許用戶鏈接到服務器。若是容許鏈接,權限字段則爲該用戶的全局權限。mysql
db表——用於決定哪些用戶能夠從哪些主機訪問哪些數據庫。包含在db表中的權限適用於這個表標識的數據庫。sql
host表——當您想在db表的範圍以內擴展一個條目時,就會用到這個表。舉例來講,若是某個db容許經過多個主機訪問的話,那麼超級用戶就可讓db表內將host列爲空,而後用必要的主機名填充host表。數據庫
tables_priv表——該表與db表類似,不一樣之處是它用於表而不是數據庫。這個表還包含一個其餘字段類型,包括timestamp和grantor兩個字段,用於存儲時間戳和受權方。在本文後面咱們會對這個表作進一步的講解。服務器
columns_priv——該表做用幾乎與db和tables_priv表同樣,不一樣之處是它提供的是針對某些表的特定列的權限。ide
權限表的存取過程是:工具
1) 先從user表中的host、 user、 password這3個字段中判斷鏈接的IP、用戶名、密碼是否存在表中,存在則經過身份驗證;htm
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,以此類推。對象
更詳細參考:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#what-privileges繼承
1.建立用戶
1) 可使用CREATE USER用於建立新的MySQL帳戶, CREATE USER會在沒有權限的mysql.user表中建立一個新記錄。若是 帳戶已經存在,則出現錯誤。
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
mysql>create user test1@'localhost' identified by '12345'; --test1只能本地訪問
mysql>create user test2@'%' identified by '12345'; --test2能夠遠程訪問
mysql>create user test3@’172.21.78.89’ identified by ‘12345’; --test3僅從172.21.78.89上訪問
create user test3@172.21.78.89 identified by ‘12345’;
mysql>create user test4@172.21.78.% identified by ‘12345’; --test4能夠從172.21.78.*網段上訪問
2) 也可使用grant語句,GRANT語句的主要用途是來給賬戶受權的,但也可用來創建新賬戶並同時受權。
mysql>grant select,insert,update,delete on mydb.* to test1@localhost identified by "123456";
能夠在hostname中指定通配符。例如user_name@'%.loc.gov'適用於在loc.gov域中的任何主機的user_name。同時user_name@'144.155.166.%'適用於144.155.166 C級子網中的任何主機的user_name。簡單形式user_name是user_name@'%'的同義詞。
3) 能夠直接用INSERT語句建立相同的帳戶,而後使用FLUSH PRIVILEGES告訴服務器重載受權表。
mysql> insert into mysql.user(Host,User,Password) values("localhost","test3",password("12345"));
mysql>flush privileges;
第一種和第三種建立用戶後還須要進行受權。
2.數據庫用戶受權
GRANT權限列表 ON 庫名.表名TO 用戶名@來源地址[ IDENTIFIEDBY ‘密碼‘]
使用GRANT語句的注意事項:
■ 權限列表:用於列出受權使用的各類數據庫操做,以逗號分隔。All表示全部權限;
■ 庫名.表名:用於指定受權操做的庫和表的名稱,其中可使用「*」。如:使用「mydb.*」表示受權操做的對象爲mydb庫中的全部表。
■ 用戶名@來源地址:用於指定用戶名稱和容許訪問的客戶機地址,即誰能鏈接、能從哪裏鏈接。來源的地址能夠是域名、IP地址,還可使用「%」通配符,表示某個區域或網段內的全部地址。如:「%.example.com」、「172.168.10.%」等
■ IDENTIFIED BY:設置用戶鏈接數據庫時所使用的密碼字符串。在新建用戶時,若省略則用戶的密碼將爲空。
■ 使用GRANT語句受權的用戶記錄,會保存到mysql庫的user、db、host、tables_priv等。
例:添加一個名爲test1的數據庫用戶,並容許其從本機訪問,對mydb庫中的全部表具備查詢權限,驗證密碼爲「12345」。
mysql> GRANT select ON mydb.* TO 'test1'@'localhost' IDENTIFIED BY '12345';
例:增長一個test2用戶,密碼爲12345,能夠在任何主機上登陸,並對全部數據庫有查詢,增長,修改和刪除的功能。
mysql>grant select, insert, update, delete on *.* to test2@'%' identified by '12345';
例:增長一個test3用戶,密碼爲12345,只能在172.21.78.89上登陸,並對mydb數據庫有查詢,增長,修改和刪除的功能。
mysql>grant select, insert, update, delete on mydb.* to test3@172.21.78.89 identified by '12345';
例:受權用戶test4擁有數據庫mydb的全部權限
mysql>grant all privileges on mydb.* to test4@localhost identified by '12345';
例:建立一個只容許從本地登陸的超級用戶test5,並容許將權限賦予別的用戶,密碼爲12345
mysql>GRANT ALL PRIVILEGES ON *.* TO test5@localhost IDENTIFIED BY '12345' WITH GRANT OPTION;
例:建立一個通常應用程序用戶,並只須要SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES等權限,若有存儲過程還須要加上EXECUTE權限。指定登陸網段172.21.78網段。
mysql>GRANT USAGE,SELECT, INSERT, UPDATE, DELETE, SHOW VIEW ,CREATE TEMPORARY TABLES,EXECUTE ON mydb.* TO test6@'172.21.78.%' IDENTIFIED BY '12345';
例:建立一個普通用戶(僅有查詢權限)
mysql>GRANT USAGE,SELECT ON mydb.* TO test7@'172.21.78.%' IDENTIFIED BY '12345';
3.查看用戶權限
查看服務器庫中全部用戶列表(由於用戶信息保存在mysql.user表中,故可從該表中查看)
mysql> select distinct concat('user:',user,'@',host,':') as query from mysql.user;
+---------------------------+
| query |
+---------------------------+
| user:test1@%: |
| user:test2@%: |
| user:test3@172.21.78.89: |
| user:test4@172.21.78.%: |
| user:test5@172.21.78.89: |
| user:root@localhost: |
| user:test1@localhost: |
| user:test2@localhost: |
+---------------------------+
8 rows in set (0.59 sec)
或者使用 select * from mysql.user 可看到相關權限等信息。
查看當前登錄用戶
mysql> select user();
+----------------+
| user() |
+----------------+
| test2@localhost |
+----------------+
1 row in set (0.00 sec)
USER()或SYSTEM_USER() 返回當前登錄用戶名
SESSION_USER() 和 USER() 具備相同的意義
SYSTEM_USER() 和 USER() 具備相同的意義
CURRENT_USER, CURRENT_USER() 返回當前會話被驗證的用戶名和主機名組合
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| test2@localhost |
+----------------+
1 row in set (0.00 sec)
查看權限:
SHOW GRANTS 語句: SHOWGRANTSFOR 用戶名@來源地址
例:mysql> show grants for test1;
+------------------------------------------------------------------------------------------------------------------------------+
| Grants for test1@% |
+------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show grants for test2;
+------------------------------------------------------------------------------------------------------+
| Grants for test2@% |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test2'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |
+------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
例:查看用戶test5從主機172.21.78.89訪問數據庫時得受權信息。
mysql> show grants for test5@172.21.78.89;
+-----------------------------------------------------------------------------------------------------------------+
| Grants for test5@172.21.78.89 |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test5'@'172.21.78.89' IDENTIFIED BY PASSWORD '*00A51F3F
48415C7D4E8908980D443C29C69B60C9' |
+-----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
注意:使用show grants for test5查看不到相關信息。
mysql> show grants for test5;
ERROR 1141 (42000): There is no such grant defined for user 'test5' on host '%'
4.撤銷權限:
REVOKE 語句:用於撤銷指定用戶的數據庫權限,撤銷權限後的用戶仍然能夠鏈接到mysql服務器,但將禁止執行對應的數據庫操做:
格式:REVOKE權限列表ON 數據庫名.表名FROM用戶名@來源地址
如:撤銷用戶test5從172.21.78.89訪問數據庫的全部權限:
mysql> revoke all on *.* from test5@172.21.78.89;
Query OK, 0 rows affected (0.00 sec)
5.刷新權限
當mysqld服務器啓動時,將受權表的內容讀入到內存中。你能夠經過FLUSH PRIVILEGES語句或執行mysqladmin flush-privileges或mysqladmin reload命令讓它從新讀取表。
Flush privileges使權限生效,尤爲在對那些權限表user、db、host等作了update或者delete更新的時候。
mysql>FLUSH PRIVILEGES;
6.修改用戶密碼
可使用mysqladmin工具,格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼
例:給root加個密碼ab12。首先在DOS下進入目錄mysqlbin,而後鍵入如下命令:
mysqladmin -uroot -password 12345
注:由於開始時root沒有密碼,因此-p舊密碼一項就能夠省略了。
再將root的密碼改成abcde。
mysqladmin -uroot -12345 password abcde
例: mysqladmin -utest2 -p12345 password public12
注意,須要相關的權限
也可以使用update語句更新:
mysql>update mysql.user set password=password('123456') where User='test1' and Host='localhost';
mysql>flush privileges;
還可以使用SET PASSWORD命令,
mysql> SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('NEW_PASSWORD'
如修改test1 密碼
mysql> set password for test1@localhost = password('public12');
Query OK, 0 rows affected (0.00 sec)
7.刪除用戶
mysql>delete from user where user='test2' and host='localhost';
mysql>flush privileges;
注意刪除用戶最好不要使用DELETE直接刪除,由於使用DELETE刪除後用戶的權限並未刪除,新建同名用戶後又會繼承之前的權限。
正確的作法是使用DROP USER命令刪除用戶,好比要刪除'test'@'172.168.100.%'用戶採用以下命令:
mysql>DROP USER test3@'172.21.78.89’; ---- 刪除帳戶及權限