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.tableTO 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.tableTO 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.tableFROM 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.userSHOW GRANTS
原文地址
新聞熱點
疑難解答