【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客
《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)
MySQL提供了许多语句来管理用户账号,包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等。MySQL数据库的安全性需要通过账户管理来保证。本节将介绍如何在MySQL中对账户进行管理。
13.2.1 登录和退出MySQL服务器
登录MySQL时,可以使用mysql命令并在后面指定登录主机、用户名和密码。本小节将详细介绍mysql命令的常用参数以及登录和退出MySQL服务器的方法。
通过mysql -help命令可以查看mysql命令帮助信息。mysql命令的常用参数如下:
(1)-h主机名,可以使用该参数指定主机名或IP地址,如果不指定,默认是localhost。
(2)-u用户名,可以使用该参数指定用户名。
(3)-p密码,可以使用该参数指定登录密码。如果该参数后面有一段字符串,则该段字符串将作为用户的密码直接登录;如果后面没有内容,则登录的时候会提示输入密码。注意:该参数后面的字符串和-p之间不能有空格。
(4)-P端口号,该参数后面接MySQL服务器的端口号,默认为3306。
(5)数据库名,可以在命令的最后指定数据库名。
(6)-e SQL语句。如果指定了该参数,将在登录后执行-e后面的命令或SQL语句并退出。
【例13.1】使用root用户登录到本地MySQL服务器的mysql库中,命令如下:
mysql -h localhost -u root -p mysql
命令执行结果如下:
C:\Users\Administrator>mysql -h localhost -u root -p mysql
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 9.0.1 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
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.
执行命令时,会提示"Enter password:",如果没有设置密码,可以直接按Enter键。密码正确就可以直接登录到服务器下面的mysql数据库中了。
【例13.2】使用root用户登录到本地MySQL服务器的test_db数据库中,同时执行一条查询语句。命令如下:
MySQL -h localhost -u root -p test_db -e "DESC person;"
命令执行结果如下:
C:\ > MySQL -h localhost -u root -p test_db -e "DESC person;"
Enter password: **
+-------+-------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| name | char(40) | NO | | | |
| age | int | NO | | 0 | |
| info | char(50) | YES | | NULL | |
+-------+-------------------+------+-----+---------+----------------+
按照提示输入密码,命令执行完成后查询出person表的结构,查询返回之后会自动退出MySQL。
13.2.2 新建普通用户
要创建新用户,必须有相应的权限来执行创建操作。在MySQL数据库中,有两种方式创建新用户:一种是使用CREATE USER语句;另一种是直接操作MySQL授权表。下面分别介绍这两种创建新用户的方法。
1. 使用CREATE USER语句创建新用户
执行CREATE USER 或GRANT语句时,服务器会修改相应的用户授权表,添加或者修改用户及其权限。CREATE USER语句的基本语法格式如下:
CREATE USER user_specification
[, user_specification] ...
user_specification:
user@host
[
IDENTIFIED BY [PASSWORD] 'password'
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
]
user表示创建的用户的名称;host表示允许登录的主机名称;IDENTIFIED BY表示用来设置用户的密码;[PASSWORD]表示使用哈希值设置密码,该参数可选;'password'表示用户登录时使用的普通明文密码;IDENTIFIED WITH语句为用户指定一个身份验证插件;auth_plugin是插件的名称,插件的名称可以是一个带单引号或者双引号的字符串;auth_string是可选的字符串参数,该参数将传递给身份验证插件,由该插件解释该参数的意义。
使用CREATE USER语句的用户,必须有全局的CREATE USER权限或MySQL数据库的INSERT权限。每添加一个用户,CREATE USER语句会在MySQL.user表中添加一条新记录,但是新创建的账户没有任何权限。如果添加的账户已经存在,则CREATE USER语句会返回一个错误。
【例13.3】使用CREATE USER语句创建一个用户,用户名是jeffrey,密码是mypass,主机名是localhost,SQL语句如下:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
如果只指定用户名部分"jeffrey",主机名部分则默认为"%"(对所有的主机开放权限)。
user_specification告诉MySQL服务器当用户登录时怎么验证用户的登录授权。如果指定用户登录不需要密码,则可以省略IDENTIFIED BY部分:
CREATE USER 'jeffrey'@'localhost';
此种情况,MySQL服务器使用内建的身份验证机制,用户登录时不能指定密码。
如果要创建指定密码的用户,需要IDENTIFIED BY 指定明文密码值:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
此种情况,MySQL服务器使用内建的身份验证机制,用户登录时必须指定密码。
MySQL的某些版本中会引入授权表的结构变化,添加新的特权或功能。每当更新MySQL到一个新的版本时,应该更新授权表,以确保它们有最新的结构,可以使用任何新功能。
2. 直接操作MySQL用户表
通过前面的介绍可知,使用CREATE USER创建新用户时,实际上是在向user表中添加一条新的记录。因此,可以使用INSERT语句向user表中直接插入一条记录来创建一个新的用户。使用INSERT语句,必须拥有对MySQL.user表的INSERT权限。使用INSERT语句创建新用户的基本语法格式如下:
INSERT INTO MySQL.user(Host, User, authentication_string)
VALUES('host', 'username', MD5('password'));
Host、User、authentication_string分别为user表中的主机、用户名称和密码字段;MD5()函数为密码加密函数。
【例13.4】使用INSERT创建一个新用户,用户名称为customer1,主机名称为localhost,密码为aa123456,SQL语句如下:
INSERT INTO user (Host,User, authentication_string)
VALUES('localhost','customer1', MD5('aa123456'));
语句执行结果如下:
MySQL> use mysql;
MySQL> INSERT INTO user (Host,User, authentication_string)
-> VALUES('localhost','customer1', MD5('aa123456'));
Query OK, 1 row affected, 3 warnings (0.00 sec)
语句执行成功,但是有3个警告信息,查看警告信息,结果如下:
MySQL> SHOW WARNINGS;
+-------+------+---------------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------------+
| Error | 1364 | Field 'ssl_cipher' doesn't have a default value |
| Error | 1364 | Field 'x509_issuer' doesn't have a default value |
| Error | 1364 | Field 'x509_subject' doesn't have a default value |
+-------+------+---------------------------------------------------+
因为ssl_cipher、x509_issuer和x509_subject这3个字段在user表中没有设置默认值,所以这里提示警告信息,但没有影响INSERT语句的执行。使用SELECT语句查看user表中的记录:
MySQL> SELECT host,user, authentication_string FROM user ;
+---------+-----------------+---------------------------------------------+
| host | user |authentication_string |
+---------+-----------------+---------------------------------------------+
|localhost| customer1 | 8a6f2805b4515ac12058e79e66539be9 |
|localhost|mysql.infoschema |$A$005$THISISACOMBINATIONOFIVALIDSALTANDP |
|localhost|mysql.session |$A$005$THISISACOMBINATIONOFINVALIDSALTANDPAS |
|localhost|mysql.sys |$A$005$THISISACOMBINATIONOFINVAUSTNEVERREUSED|
|localhost|root |*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+---------+-----------------+---------------------------------------------+
可以看到新用户customer1已经添加到user表中,表示添加新用户成功。
13.2.3 删除普通用户
在MySQL数据库中,即可以使用DROP USER语句删除用户,也可以使用DELETE语句从MySQL.user表中删除对应的记录来删除用户。
1. 使用DROP USER语句删除用户
DROP USER语句的语法如下:
DROP USER user [, user];
DROP USER语句用于删除一个或多个MySQL账户。要使用DROP USER,必须拥有MySQL数据库的全局CREATE USER权限或DELETE权限。使用与GRANT或REVOKE相同的格式为每个账户命名。例如,"'jeffrey'@'localhost'"账户名称的用户和主机部分与用户表记录的User和Host列值相对应。
使用DROP USER,可以删除一个账户及其权限,操作如下:
DROP USER 'user'@'localhost';
DROP USER;
第一条语句可以删除user在本地的登录权限;第二条语句可以删除所有来自授权表的账户权限记录。
【例13.5】使用DROP USER删除账户"'jeffrey'@'localhost'",SQL语句如下:
DROP USER 'jeffrey'@'localhost';
执行过程如下:
MySQL> DROP USER 'jeffrey'@'localhost';
Query OK, 0 rows affected (0.00 sec)
可以看到语句执行成功。查看执行结果:
MySQL> SELECT host,user, authentication_string FROM user ;
+---------+----------------+---------------------------------------------+
| host | user |authentication_string |
+---------+----------------+---------------------------------------------+
|localhost|mysql.infoschema|$A$005$THISISACOMBINATIONOFIVALIDSALTANDP |
|localhost|mysql.session |$A$005$THISISACOMBINATIONOFINVALIDSALTANDPAS |
|localhost|mysql.sys |$A$005$THISISACOMBINATIONOFINVAUSTNEVERREUSED|
|localhost|root |*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+---------+----------------+---------------------------------------------+
user表中已经没有名称为jeffrey、主机名为localhost的账户,即"'jeffrey' @ 'localhost'"的账户已经被删除。
注意: DROP USER不能自动关闭任何已打开的用户对话。如果用户有打开的对话,则DROP USER不会生效,必须等到用户对话被关闭后才能生效。一旦对话被关闭,用户也被取消,则此用户再次试图登录时将会失败。
2. 使用DELETE语句删除用户
DELETE语句基本语法格式如下:
DELETE FROM MySQL.user WHERE Host='hostname' and User='username'
Host和User为user表中的两个字段,两个字段的组合确定所要删除的账户记录。
【例13.6】使用DELETE删除用户'customer1'@'localhost'。
首先创建用户customer1,SQK语句如下:
MySQL>CREATE USER 'customer1'@'localhost' IDENTIFIED BY 'my123';
Query OK, 0 rows affected (0.12 sec)
然后使用DELETE删除用户'customer1'@'localhost',SQK语句如下:
mysql> DELETE FROM MySQL.user WHERE Host= 'localhost' and User='customer1';
Query OK, 1 row affected (0.01 sec)
可以看到语句执行成功,'customer1'@'localhost'的用户账号已经被删除。读者可以使用SELECT语句查询user表中的记录,确认删除操作是否成功。
13.2.4 root用户修改普通用户密码
root用户拥有很高的权限,可以修改其他用户的密码。root用户登录MySQL服务器后,可以通过SET语句修改MySQL.user表,通过UPDATE语句修改用户的密码。
创建用户user,SQL语句如下:
MySQL>CREATE USER 'user'@'localhost' IDENTIFIED BY 'my123';
Query OK, 0 rows affected (0.12 sec)
1. 使用SET语句修改普通用户的密码
使用SET语句修改普通用户的密码的语法格式如下:
SET PASSWORD FOR 'user'@'localhost' = 'sa123';
【例13.7】使用SET语句将用户user的密码修改为"sa123"。
使用root用户登录到MySQL服务器后,执行如下语句:
MySQL> SET PASSWORD FOR 'user'@'localhost' = 'sa123';
Query OK, 0 rows affected (0.00 sec)
SET语句执行成功,用户user的密码被设置为"sa123"。
2. 使用UPDATE语句修改普通用户的密码
使用root用户登录到MySQL服务器后,可以使用UPDATE语句修改MySQL数据库的user表的password字段,从而修改普通用户的密码。使用UPDATA语句修改用户密码的语法如下:
UPDATE MySQL.user SET authentication_string=MD5("123456")
WHERE User="username" AND Host="hostname";
MD5()函数用来加密用户密码。执行UPDATE语句后,需要执行FLUSH PRIVILEGES语句重新加载用户权限。
【例13.8】使用UPDATE语句将用户user的密码修改为"sns123"。
使用root用户登录到MySQL服务器后,执行如下语句:
MySQL> UPDATE MySQL.user SET authentication_string =MD5("sns123")
-> WHERE User="user" AND Host="localhost";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MySQL> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.11 sec)
执行完UPDATE语句后,用户user的密码被修改成了"sns123"。使用FLUSH PRIVILEGES重新加载权限,用户user就可以使用新的密码登录了。