數據庫版本
Server version: 5.6.22-log MySQL Community Server (GPL)mysql
root用戶登陸後,新建db,叫test2
mysql> create database test2 ;
Query OK, 1 row affected (0.00 sec)sql
新建用戶usr_test2;
GRANT ALL PRIVILEGES ON test2.* TO 'usr_test2'@'%' IDENTIFIED BY 'test123' ;
flush privileges;數據庫
使用新建的用戶usr_test2登陸後,查看database發現多出來兩個db,
其中的test和test_mqm沒有受權給usr_test2啊,咋回事?看來值得深究一下緣由
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
| test2 |
| test_mqm |
+--------------------+
4 rows in set (0.00 sec) 服務器
一。首先普及下mysql的權限知識
GRANT命令用來創建新用戶,指定用戶口令並增長用戶權限。其格式以下:線程
mysql> GRANT <privileges> ON <what>
-> TO <user> [IDENTIFIED BY "<password>"]
-> [WITH GRANT OPTION];日誌
<privileges>是一個用逗號分隔的你想要賦予的MySQL用戶權限的列表。你能夠指定的權限能夠分爲三種類型:orm
數據庫/數據表/數據列權限:
Alter: 修改已存在的數據表(例如增長/刪除列)和索引。
Create: 創建新的數據庫或數據表。
Delete: 刪除表的記錄。
Drop: 刪除數據表或數據庫。
INDEX: 創建或刪除索引。
Insert: 增長表的記錄。
Select: 顯示/搜索表的記錄。
Update: 修改表中已存在的記錄。索引
全局管理MySQL用戶權限:作用域
file: 在MySQL服務器上讀寫文件。
PROCESS: 顯示或殺死屬於其它用戶的服務線程。
RELOAD: 重載訪問控制表,刷新日誌等。
SHUTDOWN: 關閉MySQL服務。input
特別的權限:
ALL: 容許作任何事(和root同樣)。
USAGE: 只容許登陸--其它什麼也不容許作。
二。普及一下MySQL受權表
MySQL的受權系統一般是經過MySQL數據庫中的四個表來實現的(老版本mysql還有host表,mysql5.6已經沒有了),
這些表有user、db、tables_priv和columns_priv。
這些表的用途各有不一樣,可是有一點是一致的,那就是都可以檢驗用戶要作的事情是否爲被容許的。
這4個表的字段均可分解爲兩類,一類爲做用域字段,一類爲權限字段。
做用域字段用來標識主機、用戶或者數據庫;而權限字段則用來肯定對於給定主機、用戶或者數據庫來講,哪些動做是容許的。
user表——該表決定是否容許用戶鏈接到服務器。若是容許鏈接,權限字段則爲該用戶的全局權限。
db表——用於決定哪些用戶能夠從哪些主機訪問哪些數據庫。包含在db表中的權限適用於這個表標識的數據庫。
tables_priv表——該表與db表類似,不一樣之處是它用於表而不是數據庫。這個表還包含一個其餘字段類型,
包括timestamp和grantor兩個字段,用於存儲時間戳和受權方。
columns_priv——該表做用幾乎與db和tables_priv表同樣,不一樣之處是它提供的是針對某些表的特定列的權限。
這個表也多出了一個字段類型,即其餘字段,包括了一個timestamp列,用於存放時間戳。
3、MySQL服務器的訪問控制
對用戶的訪問進行控制,就是經過查詢這些受權表:
User表
Db表
Tables_priv表
Columns_priv表
此外,一旦鏈接到了服務器,一個用戶可使用兩種類型的請求:
管理請求(shutdown,reload,file,super,process等)
數據庫相關的請求(select,insert,delete,update等)
當用戶提交管理請求時,服務器只需查看user表,這是由於user表是惟一包含與管理工做有關的權限的一個表。
然而,當用戶提交數據庫請求時,要查看的表就要更多了。
user表中的權限是全局性,在這個表中授予用戶的權限對服務器上的全部數據庫都有效,這些權限能夠被認爲是超級用戶權限。
db包含的權限是特定於數據庫的。
所以,讓user表內全部的權限保持爲「N」不失爲一個明智的選擇。
有了上面的理論知識,咱們就能夠逐層的追查問題產生的緣由了
由於個人用戶usr_test2是新建的,而且受權都沒問題,推測不是user表的問題,直接覈查db表
mysql> select * from db where db='test' \G
*************************** 1. row ***************************
Host: %
Db: test
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
Event_priv: Y
Trigger_priv: Y
*************************** 2. row ***************************
Host: %
Db: test
User: rabbit
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
2 rows in set (0.00 sec)
發現第一條有問題,user爲空字符
刪除該條記錄後,刷新權限,發現已經看不到test數據庫了,但仍是多個test_mqm數據庫
mysql> delete from db where db='test' and user =''\G
Query OK, 1 row affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test2 |
| test_mqm |
+--------------------+
3 rows in set (0.00 sec)
繼續覈查db表
mysql> select * from db \G
*************************** 1. row ***************************
Host: %
Db: test5
User: usr_test5
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
*************************** 2. row ***************************
Host: %
Db: test\_%
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
Event_priv: Y
Trigger_priv: Y
*************************** 3. row ***************************
Host: %
Db: test
User: rabbit
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
*************************** 4. row ***************************
Host: %
Db: test_mqm
User: rabbit
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
*************************** 5. row ***************************
Host: %
Db: test2
User: usr_test2
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
5 rows in set (0.00 sec)
果真第2條記錄中的有問題,
*************************** 2. row ***************************
Host: %
Db: test\_%
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
Event_priv: Y
Trigger_priv: Y
這說明把全部"test_"開頭的db受權給了全部用戶,所以緣由找到了,刪除db表裏的這條記錄便可。
mysql> delete from db where user='' ;
Query OK, 1 row affected (0.00 sec)
mysql> commit ;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
用usr_test2從新登陸,查詢db,顯示正常,至此問題解決
[root@vm_mysql1 ~]# mysql -uusr_test2 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 490875
Server version: 5.6.22-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || test2 |+--------------------+2 rows in set (0.00 sec)