mysql 用戶及權限管理

MySQL 默認有個root用戶,可是這個用戶權限太大,通常只在管理數據庫時候才用。若是在項目中要鏈接 MySQL 數據庫,則建議新建一個權限較小的用戶來鏈接。mysql

在 MySQL 命令行模式下輸入以下命令能夠爲 MySQL 建立一個新用戶:sql

1數據庫

CREATE USER username IDENTIFIED BY 'password';緩存

新用戶建立完成,可是此刻若是以此用戶登錄的話,會報錯,由於咱們尚未爲這個用戶分配相應權限,分配權限的命令以下:服務器

1oracle

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';ide

授予username用戶在全部數據庫上的全部權限。wordpress

若是此時發現剛剛給的權限太大了,若是咱們只是想授予它在某個數據庫上的權限,那麼須要切換到root 用戶撤銷剛纔的權限,從新受權:spa

1.net

2

EVOKE ALL PRIVILEGES ON *.* FROM 'username'@'localhost';

GRANT ALL PRIVILEGES ON wordpress.* TO 'username'@'localhost' IDENTIFIED BY 'password';

甚至還能夠指定該用戶只能執行 select 和 update 命令:

1

GRANT SELECT, UPDATE ON wordpress.* TO 'username'@'localhost' IDENTIFIED BY 'password';

這樣一來,再次以username登錄 MySQL,只有wordpress數據庫是對其可見的,而且若是你只受權它select權限,那麼它就不能執行delete 語句。

另外每當調整權限後,一般須要執行如下語句刷新權限:

1

FLUSH PRIVILEGES;

刪除剛纔建立的用戶:

1

DROP USER username@localhost;

仔細上面幾個命令,能夠發現無論是受權,仍是撤銷受權,都要指定響應的host(即 @ 符號後面的內容),由於以上及格命令實際上都是在操做mysql 數據庫中的user表,能夠用以下命令查看相應用戶及對應的host:

1

SELECT User, Host FROM user;

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

+-------+-----------+

| user  | host      |

+-------+-----------+

| tom   | %         |

| root  | 127.0.0.1 |

| root  | ::1       |

|       | localhost |

| root  | localhost |

| scott | localhost |

|       | mysrv     |

| root  | mysrv     |

+-------+-----------+

8 rows in set (0.00 sec)

查看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

+-------+-----------+

| user  | host      |

+-------+-----------+

| tom   | %         |

| tom1  | %         |

| tom2  | %         |

| root  | 127.0.0.1 |

| root  | ::1       |

|       | localhost |

| root  | localhost |

| scott | localhost |

|       | mysrv     |

| root  | mysrv     |

+-------+-----------+

10 rows in set (0.00 sec)

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

+-------+-----------+

| user  | host      |

+-------+-----------+

| tom   | %         |

| tom1  | %         |

| tom2  | %         |

| root  | 127.0.0.1 |

| root  | ::1       |

|       | localhost |

| root  | localhost |

| scott | localhost |

| tom   | localhost |

|       | mysrv     |

| root  | mysrv     |

+-------+-----------+

11 rows in set (0.00 sec)

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)

相關文章
相關標籤/搜索