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

相关推荐
Fool丶玄浅17 分钟前
【数据库系统概论】—— 关系数据库
数据库·数据库系统
DashVector1 小时前
如何通过HTTP API检索Doc
数据库·人工智能·http·阿里云·数据库开发·向量检索
vvw&1 小时前
如何在 Ubuntu 22.04 上安装 phpMyAdmin
linux·运维·服务器·mysql·ubuntu·php·phpmyadmin
SEO-狼术2 小时前
Enhance Security in Software Crack
数据库
计算机毕设定制辅导-无忧学长2 小时前
Redis 初相识:开启缓存世界大门
数据库·redis·缓存
奥顺互联V2 小时前
深入理解 ThinkPHP:框架结构与核心概念详解
大数据·mysql·开源·php
Rverdoser2 小时前
redis延迟队列
数据库·redis·缓存
weisian1513 小时前
Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)
数据库·redis·缓存
MrJson-架构师3 小时前
4.银河麒麟V10(ARM) 离线安装 MySQL
arm开发·mysql
中草药z4 小时前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读