在mysql數據庫中,有mysql_install_db腳本初始化權限表,存儲權限的表有:
MySQL存取控制包括2個階段:
階段1:服務器檢查你是不是允許連接。
階段2:假定你能連接,服務器檢查你發出的每一個要求。看你是不是有足夠的權限實行它。例如,如果你從數據庫中1個表精選(select)行或從數據庫拋棄1個表,服務器肯定你對表有select權限或對數據庫有drop權限。
服務器在存取控制的兩個階段使用在mysql的數據庫中的user、db和host表表示,
表名稱 user db host
范圍字段 Host Host Host
User Db Db
Password User
表名稱 | user | db | host |
---|---|---|---|
范圍字段 | host,use,password | host,db,user | host,db |
權限的鍵以 _priv 結尾:
使用GRANT語句創建新用戶
GRANT USER語句可以用來創建帳戶,通過該語句可以在user表中添加1條新記錄
比起CREATE USER語句創建的新用戶,還需要使用GRANT語句
賦予用戶權限
使用GRANT語句創建新用戶時必須有GRANT權限。
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] …
ON [object_type] {tbl_name | * | . | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] ‘password’]
[, user [IDENTIFIED BY [PASSWORD] ‘password’]] …
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER ‘cipher’ [AND]]
[ISSUER ‘issuer’ [AND]]
[SUBJECT ‘subject’]]
[WITH with_option [with_option] …]
使用GRANT語句創建1個新用戶testUser,密碼為testpwd,并授與用戶對所有數據表的SELECT和UPDATE權限
GRANT SELECT ,UPDATE ON *.* TO 'testUser'@'localhost' identified BY 'testpwd'
SELECT `Host` ,`User` ,`Select_priv` ,`Update_priv` FROM mysql.user WHERE `User` ='testUser';
履行結果顯示履行成功,使用SELECT語句查詢用戶testUser的權限
Select ‘Host’,’User’,’Select_priv’,’Update_priv’ from mysql user where ‘User’ = ‘testUser’;
root用戶密碼丟失的解決辦法
使用–skip-grant-tables選項啟動MYSQL服務
使用–skip-grant-tables選項啟動MYSQL時,服務器將不加載權限判斷,任何用戶都能訪問數據庫
LINUX下
使用mysqld_safe來啟動MYSQL服務,也能夠使用/etc/init.d/mysql命令來啟動mysql
mysqld_safe --skip-grant-tables user=mysql
或
/etc/init.d/mysql start-mysqld --skip-grant-tables
啟動MYSQL服務后,就能夠使用root用戶登錄了
權限管理
MYSQL中的各種權限
對GRANT和REVOKE語句,priv_type可以被指定為以下任何1種:
權限 | 意義 |
---|---|
ALL [PRIVILEGES] | 設置除GRANT OPTION以外的所有簡單權限 |
ALTER | 允許使用ALTER TABLE |
ALTER ROUTINE | 更改或取消已存儲的子程序 |
CREATE | 允許使用CREATE TABLE |
CREATE ROUTINE | 創建已存儲的子程序 |
CREATE TEMPORARY TABLES | 允許使用CREATE TEMPORARY TABLE |
CREATE USER | 允許使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 |
CREATE VIEW | 允許使用CREATE VIEW |
DELETE | 允許使用DELETE |
DROP | 允許使用DROP TABLE |
EXECUTE | 允許用戶運行已存儲的子程序 |
FILE | 允許使用SELECT…INTO OUTFILE和LOAD DATA INFILE |
INDEX | 允許使用CREATE INDEX和DROP INDEX |
INSERT | 允許使用INSERT |
LOCK TABLES | 允許對您具有SELECT權限的表使用LOCK TABLES |
PROCESS | 允許使用SHOW FULL PROCESSLIST |
REFERENCES | 未被實行 |
RELOAD | 允許使用FLUSH |
REPLICATION CLIENT | 允許用戶詢問從屬服務器或主服務器的地址 |
REPLICATION SLAVE | 用于復制型從屬服務器(從主服務器中讀取2進制日志事件) |
SELECT | 允許使用SELECT |
SHOW DATABASES SHOW DATABASES | 顯示所有數據庫 |
SHOW VIEW | 允許使用SHOW CREATE VIEW |
SHUTDOWN | 允許使用mysqladmin shutdown |
SUPER | 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,mysqladmin debug命令;允許您連接(1次),即便已到達max_connections。 |
UPDATE | 允許使用UPDATE |
USAGE | “無權限”的同義詞 |
GRANT OPTION | 允許授與權限 |
當從舊版本的MySQL升級時,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE權限
授權
授權就是為某個用戶授與權限
授與的權限可以分為多個層級:
全局層級
全局權限適用于1個給定服務器中的所有數據庫。這些權限存儲在mysql.user表中。GRANT ALL ON .和REVOKE ALL ON .只授與和撤消全局權限。
數據庫層級
數據庫權限適用于1個給定數據庫中的所有目標。這些權限存儲在mysql.db和mysql.host表中。GRANT ALL ONdb_name.和REVOKE ALL ON db_name.只授與和撤消數據庫權限。
表層級
表權限適用于1個給定表中的所有列。這些權限存儲在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授與和撤消表權限。
列層級
列權限適用于1個給定表中的單1列。這些權限存儲在mysql.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。
子程序層級
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權限適用于已存儲的子程序。這些權限可以被授與為全局層級和數據庫層級。而且,除CREATE ROUTINE外,這些權限可以被授與為子程序層級,并存儲在mysql.procs_priv表中。
當后續目標是1個表、1個已存儲的函數或1個已存儲的進程時,object_type子句應被指定為TABLE、FUNCTION或PROCEDURE。當從舊版本的MySQL升級時,要使用本子句,您必須升級您的授權表
收回權限
收回權限就是取消已賦予用戶的某些權限。收回用戶沒必要要的權限可以在1定程度上保證系統的安全性。
使用REVOKE收回權限以后,用戶帳戶的記錄將從db、host、tables_priv、columns_priv表中刪除,但是用戶帳號記錄仍然
在user表中保存。
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
使用REVOKE語句,必須具有mysql數據庫的全局CREATE權限或UPDATE權限
使用REVOKE語句取消用戶grantUser的INSERT權限
REVOKE INSERT ON *.* FROM 'grantUser'@'localhost';
注意:當從舊版本的MYSQL升級時,如果要使用EXECUTE、CREATE VIEW、SHOW VIEW、CREATE USER、CREATE ROUTINE、ALTER ROUTINE權限,必須先升級授權表
查看權限
SHOW GRANT語句可以顯示用戶的權限信息
show grants FOR 'user'@'host';