MySQL 9从入门到性能优化-账户管理

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客

《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)

MySQL9数据库技术_夏天又到了的博客-CSDN博客

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就可以使用新的密码登录了。

相关推荐
LjQ20404 分钟前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫
异常君4 分钟前
高并发数据写入场景下 MySQL 的性能瓶颈与替代方案
java·mysql·性能优化
烙印6018 分钟前
MyBatis原理剖析(二)
java·数据库·mybatis
RestCloud10 分钟前
如何通过ETLCloud实现跨系统数据同步?
数据库·数据仓库·mysql·etl·数据处理·数据同步·集成平台
你是狒狒吗11 分钟前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库
程序员岳焱36 分钟前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql
Channing Lewis1 小时前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠1 小时前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT1 小时前
每日八股文6.3
数据库·sql
行云流水行云流水2 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库