MySQL 默認有個root用戶,可是這個用戶權限太大,通常只在管理數據庫時候才用。若是在項目中要鏈接 MySQL 數據庫,則建議新建一個權限較小的用戶來鏈接。mysql
在 MySQL 命令行模式下輸入以下命令能夠爲 MySQL 建立一個新用戶:sql
1數據庫 |
|
新用戶建立完成,可是此刻若是以此用戶登錄的話,會報錯,由於咱們尚未爲這個用戶分配相應權限,分配權限的命令以下:服務器
1oracle |
|
授予username用戶在全部數據庫上的全部權限。wordpress
若是此時發現剛剛給的權限太大了,若是咱們只是想授予它在某個數據庫上的權限,那麼須要切換到root 用戶撤銷剛纔的權限,從新受權:spa
1.net 2 |
|
甚至還能夠指定該用戶只能執行 select 和 update 命令:
1 |
|
這樣一來,再次以username登錄 MySQL,只有wordpress數據庫是對其可見的,而且若是你只受權它select權限,那麼它就不能執行delete 語句。
另外每當調整權限後,一般須要執行如下語句刷新權限:
1 |
|
刪除剛纔建立的用戶:
1 |
|
仔細上面幾個命令,能夠發現無論是受權,仍是撤銷受權,都要指定響應的host(即 @ 符號後面的內容),由於以上及格命令實際上都是在操做mysql 數據庫中的user表,能夠用以下命令查看相應用戶及對應的host:
1 |
|
MySQL Study之--MySQL用戶及權限管理
MySQL服務器經過MySQL權限表來控制用戶對數據庫的訪問,MySQL權限表存放在mysql數據庫裏,由mysql_install_db腳本初始化。這些MySQL權限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結構和內容:
user權限表:記錄容許鏈接到服務器的用戶賬號信息,裏面的權限是全局級的。
db權限表:記錄各個賬號在各個數據庫上的操做權限。
table_priv權限表:記錄數據表級的操做權限。
columns_priv權限表:記錄數據列級的操做權限。
host權限表:配合db權限表對給定主機上數據庫級操做權限做更細緻的控制。這個權限表不受GRANT和REVOKE語句的影響。
案例分析:
1、建立用戶並受權(root用戶)
[root@mysrv ~]# mysql -u root -poracle
mysql> select version()\g
+-------------------------------------------+
| version() |
+-------------------------------------------+
| 5.6.25-enterprise-commercial-advanced-log |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| prod |
| test |
+--------------------+
5 rows in set (0.01 sec)
一、創建tom用戶並受權(特權管理用戶)
mysql> grant all on prod.* to 'tom'@'%' identified by 'tom' with grant option;
Query OK, 0 rows affected (0.00 sec)
查看用戶建立是否成功:
mysql> select user,host from user ;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
查看tom用戶的受權:
mysql> show grants for tom;
+----------------------------------------------------------------------------------------------------+
| Grants for tom@% |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |
| GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------+
GRANT 語法:
GRANT privileges (columns)
ON what
TO user IDENTIFIED BY "password"
WITH GRANT OPTION
權限列表:
ALTER: 修改表和索引。
CREATE: 建立數據庫和表。
DELETE: 刪除表中已有的記錄。
DROP: 拋棄(刪除)數據庫和表。
INDEX: 建立或拋棄索引。
INSERT: 向表中插入新行。
REFERENCE: 未用。
SELECT: 檢索表中的記錄。
UPDATE: 修改現存表記錄。
FILE: 讀或寫服務器上的文件。
PROCESS: 查看服務器中執行的線程信息或殺死線程。
RELOAD: 重載受權表或清空日誌、主機緩存或表緩存。
SHUTDOWN: 關閉服務器。
ALL: 全部權限,ALL PRIVILEGES同義詞。
USAGE: 特殊的 "無權限" 權限。
用 戶帳戶包括 "username" 和 "host" 兩部分,後者表示該用戶被容許從何地接入。tom@'%' 表示任何地址,默承認以省略。還能夠是 "tom@192.168.1.%"、"tom@%.abc.com" 等。數據庫格式爲 db@table,能夠是 "test.*" 或 "*.*",前者表示 test 數據庫的全部表,後者表示全部數據庫的全部表。
子句 "WITH GRANT OPTION" 表示該用戶能夠爲其餘用戶分配權限。
二、咱們用 root 再建立幾個用戶,而後由 test 數據庫的管理員tom爲他們分配權限。
mysql> create user 'tom1' identified by 'tom1' ,'tom2' identified by 'tom2';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from user ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
root用戶退出,tom登錄,並受權用戶訪問prod庫
[root@mysrv ~]# mysql -u tom -ptom
ERROR 1045 (28000): Access denied for user 'tom'@'localhost' (using password: YES)
tom用戶竟不能登錄!!!
再對tom用戶受權:
mysql> grant all on prod.* to 'tom'@'localhost' identified by 'tom' with grant option;;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for tom;
+----------------------------------------------------------------------------------------------------+
| Grants for tom@% |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |
| GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> use mysql;
Database changed
mysql> select user,host from user ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
tom登錄:
[root@mysrv ~]# mysql -u tom -ptom prod
mysql> select database();
+------------+
| database() |
+------------+
| prod |
+------------+
1 row in set (0.01 sec)
mysql> select current_user(); +----------------+ | current_user() | +----------------+ | tom@localhost | +----------------+ 1 row in set (0.00 sec)