在mysql數據庫中,有mysql_install_db腳本初始化權限表,存儲權限的表有:
- user表
- db表
- host表
- table_priv表
- columns_priv表
- proc_priv表
MySQL存取控制包含2個階段:
階段1:服務器檢查你是否允許連接。
階段2:假定你能連接,服務器檢查你發出的每個請求。看你是否有足夠的權限實施它。例如,如果你從數據庫中一個表精選(select)行或從數據庫拋棄一個表,服務器確定你對錶有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 結尾:
使用CREATE語句創建新用戶
CREATE USER user[IDENTIFIED BY [PASSWORD] 'password'],
[user[IDENTIFIED BY [PASSWORD] 'password']]...
創建用戶
CREATE USER 'admin'@'%' IDENTIFIED BY 'admin'
授予權限
grant all privileges on *.* to admin@% identified by ' admin';
flush privileges;
使用GRANT語句創建新用戶
GRANT USER語句可以用來創建帳戶,通過該語句可以在user表中添加一條新記錄
比起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語句創建一個新用戶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可以被指定爲以下任何一種:
權限 | 意義 |
---|---|
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 | 用於複製型從屬服務器(從主服務器中讀取二進制日誌事件) |
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命令;允許您連接(一次),即使已達到max_connections。 |
UPDATE | 允許使用UPDATE |
USAGE | “無權限”的同義詞 |
GRANT OPTION | 允許授予權限 |
當從舊版本的MySQL升級時,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE權限
授權
授權就是爲某個用戶授予權限
授予的權限可以分爲多個層級:
全局層級
全局權限適用於一個給定服務器中的所有數據庫。這些權限存儲在mysql.user表中。GRANT ALL ON .和REVOKE ALL ON .只授予和撤銷全局權限。
數據庫層級
數據庫權限適用於一個給定數據庫中的所有目標。這些權限存儲在mysql.db和mysql.host表中。GRANT ALL ONdb_name.和REVOKE ALL ON db_name.只授予和撤銷數據庫權限。
表層級
表權限適用於一個給定表中的所有列。這些權限存儲在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表權限。
列層級
列權限適用於一個給定表中的單一列。這些權限存儲在mysql.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。
子程序層級
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權限適用於已存儲的子程序。這些權限可以被授予爲全局層級和數據庫層級。而且,除了CREATE ROUTINE外,這些權限可以被授予爲子程序層級,並存儲在mysql.procs_priv表中。
當後續目標是一個表、一個已存儲的函數或一個已存儲的過程時,object_type子句應被指定爲TABLE、FUNCTION或PROCEDURE。當從舊版本的MySQL升級時,要使用本子句,您必須升級您的授權表
收回權限
收回權限就是取消已經賦予用戶的某些權限。收回用戶不必要的權限可以在一定程度上保證系統的安全性。
使用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';