在mysql數(shù)據(jù)庫(kù)中,有mysql_install_db腳本初始化權(quán)限表,存儲(chǔ)權(quán)限的表有:
MySQL存取控制包括2個(gè)階段:
階段1:服務(wù)器檢查你是不是允許連接。
階段2:假定你能連接,服務(wù)器檢查你發(fā)出的每一個(gè)要求??茨闶遣皇怯凶銐虻臋?quán)限實(shí)行它。例如,如果你從數(shù)據(jù)庫(kù)中1個(gè)表精選(select)行或從數(shù)據(jù)庫(kù)拋棄1個(gè)表,服務(wù)器肯定你對(duì)表有select權(quán)限或?qū)?a href="http://www.jyygyx.com/db/" target="_blank">數(shù)據(jù)庫(kù)有drop權(quán)限。
服務(wù)器在存取控制的兩個(gè)階段使用在mysql的數(shù)據(jù)庫(kù)中的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 |
權(quán)限的鍵以 _priv 結(jié)尾:
使用GRANT語(yǔ)句創(chuàng)建新用戶
GRANT USER語(yǔ)句可以用來(lái)創(chuàng)建帳戶,通過(guò)該語(yǔ)句可以在user表中添加1條新記錄
比起CREATE USER語(yǔ)句創(chuàng)建的新用戶,還需要使用GRANT語(yǔ)句
賦予用戶權(quán)限
使用GRANT語(yǔ)句創(chuàng)建新用戶時(shí)必須有GRANT權(quán)限。
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語(yǔ)句創(chuàng)建1個(gè)新用戶testUser,密碼為testpwd,并授與用戶對(duì)所有數(shù)據(jù)表的SELECT和UPDATE權(quán)限
GRANT SELECT ,UPDATE ON *.* TO 'testUser'@'localhost' identified BY 'testpwd'
SELECT `Host` ,`User` ,`Select_priv` ,`Update_priv` FROM mysql.user WHERE `User` ='testUser';
履行結(jié)果顯示履行成功,使用SELECT語(yǔ)句查詢用戶testUser的權(quán)限
Select ‘Host’,’User’,’Select_priv’,’Update_priv’ from mysql user where ‘User’ = ‘testUser’;
root用戶密碼丟失的解決辦法
使用–skip-grant-tables選項(xiàng)啟動(dòng)MYSQL服務(wù)
使用–skip-grant-tables選項(xiàng)啟動(dòng)MYSQL時(shí),服務(wù)器將不加載權(quán)限判斷,任何用戶都能訪問(wèn)數(shù)據(jù)庫(kù)
LINUX下
使用mysqld_safe來(lái)啟動(dòng)MYSQL服務(wù),也能夠使用/etc/init.d/mysql命令來(lái)啟動(dòng)mysql
mysqld_safe --skip-grant-tables user=mysql
或
/etc/init.d/mysql start-mysqld --skip-grant-tables
啟動(dòng)MYSQL服務(wù)后,就能夠使用root用戶登錄了
權(quán)限管理
MYSQL中的各種權(quán)限
對(duì)GRANT和REVOKE語(yǔ)句,priv_type可以被指定為以下任何1種:
權(quán)限 | 意義 |
---|---|
ALL [PRIVILEGES] | 設(shè)置除GRANT OPTION以外的所有簡(jiǎn)單權(quán)限 |
ALTER | 允許使用ALTER TABLE |
ALTER ROUTINE | 更改或取消已存儲(chǔ)的子程序 |
CREATE | 允許使用CREATE TABLE |
CREATE ROUTINE | 創(chuàng)建已存儲(chǔ)的子程序 |
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 | 允許用戶運(yùn)行已存儲(chǔ)的子程序 |
FILE | 允許使用SELECT…INTO OUTFILE和LOAD DATA INFILE |
INDEX | 允許使用CREATE INDEX和DROP INDEX |
INSERT | 允許使用INSERT |
LOCK TABLES | 允許對(duì)您具有SELECT權(quán)限的表使用LOCK TABLES |
PROCESS | 允許使用SHOW FULL PROCESSLIST |
REFERENCES | 未被實(shí)行 |
RELOAD | 允許使用FLUSH |
REPLICATION CLIENT | 允許用戶詢問(wèn)從屬服務(wù)器或主服務(wù)器的地址 |
REPLICATION SLAVE | 用于復(fù)制型從屬服務(wù)器(從主服務(wù)器中讀取2進(jìn)制日志事件) |
SELECT | 允許使用SELECT |
SHOW DATABASES SHOW DATABASES | 顯示所有數(shù)據(jù)庫(kù) |
SHOW VIEW | 允許使用SHOW CREATE VIEW |
SHUTDOWN | 允許使用mysqladmin shutdown |
SUPER | 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語(yǔ)句,mysqladmin debug命令;允許您連接(1次),即便已到達(dá)max_connections。 |
UPDATE | 允許使用UPDATE |
USAGE | “無(wú)權(quán)限”的同義詞 |
GRANT OPTION | 允許授與權(quán)限 |
當(dāng)從舊版本的MySQL升級(jí)時(shí),要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE權(quán)限
授權(quán)
授權(quán)就是為某個(gè)用戶授與權(quán)限
授與的權(quán)限可以分為多個(gè)層級(jí):
全局層級(jí)
全局權(quán)限適用于1個(gè)給定服務(wù)器中的所有數(shù)據(jù)庫(kù)。這些權(quán)限存儲(chǔ)在mysql.user表中。GRANT ALL ON .和REVOKE ALL ON .只授與和撤消全局權(quán)限。
數(shù)據(jù)庫(kù)層級(jí)
數(shù)據(jù)庫(kù)權(quán)限適用于1個(gè)給定數(shù)據(jù)庫(kù)中的所有目標(biāo)。這些權(quán)限存儲(chǔ)在mysql.db和mysql.host表中。GRANT ALL ONdb_name.和REVOKE ALL ON db_name.只授與和撤消數(shù)據(jù)庫(kù)權(quán)限。
表層級(jí)
表權(quán)限適用于1個(gè)給定表中的所有列。這些權(quán)限存儲(chǔ)在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授與和撤消表權(quán)限。
列層級(jí)
列權(quán)限適用于1個(gè)給定表中的單1列。這些權(quán)限存儲(chǔ)在mysql.columns_priv表中。當(dāng)使用REVOKE時(shí),您必須指定與被授權(quán)列相同的列。
子程序?qū)蛹?jí)
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權(quán)限適用于已存儲(chǔ)的子程序。這些權(quán)限可以被授與為全局層級(jí)和數(shù)據(jù)庫(kù)層級(jí)。而且,除CREATE ROUTINE外,這些權(quán)限可以被授與為子程序?qū)蛹?jí),并存儲(chǔ)在mysql.procs_priv表中。
當(dāng)后續(xù)目標(biāo)是1個(gè)表、1個(gè)已存儲(chǔ)的函數(shù)或1個(gè)已存儲(chǔ)的進(jìn)程時(shí),object_type子句應(yīng)被指定為TABLE、FUNCTION或PROCEDURE。當(dāng)從舊版本的MySQL升級(jí)時(shí),要使用本子句,您必須升級(jí)您的授權(quán)表
收回權(quán)限
收回權(quán)限就是取消已賦予用戶的某些權(quán)限。收回用戶沒(méi)必要要的權(quán)限可以在1定程度上保證系統(tǒng)的安全性。
使用REVOKE收回權(quán)限以后,用戶帳戶的記錄將從db、host、tables_priv、columns_priv表中刪除,但是用戶帳號(hào)記錄仍然
在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語(yǔ)句,必須具有mysql數(shù)據(jù)庫(kù)的全局CREATE權(quán)限或UPDATE權(quán)限
使用REVOKE語(yǔ)句取消用戶grantUser的INSERT權(quán)限
REVOKE INSERT ON *.* FROM 'grantUser'@'localhost';
注意:當(dāng)從舊版本的MYSQL升級(jí)時(shí),如果要使用EXECUTE、CREATE VIEW、SHOW VIEW、CREATE USER、CREATE ROUTINE、ALTER ROUTINE權(quán)限,必須先升級(jí)授權(quán)表
查看權(quán)限
SHOW GRANT語(yǔ)句可以顯示用戶的權(quán)限信息
show grants FOR 'user'@'host';