MySQL分為普通用戶與root用戶。這兩種用戶的權限不一樣。
一、權限表
安裝MySQL時會自動安裝一個名為mysql的數據庫。mysql數據庫里面存儲的都是權限表。
1、User表
user表有39個字段。這些字段可以分為4類:
- 用戶列;
- 權限列;
- 安全列;
- 資源控制列;
1、用戶列
用戶列包括Host、User、Password,分別表示主機名、用戶名和密碼。登錄用的就是這個用戶名與密碼;
2、權限列
user表的權限列包括Select_priv、Insert_priv等以priv結尾的字段。
這些字段的值只有Y和N。Y表示該權限可以用到所有數據庫上;N表示該權限不能用到所有數據庫上;
通常,可以使用GRANT語句Wie用戶賦予一些權限,也可以通過Update語句更新user表的方式來設置權限;
不過,修改user表之后,一定要執行一下FLUSH PRIVILEGES,否則可能會出現如下錯誤:
Error (1133): Can’t find any matching row in the user table
列 | 說明 |
Select_priv | 確定用戶是否可以通過SELECT命令選擇數據 |
Insert_priv | 確定用戶是否可以通過INSERT命令插入數據 |
Update_priv | 確定用戶是否可以通過UPDATE命令修改現有數據 |
Delete_priv | 確定用戶是否可以通過DELETE命令刪除現有數據 |
Create_priv | 確定用戶是否可以創建新的數據庫和表 |
Drop_priv | 確定用戶是否可以刪除現有數據庫和表 |
Reload_priv | 確定用戶是否可以執行刷新和重新加載MySQL所用各種內部緩存的特定命令,包括日志、權限、主機、查詢和表 |
Shutdown_priv | 確定用戶是否可以關閉MySQL服務器。在將此權限提供給root賬戶之外的任何用戶時,都應當非常謹慎 |
Process_priv | 確定用戶是否可以通過SHOW PROCESSLIST命令查看其他用戶的進程 |
File_priv | 確定用戶是否可以執行SELECT INTO OUTFILE和LOAD DATA INFILE命令 |
Grant_priv | 確定用戶是否可以將已經授予給該用戶自己的權限再授予其他用戶 |
References_priv | 目前只是某些未來功能的占位符;現在沒有作用 |
Index_priv | 確定用戶是否可以創建和刪除表索引 |
Alter_priv | 確定用戶是否可以重命名和修改表結構 |
Show_db_priv | 確定用戶是否可以查看服務器上所有數據庫的名字,包括用戶擁有足夠訪問權限的數據庫 |
Super_priv | 確定用戶是否可以執行某些強大的管理功能,例如通過KILL命令刪除用戶進程,使用SET GLOBAL修改全局MySQL變量,執行關於復制和日志的各種命令 |
Create_tmp_table_priv | 確定用戶是否可以創建臨時表 |
Lock_tables_priv | 確定用戶是否可以使用LOCK TABLES命令阻止對表的訪問/修改 |
Execute_priv | 確定用戶是否可以執行存儲過程 |
Repl_slave_priv | 確定用戶是否可以讀取用於維護復制數據庫環境的二進制日志文件。此用戶位於主系統中,有利於主機和客戶機之間的通信 |
Repl_client_priv | 確定用戶是否可以確定復制從服務器和主服務器的位置 |
Create_view_priv | 確定用戶是否可以創建視圖 |
Show_view_priv | 確定用戶是否可以查看視圖或了解視圖如何執行 |
Create_routine_priv | 確定用戶是否可以更改或放棄存儲過程和函數 |
Alter_routine_priv | 確定用戶是否可以修改或刪除存儲函數及函數 |
Create_user_priv | 確定用戶是否可以執行CREATE USER命令,這個命令用於創建新的MySQL賬戶 |
Event_priv | 確定用戶能否創建、修改和刪除事件 |
Trigger_priv | 確定用戶能否創建和刪除觸發器 |
Update修改權限:
UPDATE user SET Select_priv = 'N' WHERE Host = '%'
GRANT賦予權限
3、安全列
user表的安全列有4個字段:
- ssl_type;
- ssl_cipher;
- x509_issuer;
- x509_subject;
ssl用於加密;x509標准可以用來標識用戶。普通的發行版都沒有加密功能。可以使用SHOW VARIABLES LIKE 'have_openssl'語句來查看是否具有ssl功能。如果取值為DISABLED,那么則沒有ssl加密功能。
4、資源控制列
user表的4個資源控制列是:
- max_questions:每小時可以允許執行多少次查詢;
- max_updates:每小時可以允許執行多少次更新;
- max_connections:每小時可以建立多少連接;
- max_user_connections:單個用戶可以同時具有的連接數。
默認值為0,表示無限制。
2、db表和host表
db表存儲了某個用戶對一個數據庫的權限。
host表中存儲了某個主機對數據庫的操作權限,配合db表對給定主機上數據庫級操作權限做更細致的控制;但是很少用,新版本已經取消了host表;
1、用戶列
db表的用戶列有3個字段:
- Host:主機名;
- Db:數據庫名;
- User:用戶名;
2、權限列
db表:
- Create_routine_priv:是否具有創建存儲過程權限;
- Alter_routine_priv:是否具有修改存儲過程權限;
user表中的權限是針對所有數據庫的,如果user表中的Select_priv字段取值為Y,那么該用戶可以查詢所有數據庫中的表;
如果為某個用戶值設置了查詢test表的權限,那么user表的Select_priv字段的取值為N。而這個SELECT權限則記錄在db表中。db表中的Select_priv字段的取值將會是Y。
用戶先根據user表的內容獲取權限,然后再根據db表的內容獲取權限。
3、tables_priv表和columns_priv表
tables_priv:可以對單個表進行權限設置:
- tables_priv表包含8個字段:
- Host:主機名;
- DB:數據庫名;
- User:用戶名;
- Table_name:表名
- Table_priv:對表進行操作的權限(Select,Insert,Update,Delete,Create,Drop,Grant,References,Index,Alter)
- Column_priv:對表中的數據列進行操作的權限(Select,Insert,Update,Rederences);
- Timestamp:修改權限的事件
- Grantor:權限的設置者
columns_priv:可以對單個數據列進行權限設置,有7個列,作用同上:
Host、Db、User、Table_name、Column_name、Column_priv、Timestamp。
MySQL權限分配是按照user表-> db表 -> table_priv表 -> columns_priv表的順序進行分配的。
在數據庫系統中,先判斷user表中的值是否為'Y',如果user表中的值是'Y',就不需要檢查后面的表。如果user表為N,則一次檢查后面的表。
4、procs_priv表
- procs_priv表可以對存儲過程和存儲函數進行權限設置。
- procs_priv表包含8個字段,分別是:
- Host:主機名;
- Db:數據庫名;
- User:用戶名;
- Routine_name:存儲過程或函數名稱;
- Routine_type:類型(取值有:FUNCTION或PROCEDURE);
- Proc_priv:擁有的權限(Execute:執行;Alter Routine:修改;Grant:權限賦予);
- Timestamp:字段存儲更新的時間;
- Grantor:字段設置者;
二、賬戶管理
賬戶管理是MySQL用戶管理最基本的內容。包括登錄,退出MySQL服務器、創建用戶、刪除用戶、密碼管理和權限管理等內容。
其中登錄方式非常簡單,在這個地址有:http://www.cnblogs.com/kissdodog/p/4154068.html
1、新建普通用戶
在MySQL數據庫中,建立用戶有3種方式:
- 使用CREATE USER語句來創建新的用戶;
- 直接在mysql.user表中INSERT用戶;
- 使用GRANT語句來新建用戶;
1、CREATE USER
使用CREATE USER語句創建用戶,必須要擁有CREATE USER權限。其格式如下:
CREATE USER user[IDENTIFIED BY [PASSWORD] 'password'],
[user[IDENTIFIED BY [PASSWORD] 'password']]...
其中,user參數表示新建用戶的賬戶,user由用戶名(User)和主機名(Host)構成;IDENTIFIED BY關鍵字用來設置用戶的密碼;password參數表示用戶的密碼;如果密碼是一個普通的字符串,就不需要使用PASSWORD關鍵字。可以沒有初始密碼。
示例:
CREATE USER 'admin'@'%' IDENTIFIED BY 'admin'
執行之后user表會增加一行記錄,但權限暫時全部為‘N’。
2、用INSERT語句新建普通用戶
可以使用INSERT語句直接將用戶的信息添加到mysql.user表。但必須擁有mysql.user表的INSERT權限。
另外,ssl_cipher、x509_issuer、x509_subject沒有值,必須要設置值,否則INSERT語句無法執行。
示例:
INSERT INTO mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) VALUES('%','newuser1',PASSWORD('123456'),'','','')
執行INSERT之后,要使用命令:
FLUSH PRIVILEGES
命令來使用戶生效。
3、用GRANT語句來新建普通用戶
用GRANT來創建新的用戶時,能夠在創建用戶時為用戶授權。但需要擁有GRANT權限。
語法如下:
GRANT priv_type ON database.table TO user[IDENTIFIED BY [PASSWORD] 'password'] [,user [IDENTIFIED BY [PASSWORD] 'password']...]
- priv_type:參數表示新yoghurt的權限;
- databse.table:參數表示新用戶的權限范圍;
- user:參數新用戶的賬戶,由用戶名和主機構成;
- IDENTIFIED BY關鍵字用來設置密碼;
- password:新用戶密碼;
GRANT語句可以同時創建多個用戶。
GRANT SELECT ON *.* TO netUser@'%'
*.*與db.*的區別在於。*.*對所有數據庫生效,所以user表的SELECT會變為Y。而db.*user表為'N',更改的是Db表。
2、刪除普通用戶
1、DROP USER語句刪除普通用戶
需要擁有DROP USER權限。語法如下:
DROP USER user[,user]...
user是需要刪除的用戶,由用戶名(User)和主機名(Host)構成。
DROP USER 'newuser1'@'%'
2、DELETE語句刪除普通用戶
可以使用DELETE語句直接將用戶的信息從mysql.user表中刪除。但必須擁有對mysql.user表的DELETE權限。
DELETE FROM mysql.user WHERE Host = '%' AND User = 'admin'
刪除完成后,一樣要FLUSH PRIVILEGES才生效。
3、修改密碼
1、使用mysqladmin命令來修改root用戶的密碼
語法:
mysqladmin -u -username -p password "new_password"
新密碼(new_password)必須用括號括起來,單引號會報錯。
示例:
(注:這個待驗證,我怎么執行都不成功!)
2、修改user表
UPDATE user表的passwor字段的值,也可以達到修改密碼的目的;
UPDATE user SET Password = PASSWORD('123') WHERE USER = 'myuser'
FLUSH PRIVILEGES后生效。
3、使用SET語句來修改密碼
使用root用戶登錄到MySQL服務器后,可以使用SET語句來修改密碼:
修改自己的密碼,不需要用戶名
SET PASSWORD = PASSWORD("123");
修改其他用戶密碼:
SET PASSWORD FOR 'myuser'@'%'=PASSWORD("123456")
FOR 用戶名@主機名
4、GRANT語句來修改普通用戶的密碼
使用GRANT語句修改普通用戶的密碼,必須擁有GRANT權限。
GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']
示例:
GRANT SELECT ON *.* TO 'test3'@'%' IDENTIFIED BY '123'
4、忘記密碼的解決方案
如果root用戶密碼丟失了,會給用戶造成很大的麻煩。但是,可以通過某種特殊方法登錄到root用戶下,然后修改密碼。
1、使用--skip-grant-tables選項啟動MySQL服務
該選項將使MySQL服務器停止權限判斷,任何用戶都能夠訪問數據庫。
在Windows操作系統下,使用mysqlid或mysqlid-nt來啟動MySQL服務。
mysqld命令:
mysqld --skip-grant-tables
mysqld-nt命令:
mysqld-nt --skip-grant-tables
net start mysql命令:
net start mysql --skip-grant-tables
2、登錄root用戶,並且設置新密碼
mysql -u root
必須使用UPDATE語句更新mysql數據庫下的user表,而不能使用SET語句,因為--skip-grant-tables不能使用SET語句。
修改完密碼以后,FLUSH PRIVILEGES語句加載權限表,新密碼即生效。
三、權限管理
1、MySQL的各種權限
權限名稱 | 對應user表中的列 | 權限的范圍 |
CREATE | Create_priv | 數據庫、表或索引 |
DROP | Drop_priv | 數據庫或表 |
GRANT OPTION | Grant_priv | 數據庫、表、存儲過程或函數 |
REFERENCES | References_priv | 數據庫或表 |
ALTER | Alter_priv | 修改表 |
DELETE | Delete_priv | 刪除表 |
INDEX | Index_priv | 用索引查詢表 |
INSERT | Insert_priv | 插入表 |
SELECT | Select_priv | 查詢表 |
UPDATE | Update_priv | 更新表 |
CREATE VIEW | Create_view_priv | 創建視圖 |
SHOW VIEW | Show_view_priv | 查看視圖 |
ALTER ROUTINE | Alter_routine | 修改存儲過程或存儲函數 |
CREATE ROUTINE | Create_routine_priv | 創建存儲過程或存儲函數 |
EXECUTE | Execute_priv | 執行存儲過程或存儲函數 |
FILE | File_priv | 加載服務器主機上的文件 |
CREATE TEMPORARY TABLES | Create_temp_table_priv | 創建臨時表 |
LOCK TABLES | Lock_tables_priv | 鎖定表 |
CREATE USER | Create_user_priv | 創建用戶 |
PROCESS | Process_priv | 服務器管理 |
RELOAD | Reload_priv | 重新加載權限表 |
REPLICATION CLIENT | Repl_client_priv | 服務器管理 |
REPLICATION SLAVE | Repl_slave_priv | 服務器管理 |
SHOW DATABASES | Show_db_priv | 查看數據庫 |
SHUTDOWN | Shutdown_priv | 關閉服務器 |
SUPER | Super_priv | 超級權限 |
2、授權
GRANT語法如下:
GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [,user [IDENTIFIED BY [PASSWORD] 'password']]... WITH with_option[with_option]
- priv_type參數表示權限類型;
- column_list:參數表示權限作用於哪些列上,沒設置則位於整個表上;
- user參數由用戶名和主機名構成;形式是"'username'@'hostname'";
- IDENTIFIED BY參數用於為用戶設置密碼;
- password:用戶新密碼;
WITH關鍵字后面帶有一個或多個with_option參數。有5個選項:
- GRANT OPTION:被授權的用戶可以將這些權限賦予給別的用戶;
- MAX_QUERIES_PER_HOUR count:設置沒消失可以允許執行count次查詢;
- MAX_UPDATES_PER_HOUR count:設置每個消失可以允許執行count次更新;
- MAX_CONNECTIONS_PER_HOUR count:設置每小時可以建立count個連接;
- MAX_USER_CONNECTIONS count:設置單個用戶可以同時具有的count個連接數;
示例:
GRANT SELECT,UPDATE ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
3、收回權限
收回權限,就是取消某個用戶的某些權限。MySQL中使用REVOKE關鍵字來為用戶設置權限。
語法如下:
REVOKE priv_type[(column_list)] ON database.table FROM user[,user]
收回全部權限的REVOKE語句的基本語法如下:
REVOKE ALL PRIVILEGES,GRANT OPTION FROM user[,user]...
示例:回收用戶myuser的SELECT權限
REVOKE SELECT ON *.*FROM 'myuser'@'%'
收回myuser的所有權限:
REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'myuser'@'%'
4、查看權限
SHOW GRANTS語句用於查看權限。同時mysql數據庫下的user表中存儲着用戶的基本權限。
SELECT * FROM mysql.user SHOW GRANTS