數據庫權限管理
MySQL 是一個多用戶數據庫,具有功能強大的訪問控制系統,可以為不同用戶指定不同權限。我們使用的是 root 用戶,該用戶是超級管理員,擁有所有權限,包括創建用戶、刪除用戶和修改用戶密碼等管理權限。為了實際項目的需要,可以創建擁有不同權限的普通用戶。
1、Mysql權限表
MySQL 在安裝時會自動創建一個名為 mysql 的數據庫,mysql 數據庫中存儲的都是用戶權限表。用戶登錄以后,MySQL 會根據這些權限表的內容為每個用戶賦予相應的權限。user 表是 MySQL 中最重要的一個權限表,用來記錄允許連接到服務器的賬號信息。需要注意的是,在 user 表里啟用的所有權限都是全局級的,適用於所有數據庫。user 表中的字段大致可以分為 4 類,分別是用戶列、權限列、安全列和資源控制列,下面主要介紹這些字段的含義。
1.1、用戶列
用戶列存儲了用戶連接 MySQL 數據庫時需要輸入的信息。需要注意的是 MySQL 5.7 版本不再使用 Password 來作為密碼的字段,而改成了 authentication_string。
字段名 | 字段類型 | 是否為空 | 默認值 | 說明 |
---|---|---|---|---|
Host | char(60) | NO | 無 | 主機名 |
User | char(32) | NO | 無 | 用戶名 |
authentication_string | text | YES | 無 | 密碼 |
用戶登錄時,如果這 3 個字段同時匹配,MySQL 數據庫系統才會允許其登錄。創建新用戶時,也是設置這 3 個字段的值。修改用戶密碼時,實際就是修改 user 表的 authentication_string 字段的值。因此,這 3 個字段決定了用戶能否登錄。
1.2、權限列
權限列的字段決定了用戶的權限,用來描述在全局范圍內允許對數據和數據庫進行的操作。
權限大致分為兩大類,分別是高級管理權限和普通權限:
- 高級管理權限主要對數據庫進行管理,例如關閉服務的權限、超級權限和加載用戶等;
- 普通權限主要操作數據庫,例如查詢權限、修改權限等。
user 表的權限列包括 Select_priv、Insert_ priv 等以 priv 結尾的字段,這些字段值的數據類型為 ENUM,可取的值只有 Y 和 N:Y 表示該用戶有對應的權限,N 表示該用戶沒有對應的權限。從安全角度考慮,這些字段的默認值都為 N。
字段名 | 字段類型 | 是否為空 | 默認值 | 說明 |
---|---|---|---|---|
Select_priv | enum('N','Y') | NO | N | 是否可以通過SELECT 命令查詢數據 |
Insert_priv | enum('N','Y') | NO | N | 是否可以通過 INSERT 命令插入數據 |
Update_priv | enum('N','Y') | NO | N | 是否可以通過UPDATE 命令修改現有數據 |
Delete_priv | enum('N','Y') | NO | N | 是否可以通過DELETE 命令刪除現有數據 |
Create_priv | enum('N','Y') | NO | N | 是否可以創建新的數據庫和表 |
Drop_priv | enum('N','Y') | NO | N | 是否可以刪除現有數據庫和表 |
Reload_priv | enum('N','Y') | NO | N | 是否可以執行刷新和重新加載MySQL所用的各種內部緩存的特定命令,包括日志、權限、主機、查詢和表 |
Shutdown_priv | enum('N','Y') | NO | N | 是否可以關閉MySQL服務器。將此權限提供給root賬戶之外的任何用戶時,都應當非常謹慎 |
Process_priv | enum('N','Y') | NO | N | 是否可以通過SHOW PROCESSLIST命令查看其他用戶的進程 |
File_priv | enum('N','Y') | NO | N | 是否可以執行SELECT INTO OUTFILE和LOAD DATA INFILE命令 |
Grant_priv | enum('N','Y') | NO | N | 是否可以將自己的權限再授予其他用戶 |
References_priv | enum('N','Y') | NO | N | 是否可以創建外鍵約束 |
Index_priv | enum('N','Y') | NO | N | 是否可以對索引進行增刪查 |
Alter_priv | enum('N','Y') | NO | N | 是否可以重命名和修改表結構 |
Show_db_priv | enum('N','Y') | NO | N | 是否可以查看服務器上所有數據庫的名字,包括用戶擁有足夠訪問權限的數據庫 |
Super_priv | enum('N','Y') | NO | N | 是否可以執行某些強大的管理功能,例如通過KILL命令刪除用戶進程;使用SET GLOBAL命令修改全局MySQL變量,執行關於復制和日志的各種命令。(超級權限) |
Create_tmp_table_priv | enum('N','Y') | NO | N | 是否可以創建臨時表 |
Lock_tables_priv | enum('N','Y') | NO | N | 是否可以使用LOCK TABLES命令阻止對表的訪問/修改 |
Execute_priv | enum('N','Y') | NO | N | 是否可以執行存儲過程 |
Repl_slave_priv | enum('N','Y') | NO | N | 是否可以讀取用於維護復制數據庫環境的二進制日志文件 |
Repl_client_priv | enum('N','Y') | NO | N | 是否可以確定復制從服務器和主服務器的位置 |
Create_view_priv | enum('N','Y') | NO | N | 是否可以創建視圖 |
Show_view_priv | enum('N','Y') | NO | N | 是否可以查看視圖 |
Create_routine_priv | enum('N','Y') | NO | N | 是否可以更改或放棄存儲過程和函數 |
Alter_routine_priv | enum('N','Y') | NO | N | 是否可以修改或刪除存儲函數及函數 |
Create_user_priv | enum('N','Y') | NO | N | 是否可以執行CREATE USER命令,這個命令用於創建新的MySQL賬戶 |
Event_priv | enum('N','Y') | NO | N | 是否可以創建、修改和刪除事件 |
Trigger_priv | enum('N','Y') | NO | N | 是否可以創建和刪除觸發器 |
Create_tablespace_priv | enum('N','Y') | NO | N | 是否可以創建表空間 |
如果要修改權限,可以使用 GRANT 語句為用戶賦予一些權限,也可以通過 UPDATE 語句更新 user 表的方式來設置權限。
1.3、安全列
安全列主要用來判斷用戶是否能夠登錄成功。
字段名 | 字段類型 | 是否為空 | 默認值 | 說明 |
---|---|---|---|---|
ssl_type | enum('','ANY','X509','SPECIFIED') | NO | 支持ssl標准加密安全字段 | |
ssl_cipher | blob | NO | 支持ssl標准加密安全字段 | |
x509_issuer | blob | NO | 支持x509標准字段 | |
x509_subject | blob | NO | 支持x509標准字段 | |
plugin | char(64) | NO | mysql_native_password | 引入plugins以進行用戶連接時的密碼驗證,plugin創建外部/代理用戶 |
password_expired | enum('N','Y') | NO | N | 密碼是否過期 (N 未過期,y 已過期) |
password_last_changed | timestamp | YES | 記錄密碼最近修改的時間 | |
password_lifetime | smallint(5) unsigned | YES | 設置密碼的有效時間,單位為天數 | |
account_locked | enum('N','Y') | NO | N | 用戶是否被鎖定(Y 鎖定,N 未鎖定) |
注意:即使 password_expired 為“Y”,用戶也可以使用密碼登錄 MySQL,但是不允許做任何操作。
通常標准的發行版不支持 ssl,讀者可以使用 SHOW VARIABLES LIKE "have_openssl" 語句來查看是否具有 ssl 功能。如果 have_openssl 的值為 DISABLED,那么則不支持 ssl 加密功能。
1.4、資源控制列
資源控制列的字段用來限制用戶使用的資源。
字段名 | 字段類型 | 是否為空 | 默認值 | 說明 |
---|---|---|---|---|
max_questions | int(11) unsigned | NO | 0 | 規定每小時允許執行查詢的操作次數 |
max_updates | int(11) unsigned | NO | 0 | 規定每小時允許執行更新的操作次數 |
max_connections | int(11) unsigned | NO | 0 | 規定每小時允許執行的連接操作次數 |
max_user_connections | int(11) unsigned | NO | 0 | 規定允許同時建立的連接次數 |
以上字段的默認值為 0,表示沒有限制。一個小時內用戶查詢或者連接數量超過資源控制限制,用戶將被鎖定,直到下一個小時才可以在此執行對應的操作。可以使用 GRANT 語句更新這些字段的值。
2、MySQL創建用戶
MySQL 在安裝時,會默認創建一個名為 root 的用戶,該用戶擁有超級權限,可以控制整個 MySQL 服務器。
在對 MySQL 的日常管理和操作中,為了避免有人惡意使用 root 用戶控制數據庫,我們通常創建一些具有適當權限的用戶,盡可能地不用或少用 root 用戶登錄系統,以此來確保數據的安全訪問。
MySQL 提供了以下 3 種方法創建用戶。
-
使用 CREATE USER 語句創建用戶
-
在 mysql.user 表中添加用戶
-
使用 GRANT 語句創建用戶
2.1、使用 CREATE USER 語句創建用戶
可以使用 CREATE USER 語句來創建 MySQL 用戶,並設置相應的密碼。其基本語法格式如下:
CREATE USER <用戶> [ IDENTIFIED BY [ PASSWORD ] 'password' ] [ ,用戶 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]
2.1.1、用戶
指定創建用戶賬號,格式為 user_name'@'host_name。這里的user_name是用戶名,host_name為主機名,即用戶連接 MySQL 時所用主機的名字。如果在創建的過程中,只給出了用戶名,而沒指定主機名,那么主機名默認為“%”,表示一組主機,即對所有主機開放權限。
2.1.2、IDENTIFIED BY子句
用於指定用戶密碼。新用戶可以沒有初始密碼,若該用戶不設密碼,可省略此子句。
2.1.3、PASSWORD 'password'
PASSWORD 表示使用哈希值設置密碼,該參數可選。如果密碼是一個普通的字符串,則不需要使用 PASSWORD 關鍵字。
案例:
mysql> CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
Query OK, 0 rows affected (19.46 sec)
mysql> SELECT password('test1');
+-------------------------------------------+
| password('test1') |
+-------------------------------------------+
| *06C0BF5B64ECE2F648B5F048A71903906BA08E5C |
+-------------------------------------------+
1 row in set (0.06 sec)
"*06C0BF5B64ECE2F648B5F048A71903906BA08E5C"就是 test1 的哈希值。下面創建用戶 test1,SQL 語句和執行過程如下:
mysql> CREATE USER 'test2'@'localhost'IDENTIFIED BY PASSWORD '*06C0BF5B64ECE2F648B5F048A71903906BA08E5C';
Query OK, 0 rows affected (0.04 sec)
2.2、使用 INSERT 語句新建用戶
可以使用 INSERT 語句將用戶的信息添加到 mysql.user 表中,但必須擁有對 mysql.user 表的 INSERT 權限。通常 INSERT 語句只添加 Host、User 和 authentication_string 這 3 個字段的值。
mysql> INSERT INTO mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('localhost', 'test3', PASSWORD('test3'), '', '', '');
Query OK, 1 row affected, 1 warning (0.00 sec)
-- 使用test3登錄MySQL
root@756ad135dd2e:/# mysql -utest3 -ptest3
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'test3'@'localhost' (using password: YES)
-- 無法登錄,使用INSERT創建的用戶需要使用FLUSH PRIVILEGES;刷新權限。
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
root@756ad135dd2e:/# mysql -utest3 -ptest3
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 61
Server version: 5.7.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2.3、使用GRANT語句新建用戶
雖然 CREATE USER 和 INSERT INTO 語句都可以創建普通用戶,但是這兩種方式不便授予用戶權限。於是 MySQL 提供了 GRANT 語句。
GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']
其中:
-
priv_type 參數表示新用戶的權限
-
database.table 參數表示新用戶的權限范圍,即只能在指定的數據庫和表上使用自己的權限
-
user 參數指定新用戶的賬號,由用戶名和主機名構成
-
IDENTIFIED BY 關鍵字用來設置密碼
-
password 參數表示新用戶的密碼
mysql> GRANT SELECT ON *.* TO 'test4'@localhost IDENTIFIED BY 'test4';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'test5'@localhost IDENTIFIED BY 'test5';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
-- ALL PRIVILEGES : 所有的權限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
3、MySQL修改用戶
在 MySQL 中,我們可以使用 RENAME USER 語句修改一個或多個已經存在的用戶賬號。
語法格式如下:
RENAME USER <舊用戶> TO <新用戶>
其中:
- <舊用戶>:系統中已經存在的 MySQL 用戶賬號。
- <新用戶>:新的 MySQL 用戶賬號。
mysql> RENAME USER 'test5'@'localhost' TO 'test6'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT Host,User FROM mysql.user;
+-----------+---------------+
| Host | User |
+-----------+---------------+
| % | root |
| % | test6 |
+-----------+---------------+
9 rows in set (0.00 sec)
mysql> exit
Bye
root@756ad135dd2e:/# mysql -utest6 -ptest5
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 64
Server version: 5.7.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
4、MySQL刪除用戶
在 MySQL 數據庫中,可以使用 DROP USER 語句刪除用戶,也可以直接在 mysql.user 表中刪除用戶以及相關權限。
4.1、使用 DROP USER 語句刪除普通用戶
格式:
DROP USER <用戶1> [ , <用戶2> ]…
案例:
mysql> DROP USER test6;
Query OK, 0 rows affected (0.00 sec)
4.2、使用DELETE語句刪除普通用戶
可以使用 DELETE 語句直接刪除 mysql.user 表中相應的用戶信息,但必須擁有 mysql.user 表的 DELETE 權限。
格式:
DELETE FROM mysql.user WHERE Host='hostname' AND User='username';
Host 和 User 這兩個字段都是 mysql.user 表的主鍵。因此,需要兩個字段的值才能確定一條記錄。
案例:
mysql> DELETE FROM mysql.user WHERE Host='localhost' AND User='test4';
Query OK, 1 row affected (0.00 sec)
5、MySQL查看權限
在 MySQL 中,可以通過查看 mysql.user 表中的數據記錄來查看相應的用戶權限,也可以使用 SHOW GRANTS 語句查詢用戶的權限。
格式:
SHOW GRANTS FOR 'username'@'hostname';
案例:
mysql> SHOW GRANTS FOR 'test3'@'localhost';
+-------------------------------------------+
| Grants for test3@localhost |
+-------------------------------------------+
| GRANT USAGE ON *.* TO 'test3'@'localhost' |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
6、MySQL授權
授權就是為某個用戶賦予某些權限。例如,可以為新建的用戶賦予查詢所有數據庫和表的權限。MySQL 提供了 GRANT 語句來為用戶設置權限。
在 MySQL 中,擁有 GRANT 權限的用戶才可以執行 GRANT 語句,其語法格式如下:
GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user[IDENTIFIED BY [PASSWORD] 'password']] ...
[WITH with_option [with_option]...]
其中:
-
priv_type 參數表示權限類型;
-
columns_list 參數表示權限作用於哪些列上,省略該參數時,表示作用於整個表;
-
database.table 用於指定權限的級別;
-
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 個連接。
MySQL 中可以授予的權限有如下幾組:
-
列權限,和表中的一個具體列相關。例如,可以使用 UPDATE 語句更新表 students 中 name 列的值的權限。
-
表權限,和一個具體表中的所有數據相關。例如,可以使用 SELECT 語句查詢表 students 的所有數據的權限。
-
數據庫權限,和一個具體的數據庫中的所有表相關。例如,可以在已有的數據庫 mytest 中創建新表的權限。
-
用戶權限,和 MySQL 中所有的數據庫相關。例如,可以刪除已有的數據庫或者創建一個新的數據庫的權限。
對應地,在 GRANT 語句中可用於指定權限級別的值有以下幾類格式:
-
*:表示當前數據庫中的所有表。
-
.:表示所有數據庫中的所有表。
-
db_name.*:表示某個數據庫中的所有表,db_name 指定數據庫名。
-
db_name.tbl_name:表示某個數據庫中的某個表或視圖,db_name 指定數據庫名,tbl_name 指定表名或視圖名。
6.1、權限類型
授予數據庫權限時,<權限類型>可以指定為以下值:
權限名稱 | 對應user表中的字段 | 說明 |
---|---|---|
SELECT | Select_priv | 表示授予用戶可以使用 SELECT 語句訪問特定數據庫中所有表和視圖的權限。 |
INSERT | Insert_priv | 表示授予用戶可以使用 INSERT 語句向特定數據庫中所有表添加數據行的權限。 |
DELETE | Delete_priv | 表示授予用戶可以使用 DELETE 語句刪除特定數據庫中所有表的數據行的權限。 |
UPDATE | Update_priv | 表示授予用戶可以使用 UPDATE 語句更新特定數據庫中所有數據表的值的權限。 |
REFERENCES | References_priv | 表示授予用戶可以創建指向特定的數據庫中的表外鍵的權限。 |
CREATE | Create_priv | 表示授權用戶可以使用 CREATE TABLE 語句在特定數據庫中創建新表的權限。 |
ALTER | Alter_priv | 表示授予用戶可以使用 ALTER TABLE 語句修改特定數據庫中所有數據表的權限。 |
SHOW VIEW | Show_view_priv | 表示授予用戶可以查看特定數據庫中已有視圖的視圖定義的權限。 |
CREATE ROUTINE | Create_routine_priv | 表示授予用戶可以為特定的數據庫創建存儲過程和存儲函數的權限。 |
ALTER ROUTINE | Alter_routine_priv | 表示授予用戶可以更新和刪除數據庫中已有的存儲過程和存儲函數的權限。 |
INDEX | Index_priv | 表示授予用戶可以在特定數據庫中的所有數據表上定義和刪除索引的權限。 |
DROP | Drop_priv | 表示授予用戶可以刪除特定數據庫中所有表和視圖的權限。 |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | 表示授予用戶可以在特定數據庫中創建臨時表的權限。 |
CREATE VIEW | Create_view_priv | 表示授予用戶可以在特定數據庫中創建新的視圖的權限。 |
EXECUTE ROUTINE | Execute_priv | 表示授予用戶可以調用特定數據庫的存儲過程和存儲函數的權限。 |
LOCK TABLES | Lock_tables_priv | 表示授予用戶可以鎖定特定數據庫的已有數據表的權限。 |
ALL 或 ALL PRIVILEGES 或 SUPER | Super_priv | 表示以上所有權限/超級權限 |
6.2、用戶授權
使用 GRANT 語句創建一個新的用戶 test7,密碼為 test7。用戶 testUser 對所有的數據有查詢、插入權限,並授予 GRANT 權限。SQL 語句和執行過程如下。
mysql> GRANT SELECT,INSERT ON *.* TO 'test7'@'localhost' IDENTIFIED BY 'test7' WITH GRANT OPTION;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> SHOW GRANTS FOR 'test7'@'localhost';
+----------------------------------------------------------------------+
| Grants for test7@localhost |
+----------------------------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'test7'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)
注:常用的權限
SELECT, SHOW VIEW : 數據庫可讀權限。
6.3、刪除用戶權限
在 MySQL 中,可以使用 REVOKE 語句刪除某個用戶的某些權限(此用戶不會被刪除),在一定程度上可以保證系統的安全性。例如,如果數據庫管理員覺得某個用戶不應該擁有 DELETE 權限,那么就可以刪除 DELETE 權限。
6.3.1、刪除用戶某些特定的權限
格式:
REVOKE priv_type [(column_list)]...
ON database.table
FROM user [, user]...
REVOKE 語句中的參數與 GRANT 語句的參數意思相同。其中:
-
priv_type 參數表示權限的類型
-
column_list 參數表示權限作用於哪些列上,沒有該參數時作用於整個表上
-
user 參數由用戶名和主機名構成,格式為'username'@'hostname'
6.3.2、刪除特定用戶的所有權限
格式:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
刪除用戶權限需要注意以下幾點:
- REVOKE 語法和 GRANT 語句的語法格式相似,但具有相反的效果。
- 要使用 REVOKE 語句,必須擁有 MySQL 數據庫的全局 CREATE USER 權限或 UPDATE 權限。
mysql> REVOKE INSERT ON *.* FROM 'test7'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW GRANTS FOR 'test7'@'localhost';
+--------------------------------------------------------------+
| Grants for test7@localhost |
+--------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'test7'@'localhost' WITH GRANT OPTION |
+--------------------------------------------------------------+
1 row in set (0.00 sec)
7、MySQL登錄和退出
啟動 MySQL 服務后,可以使用以下命令來登錄。
mysql -h hostname|hostlP -p port -u username -p DatabaseName -e "SQL語句"
-- 退出
exit
quit
\q
對上述參數說明如下:
-
-h:指定連接 MySQL 服務器的地址。可以用兩種方式表示,hostname 為主機名,hostIP 為主機 IP 地址。
-
-p:指定連接 MySQL 服務器的端口號,port 為連接的端口號。MySQL 的默認端口號是 3306,因此如果不指定該參數,默認使用 3306 連接 MySQL 服務器。
-
-u:指定連接 MySQL 服務器的用戶名,username 為用戶名。
-
-p:提示輸入密碼,即提示 Enter password。
-
DatabaseName:指定連接到 MySQL 服務器后,登錄到哪一個數據庫中。如果沒有指定,默認為 mysql 數據庫。
-
-e:指定需要執行的 SQL 語句,登錄 MySQL 服務器后執行這個 SQL 語句,然后退出 MySQL 服務器。
root@756ad135dd2e:/# mysql -uroot -p123456 -e "DESC db1.db01";
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| name | varchar(20) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | auto_increment |
| sex | varchar(20) | YES | | NULL | |
| addr | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
8、修改用戶密碼
在 MySQL 中,root 用戶擁有很高的權限,不僅可以修改自己的密碼,還可以修改其他用戶的密碼。
8.1、使用SET語句修改普通用戶的密碼
在 MySQL 中,只有 root 用戶可以通過更新 MySQL 數據庫來更改密碼。使用 root 用戶登錄到 MySQL 服務器后,可以使用 SET 語句來修改普通用戶密碼。
mysql> SET PASSWORD FOR 'test7'@'localhost' = PASSWORD ('test07');
Query OK, 0 rows affected, 1 warning (0.00 sec)
8.2、使用UPDATE語句修改普通用戶的密碼
使用 root 用戶登錄 MySQL 服務器后,可以使用 UPDATE 語句修改 MySQL 數據庫的 user 表的 authentication_string 字段,從而修改普通用戶的密碼。
mysql> UPDATE mysql.user SET authentication_string = PASSWORD("test007") WHERE User = "test7" AND Host = "localhost";
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
8.3、使用 GRANT 語句修改普通用戶密碼
除了前面介紹的方法,還可以在全局級別使用 GRANT USAGE 語句指定某個賬戶的密碼而不影響賬戶當前的權限。需要注意的是,使用 GRANT 語句修改密碼,必須擁有 GRANT 權限。一般情況下最好使用該方法來指定或修改密碼。
mysql> GRANT USAGE ON *.* TO 'test7'@'localhost' IDENTIFIED BY 'test0007';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
8.4、使用mysqladmin命令在命令行修改root密碼
root 用戶可以使用 mysqladmin 命令來修改密碼。
mysqladmin -u username -h hostname -p password "newpwd"
語法參數說明如下:
-
usermame 指需要修改密碼的用戶名稱,在這里指定為 root 用戶;
-
hostname 指需要修改密碼的用戶主機名,該參數可以不寫,默認是 localhost;
-
password 為關鍵字,而不是指舊密碼;
-
newpwd 為新設置的密碼,必須用雙引號括起來。如果使用單引號會引發錯誤,可能會造成修改后的密碼不是你想要的。
root@756ad135dd2e:/# mysqladmin -uroot -p123456 password test00007
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
root@756ad135dd2e:/# mysql -uroot -ptest00007;
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 87
Server version: 5.7.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
8.5、修改MySQL數據庫的user表
因為所有賬戶信息都保存在 user 表中,因此可以直接通過修改 user 表來改變 root 用戶的密碼。
mysql> UPDATE mysql.user set authentication_string = PASSWORD ("123456") WHERE User = "root" and Host="localhost";
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 1
-- 結果顯示,密碼修改成功。而且使用了FLUSH PRIVILEGES;語句加載權限。退出后就必須使用新密碼來登錄了。
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
root@756ad135dd2e:/# mysql -uroot -p123456;
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 90
Server version: 5.7.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
8.6、使用SET語句修改root用戶的密碼
SET PASSWORD 語句可以用來重新設置其他用戶的登錄密碼或者自己使用的賬戶的密碼。
mysql> SET PASSWORD = PASSWORD("test07");
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> exit
Bye
root@756ad135dd2e:/# mysql -uroot -ptest07;
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 91
Server version: 5.7.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
8.7、root密碼忘記了,如何重置?
當我們忘記用戶密碼時,我們可以通過跳過授權表的方式重置root密碼。
root@756ad135dd2e:/# cat /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
skip_grant_tables
root@756ad135dd2e:/# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> UPDATE mysql.user set authentication_string = PASSWORD ("123456") WHERE User = "root" and Host="localhost";
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
-- 刪除skip_grant_tables
root@756ad135dd2e:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
案例:創建用戶test01,只給可查和可寫權限。
mysql> GRANT SELECT, SHOW VIEW ON *.* TO test001@"%" IDENTIFIED BY "test001";
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
案例:創建用戶test02,只給可寫權限。
mysql> GRANT INSERT ON *.* TO test02@"%" IDENTIFIED BY "test02";
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)