mysql笔记:13. 用户管理

文章目录

  • 一、user表
    • [1. 用户字段](#1. 用户字段)
    • [2. 权限字段](#2. 权限字段)
    • [3. 安全字段](#3. 安全字段)
    • [4. 资源控制字段](#4. 资源控制字段)
    • [5. 默认用户](#5. 默认用户)
  • 二、创建用户
  • 三、重命名用户
  • 四、修改用户密码
    • [1. mysqladmin](#1. mysqladmin)
    • [2. ALTER USER](#2. ALTER USER)
    • [3. SET PASSWORD](#3. SET PASSWORD)
    • [4. UPDATE](#4. UPDATE)
    • [5. 密码过期设置与用户锁定](#5. 密码过期设置与用户锁定)
      • [5.1 密码过期设置](#5.1 密码过期设置)
      • [5.2 用户的锁定与解锁](#5.2 用户的锁定与解锁)
  • 五、删除用户
    • [1. DROP USER](#1. DROP USER)
    • [2. DELETE](#2. DELETE)
  • 六、root密码丢失怎么办
    • [1. 停止MySQL服务](#1. 停止MySQL服务)
    • [2. 使用\-\-skip-grant-tables登录](#2. 使用--skip-grant-tables登录)
    • [3. 登录MySQL](#3. 登录MySQL)
    • [4. 加载权限表](#4. 加载权限表)
    • [5. ALTER USER重置密码](#5. ALTER USER重置密码)
    • [6. 重新启动MySQL服务](#6. 重新启动MySQL服务)

MySQL是一个多用户数据库管理系统,不同的用户分配不同的权限,其用户大致分为root用户和普通用户。root用户是超级管理员,拥有所有权限,如创建用户、删除用户、管理用户等。普通用户只有被授予的指定权限。
在校学习和日常开发的时候,为了方便,一般都可以通过root用户登录数据库进行相关的操作;但生产环境为保证数据库的安全,需要对不同用户的操作权限进行合理的管理,让用户只能在指定的权限范围内操作。

一、user表

安装MySQL时,系统自动创建一个名称为mysql的数据库,该数据库主要用于维护数据库的用户及权限的控制和管理。它包含的数据表有user、db、host等,其中user表保存了所有用户信息,即包含了允许连接到服务器的账号信息,也有一些全局级的权限信息,全局级的权限适用于给定服务器中的所有数据库。

1. 用户字段

user表存储了用户连接MySQL数据库时需要输入的信息。

字段名 数据类型 允许NULL 默认值 说明
Host char(255) - 主机名,主键
User char(32) - 用户名,主键
authentication_string text - 密码

当用户与MySQL服务端建立连接时,MySQL将用户输入的用户名、主机名、密码与user表用户字段中存储的值进行匹配。只有这三个字段全部匹配成功,才允许用户建立连接。

2. 权限字段

user表的权限字段包括Select_priv、Insert_priv、Update_priv、Delete_priv等以priv结尾的字段,这些字段决定了用户的权限,包括查询权限、修改权限、关闭服务等。

可以通过show create table user查看这些字段信息。

user表对应的权限是针对所有数据库的,并且这些权限字段的数据类型都是ENUM,取值为N或Y;默认值是N。

3. 安全字段

user表的安全字段包含安全连接、身份验证和密码相关等字段,主要用于管理用户的安全信息。

包括SSL加密连接相关、X509证书相关、插件相关、密码相关(password开头的字段)、是否锁定、用户属性等字段。

4. 资源控制字段

user表的资源控制字段包含以max开头的4个字段,它们用于限制用户对服务器资源的使用,防止用户登录服务器后的不法操作或不合规范的操作导致服务器资源的浪费。

字段名 数据类型 默认值 描述
max_questions int 0 每小时允许用户执行查询操作的次数
max_updates int 0 每小时允许用户执行更新操作的次数
max_connections int 0 每小时允许用户执行连接操作的次数
max_user_connections int 0 允许单个用户同时建立连接的数量

5. 默认用户

MySQL数据库安装配置成功后,MySQL就创建了几个默认用户。

主机 用户名 说明
localhost mysql.infoschema MySQL数据库的系统用户,用来管理和访问系统自带的information_schema数据库
localhost mysql.session MySQL的插件将会使用该用户来访问MySQL数据库服务器。客户端不能直接使用该用户进行连接
localhost mysql.sys 用于MySQL数据库中对象的定义。使用该用户可避免数据库管理员重命名或者删除root用户时发生的问题。客户端不能直接使用该用户进行连接
localhost root MySQL的超级用户,用于管理MySQL数据库。该用户拥有所有权限,可执行任何操作。不建议使用该用户操作MySQL数据库

二、创建用户

1. CRESTE USER

MySQL中的用户信息都保存在mysql.user表中,因此可以利用root用户向user表中插入记录的方式创建用户。但为了保证数据安全,推荐使用更安全的CRESTE USER语句创建用户,语法:

SQL 复制代码
CREATE USER 'username'@'hostname' [IDENIFIED BY [PASSWORD] 'password'] [, 'username'@'hostname' [IDENIFIED BY [PASSWORD] 'password'] ... ]
  • username:新创建用户的名称
  • hostname:主机名
  • IDENIFIED BY:用于设置用户的密码
  • PASSWORD:表示使用哈希值设置密码,这是可选项。如果密码是一个普通字符串,就不需要使用PASSWORD关键字
  • password:用户登录时使用的密码,需要用单引号

使用CREATE USER语句创建新用户时,每创建一个新用户,都会在mysql.user表中添加一条记录并同时自动修改相应的授权表。

CREATE USER语句创建的新用户默认情况下只有连接权限。

授权用户的组成

MySQL的授权用户由两部分组成:用户名和主机。基本语法:'username'@'hostname'

  • 可以使用localhost代表本机,可以使用127.0.0.1代表IPv4的本机地址,也可以使用::1代表IPv6的本机地址。
  • hostname中允许使用通配符%_。例如:192.168.10.%代表所有来自192.168.10网段的主机,%.csdn.net代表所有来自csdn.net这个域名下的主机。
  • 一般情况下,单引号不是必需的,但如果其中包含特殊字符则是必需的。

2. GRANT

在MySQL8.0之前的版本中,可以使用GRANT语句创建用户,并在创建用户时对用户授权。语法格式:

SQL 复制代码
GRANT privileges ON database.table TO 'username'@'hostname' [IDENIFIED BY [PASSWORD] 'password'] [, 'username'@'hostname' [IDENIFIED BY [PASSWORD] 'password'] ... ]
  • privileges:表示该用户具有的权限信息
  • ** database.table**:表示新用户的权限范围表

用户使用GRANT语句创建新用户时,必须有GRANT权限。

三、重命名用户

在MySQL中,可以使用RENAME USER语句修改一个或多个已经存在的MySQL用户,语法格式:

SQL 复制代码
mysql> RENAME USER old_user TO new_user;

可以通过help rename user查看使用帮助信息。

使用RENAME USER语句,必须拥有UPDATE权限或全局CREATE USER权限。

四、修改用户密码

1. mysqladmin

mysqladmin通常用于执行一些管理性的任务,以及显示服务器状态等。使用mysqladmin命令修改密码的语法:

shell 复制代码
> mysqladmin -u username [-h hostname] -p password new_password

2. ALTER USER

SQL 复制代码
ALTER USER username IDENTIFIED BY 'new_password';

要求用户拥有修改mysql.user表的权限。

3. SET PASSWORD

SQL 复制代码
SET PASSWORD [FOR user] auth_option
    [REPLACE 'current_auth_string']
    [RETAIN CURRENT PASSWORD]

auth_option: {
    = 'auth_string'
  | TO RANDOM
}

# 示例:修改当前用户的密码
SET PASSWORD = 'auth_string';

4. UPDATE

使用root用户登录后,通过UPDATE语句直接修改mysql.user表中的数据,语法:

SQL 复制代码
UPDATE mysql.user SET authentication_string=PASSWORD('new_password')
    WHERE User='username' AND Host='hostname';
  1. 修改密码后,还需要使用FLUSH PRIVILEGES重新加载权限表。
  2. MySQL8.0及后续的版本中已经废弃PASSWORD()函数,因此不推荐第4种方法。

5. 密码过期设置与用户锁定

5.1 密码过期设置

MySQL的用户密码过期功能,允许设置用户密码的过期时间。

SQL 复制代码
mysql> select host, user, password_expired, password_lifetime from user;

默认情况下,MySQL并没有启用用户的密码过期设置。

SQL 复制代码
# 启用root用户的密码过期策略,并设定密码过期时间为30天
mysql> alter user 'root'@'localhost' password expire interval 30 day;

一旦用户启用了密码过期的策略或者密码过期后,在用户没有设置新密码前不能运行任何查询语句。

MySQL数据库还有一个全局变量default_password_lifetime来设置所有用户的密码过期时间,此全局变量可以设置一个全局的自动密码过期策略。该变量默认值是0,表示用户密码永不过期。

SQL 复制代码
# 查看配置
mysql> show variables like 'default_password_lifetime';

# 修改配置:设置所有用户密码过期的时间是90天。
mysql> set global default_password_lifetime=90;

5.2 用户的锁定与解锁

SQL 复制代码
# 锁定
mysql> alter user tomy account lock;

# 解锁
mysql> alter user tomy account unlock;

五、删除用户

在MySQL中,通常会创建多个普通用户来管理数据库。如果某些用户已经没必要再使用,就可以将其删除。

1. DROP USER

DROP USER与DROP DATABASE类似,语法如下:

SQL 复制代码
DROP USER 'username'@'hostname' [, 'username'@'hostname', ...];

执行删除操作的用户必须拥有DROP USER权限。

2. DELETE

用户信息保存在mysql.user表,使用DELETE语句删除表中的数据,即删除了用户。

SQL 复制代码
DELETE FROM mysql.user WHERE host='hostname' AND user='username';

执行DELETE操作的用户必须拥有mysql.user表的DELETE权限。

六、root密码丢失怎么办

root用户是超级管理员,拥有很多权限,它丢了怎么办呢?MySQL提供了对应的处理机制,可以通过如下特殊方法登录MySQL服务器,然后重新为root用户设置密码。

1. 停止MySQL服务

shell 复制代码
net stop MySQL8
# 或Linux系
systemctl stop mysqld
  • MySQL8:这是MySQL服务的名称,根据安装MySQL时定义的服务名称调整命令。

2. 使用--skip-grant-tables登录

shell 复制代码
mysqld --shared-memory --skip-grant-tables

执行该命令后,命令行或终端窗口进入类似阻塞状态,不要关闭窗口。

也可以编辑配置文件/etc/my.cnf,在末尾添加一行

skip-grant-tables

不过,这种方式没有命令行方便,所以不推荐。

3. 登录MySQL

重新打开一个命令行或终端窗口,使用免密登录MySQL服务器

shell 复制代码
mysql -uroot

4. 加载权限表

SQL 复制代码
FLUSH PRIVILEGES;

5. ALTER USER重置密码

SQL 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

重置成功后,使用exit退出服务器。

6. 重新启动MySQL服务

关闭刚才打开的两个窗口,重新打开另一个,然后启动MySQL服务。

shell 复制代码
net start MySQL8

MySQL服务启动后,就可以使用root用户的新密码进行登录。

相关推荐
阿华的代码王国27 分钟前
MySQL ------- 索引(B树B+树)
数据库·mysql
李小星同志31 分钟前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c43 分钟前
MFC 使用细节
笔记·学习·mfc
Hello.Reader1 小时前
StarRocks实时分析数据库的基础与应用
大数据·数据库
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
liupenglove1 小时前
golang操作mysql利器-gorm
mysql·golang
yanglamei19621 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
AlexMercer10121 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
叫我:松哥1 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap