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

相关推荐
尘浮生1 小时前
Java项目实战II基于Spring Boot的美食烹饪互动平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·美食
forestqq1 小时前
构建后端为etcd的CoreDNS的容器集群(七)、编写适合阅读的域名管理脚本
运维·数据库·etcd
hongkid1 小时前
MongoDB常用操作
数据库·mongodb
岁岁岁平安1 小时前
mysql上课总结(1)(mysql中的常见的存储引擎)(面试)
数据库·mysql·innodb·存储引擎
幽兰的天空3 小时前
python实现excel数据导入数据库
数据库
昨天今天明天好多天4 小时前
【Linux】MySQL部署
linux·mysql·adb
我还能再卷一点4 小时前
Linux安装mysql【超详细】
linux·mysql·adb
尘佑不尘4 小时前
shodan5,参数使用,批量查找Mongodb未授权登录,jenkins批量挖掘
数据库·笔记·mongodb·web安全·jenkins·1024程序员节
传输能手4 小时前
从三方云服务器将数据迁移至本地,如何保障安全高效?
大数据·服务器·数据库
BinTools图尔兹5 小时前
CQ社区版 v2024.10 | 支持k8s、helm部署!
数据库·安全·k8s·helm·数据安全·数据库管理员