前言: 前面幾篇文章為大家介紹了各種SQL語法的使用,本篇文章將主要介紹MySQL用戶及許可權相關知識,如果你不是DBA的話可能平時用的不多,但是瞭解下也是好處多多。 1.創建用戶 官方推薦創建語法為: 通常我們常用的創建語法為: 語法說明如下: 1) 指定創建用戶賬號,格式為 'user_name' ...
前言:
前面幾篇文章為大家介紹了各種SQL語法的使用,本篇文章將主要介紹MySQL用戶及許可權相關知識,如果你不是DBA的話可能平時用的不多,但是瞭解下也是好處多多。
1.創建用戶
官方推薦創建語法為:
CREATE USER [IF NOT EXISTS]
user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH resource_option [resource_option] ...]
[password_option | lock_option] ...
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
password_option: {
PASSWORD EXPIRE
| PASSWORD EXPIRE DEFAULT
| PASSWORD EXPIRE NEVER
| PASSWORD EXPIRE INTERVAL N DAY
}
lock_option: {
ACCOUNT LOCK
| ACCOUNT UNLOCK
}
通常我們常用的創建語法為:
CREATE USER <用戶名> [ IDENTIFIED ] BY [ PASSWORD ] <口令>
語法說明如下:
1) <用戶名>
指定創建用戶賬號,格式為 'user_name'@'host_name'。這裡user_name
是用戶名,host_name
為主機名,即用戶連接 MySQL 時所在主機的名字。若在創建的過程中,只給出了賬戶的用戶名,而沒指定主機名,則主機名預設為“%”,表示一組主機。
2) PASSWORD
可選項,用於指定散列口令,即若使用明文設置口令,則需忽略PASSWORD
關鍵字;若不想以明文設置口令,且知道 PASSWORD() 函數返回給密碼的散列值,則可以在口令設置語句中指定此散列值,但需要加上關鍵字PASSWORD
。
3) IDENTIFIED BY子句
用於指定用戶賬號對應的口令,若該用戶賬號無口令,則可省略此子句。
4) <口令>
指定用戶賬號的口令,在IDENTIFIED BY
關鍵字或PASSWOED
關鍵字之後。給定的口令值可以是只由字母和數字組成的明文,也可以是通過 PASSWORD() 函數得到的散列值。
使用 CREATE USER 語句應該註意以下幾點:
- 如果使用 CREATE USER 語句時沒有為用戶指定口令,那麼 MySQL 允許該用戶可以不使用口令登錄系統,然而從安全的角度而言,不推薦這種做法。
- 使用 CREATE USER 語句必須擁有 MySQL 中 mysql 資料庫的 INSERT 許可權或全局 CREATE USER 許可權。
- 使用 CREATE USER 語句創建一個用戶賬號後,會在系統自身的 MySQL 資料庫的 user 表中添加一條新記錄。若創建的賬戶已經存在,則語句執行時會出現錯誤。
- 新創建的用戶擁有的許可權很少。他們可以登錄 MySQL,只允許進行不需要許可權的操作,如使用 SHOW 語句查詢所有存儲引擎和字元集的列表等。
- 如果兩個用戶具有相同的用戶名和不同的主機名,MySQL 會將他們視為不同的用戶,並允許為這兩個用戶分配不同的許可權集合。
示例:
#註意:test_user@'%' 和 test_user@'localhost' 是兩個不同的用戶
CREATE USER 'test_user'@'%' identified by '123456';
CREATE USER 'test_user'@'localhost' identified by '123456789';
2.更改用戶
更改用戶信息主要包括重命名,改密碼,鎖定或解鎖用戶。下麵將通過案例為大家展示這些用法:
#重命名用戶
RENAME USER 'test_user'@'%' to 'test'@'%';
#修改密碼
ALTER USER 'test'@'%' identified by '123456789';
#鎖定或解鎖用戶
ALTER USER 'test'@'%' ACCOUNT LOCK;
ALTER USER 'test'@'%' ACCOUNT UNLOCK;
3.刪除用戶
MySQL 資料庫中可以使用 DROP USER 語句來刪除一個或多個用戶賬號以及相關的許可權。
官方推薦語法格式:
DROP USER [IF EXISTS] user [, user] ...
使用 DROP USER 語句應該註意以下幾點:
- DROP USER 語句可用於刪除一個或多個 MySQL 賬戶,並撤銷其原有許可權。
- 使用 DROP USER 語句必須擁有 MySQL 中的 mysql 資料庫的 DELETE 許可權或全局 CREATE USER 許可權。
- 在 DROP USER 語句的使用中,若沒有明確地給出賬戶的主機名,則該主機名預設為“%”。
4.用戶授權
當成功創建用戶後,還不能執行任何操作,需要為該用戶分配適當的訪問許可權。可以使用 SHOW GRANT FOR 語句來查詢用戶的許可權。
註意:新創建的用戶只有登錄 MySQL 伺服器的許可權,沒有任何其他許可權,不能進行其他操作。
USAGE ON . 表示該用戶對任何資料庫和任何表都沒有許可權。
對於新建的 MySQL 用戶,必須給它授權,可以用 GRANT 語句來實現對新建用戶的授權。官方推薦語法格式:
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH {GRANT OPTION | resource_option} ...]
GRANT PROXY ON user
TO user [, user] ...
[WITH GRANT OPTION]
object_type: {
TABLE
| FUNCTION
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
首先大家要知道,許可權是分級別的。可以授予的許可權有如下幾組:
- 列級別,和表中的一個具體列相關。例如,可以使用 UPDATE 語句更新表 students 中 student_name 列的值的許可權。
- 表級別,和一個具體表中的所有數據相關。例如,可以使用 SELECT 語句查詢表 students 的所有數據的許可權。
- 資料庫級別,和一個具體的資料庫中的所有表相關。例如,可以在已有的資料庫 mytest 中創建新表的許可權。
- 全局,和 MySQL 中所有的資料庫相關。例如,可以刪除已有的資料庫或者創建一個新的資料庫的許可權。
下表是所有可授予的許可權及其意義:
許可權 | 意義和可授予級別 |
---|---|
ALL [PRIVILEGES] |
授予在指定的訪問級別的所有許可權,除了 GRANT OPTION 和 PROXY 。 |
ALTER |
啟用ALTER TABLE 。級別:全局,資料庫,表。 |
ALTER ROUTINE |
允許更改或刪除存儲過程。級別:全局,資料庫。 |
CREATE |
啟用資料庫和表創建。級別:全局,資料庫,表。 |
CREATE ROUTINE |
啟用存儲過程創建。級別:全局,資料庫。 |
CREATE TABLESPACE |
啟用要創建,更改或刪除的表空間和日誌文件組。等級:全局。 |
CREATE TEMPORARY TABLES |
啟用CREATE TEMPORARY TABLE 。級別:全局,資料庫。 |
CREATE USER |
允許使用CREATE USER , DROP USER , RENAME USER ,和 REVOKE ALL PRIVILEGES 。等級:全球。 |
CREATE VIEW |
啟用要創建或更改視圖。級別:全局,資料庫,表。 |
DELETE |
啟用DELETE 。級別:全局,資料庫,表。 |
DROP |
啟用要刪除資料庫,表和視圖。級別:全局,資料庫,表。 |
EVENT |
啟用事件使用。級別:全局,資料庫。 |
EXECUTE |
使用戶能夠執行存儲過程。級別:全局,資料庫。 |
FILE |
使用戶能夠使伺服器讀取或寫入文件。等級:全局。 |
GRANT OPTION |
啟用授予其他帳戶或從其他帳戶中刪除的許可權。級別:全局,資料庫,表,代理。 |
INDEX |
啟用要創建或刪除索引。級別:全局,資料庫,表。 |
INSERT |
啟用INSERT 。級別:全局,資料庫,表,列。 |
LOCK TABLES |
允許使用LOCK TABLES 您擁有該SELECT 許可權的表。級別:全局,資料庫。 |
PROCESS |
使用戶能夠查看所有進程SHOW PROCESSLIST 。等級:全局。 |
PROXY |
啟用用戶代理。級別:從用戶到用戶。 |
REFERENCES |
啟用外鍵創建。級別:全局,資料庫,表,列。 |
RELOAD |
啟用FLUSH 操作。等級:全局。 |
REPLICATION CLIENT |
使用戶可以詢問主伺服器或從伺服器的位置。等級:全局。 |
REPLICATION SLAVE |
啟用複製從屬以從主伺服器讀取二進位日誌。等級:全局。 |
SELECT |
啟用SELECT 。級別:全局,資料庫,表,列。 |
SHOW DATABASES |
啟用SHOW DATABASES 以顯示所有資料庫。等級:全局。 |
SHOW VIEW |
啟用SHOW CREATE VIEW 。級別:全局,資料庫,表。 |
SHUTDOWN |
啟用mysqladmin shutdown。等級:全局。 |
SUPER |
能夠使用如其他命令 CHANGE MASTER TO , KILL , PURGE BINARY LOGS , SET GLOBAL ,和中mysqladmin的調試命令。等級:全局。 |
TRIGGER |
啟用觸發操作。級別:全局,資料庫,表。 |
UPDATE |
啟用UPDATE 。級別:全局,資料庫,表,列。 |
USAGE |
“ no privileges ”的同義詞 |
其實grant語句可以直接創建用戶並授權,這裡建議大家先用create user語句創建好用戶之後再單獨進行授權。下麵我將用示例為大家展示如何授權:
#全局許可權
GRANT super,select on *.* to 'test_user'@'%';
#庫許可權
GRANT select,insert,update,delete,create,alter,execute on `testdb`.* to 'test_user'@'%';
#表許可權
GRANT select,insert on `testdb`.tb to 'test_user'@'%';
#列許可權
GRANT select (col1), insert (col1, col2) ON `testdb`.mytbl to 'test_user'@'%';
5.回收許可權
在MySQL中,可以使用 REVOKE 語句回收一個用戶的許可權,此用戶不會被刪除。
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL [PRIVILEGES], GRANT OPTION
FROM user [, user] ...
語法說明如下:
- REVOKE 語法和 GRANT 語句的語法格式相似,但具有相反的效果。
- 第一種語法格式用於回收某些特定的許可權。
- 第二種語法格式用於回收特定用戶的所有許可權。
- 要使用 REVOKE 語句,必須擁有 MySQL 資料庫的全局 CREATE USER 許可權或 UPDATE 許可權。
一般情況下我們先會使用show grants語法查詢該用戶的許可權,如果發現許可權過大,會用revoke語法回收許可權。示例如下:
#查看用戶許可權
mysql> show grants for 'test_user'@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for test_user@% |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test_user'@'%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, EXECUTE ON `testdb`.* TO 'test_user'@'%' |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
#發現許可權過大,想回收drop,alter許可權 則可以這樣回收:
REVOKE drop,alter on `testdb`.* from 'test_user'@'%';
總結:
本篇文章為大家介紹瞭如何創建,更改,刪除用戶以及如何授於和回收許可權。希望大家能對MySQL中用戶管理這一塊能有更深的認識。入門MySQL系列文章寫了好幾篇了,一開始並沒有想好寫多少篇的準備,可能邏輯也不太合理,還是感謝大家的閱讀。最後一篇打算寫備份與恢復相關內容,大家期待一下哦!