MySQL操作之用户管理权限管理:(DC)(五)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL操作之用户管理权限管理:(DC)(五)

一、简介

MySQL中用户分为root用户和普通用户。root用户为超级管理员,具有所有权限(创建用户、删除用户、管理用户)。

二、用户管理

2.1 User表

  • 新建MySQL时,会自动安装一个mysql的数据库,该数据库下面的表都是权限表。
  • 其中:user表时最重要权限表。记录了允许连接到服务器的账号信息以及一些全局权限信息。
  • user表有42个字段,大致分为4类。

1. 用户列

  • 包括HostUserPassword,分别代表主机名、用户名和密码。
  • HostUser:为联合主键。
  • HostUserPassword:三个字段都匹配时,才会允许建立连接。
  • 修改密码:只需要修改User表中Password即可。

2. 权限列

  • 包括Select_privInsert_privUpdate_priv等以priv结尾的字段,这些字段决定了用户的权限。
  • Select_priv:查询权限。
  • Insert_priv:插入权限。
  • Update_priv:更新权限。
  • 数据类型都是枚举类型Enum
  • 默认值为:N(没有权限)。

3. 安全列

  • 用户管理用户的安全信息,其中包含6个字段。
  • ssl_typessl_cipher:用户加密。
  • x509_issuerx509_subject标准:用来标识用户。
  • pluginauthentication_string:用于存储于授权相关的插件。

4. 资源控制列

  • 用于限制用户使用的资源。其中包括4个字段。
  • max_questions:每小时允许用户执行查询操作的次数。
  • max_updates:每小时允许用户执行更新操作的次数。
  • max_connection:每小时允许用户建立连接的次数。
  • max_user_connection:每小时允许用户同时建立连接的次数。
所属分类 字段名 含义
1.用户列 Host 主机名
1.用户列 User 用户名
1.用户列 Password 密码
2. 权限列 Select_priv 确定用户是否可以通过SELECT命令选择数据
2. 权限列 Insert_priv 确定用户是否可以通过INSERT命令插入数据
2. 权限列 Update_priv 确定用户是否可以通过UPDATE命令修改现有数据
2. 权限列 Delete_priv 确定用户是否可以通过DELETE命令删除现有数据
2. 权限列 Create_priv 确定用户是否可以创建新的数据库和表
2. 权限列 Drop_priv 确定用户是否可以删除现有数据库和表
2. 权限列 Reload_priv 确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令。
包括日志、权限、主机、查询和表
2. 权限列 Shutdown_priv 确定用户是否可以关闭MySQL服务器。
在将此权限提供给root账户之外的任何用户时,都应当非常谨慎
3. 安全列 ssl_type 支持ssl标准加密安全字段
3. 安全列 ssl_cipher 支持ssl标准加密安全字段
3. 安全列 x509_issuer 支持x509标准字段
3. 安全列 x509_subject 支持x509标准字段
3. 安全列 plugin 5.5.7开始,mysql引入plugins以进行用户连接时的密码验证,plugin创建外部/代理用户
3. 安全列 authentication_string 通过authentication_string可以控制两者的映射关系。
(PAM plugin等,PAM可以支持多个服务名)尤其是在使用代理用户时,并须声明这一点
4. 资源控制列 max_questions 每小时允许用户执行查询操作的次数
4. 资源控制列 max_updates 每小时允许用户执行更新操作的次数
4. 资源控制列 max_connection 每小时允许用户建立连接的次数
4. 资源控制列 max_user_connection 每小时允许用户同时建立连接的次数

2.2 创建普通用户

有中方式创建:

  • 使用GRANT语句创建用户
  • 使用CREATE USER语句创建用户
  • 使用Insert语句创建用户

1. 使用GRANT语句创建用户

  • GRANT语句不仅可以创建新用户,还可以对用户进行授权。
  • 该语句会自动加载权限表,不需要手动刷新。
  • 而且安全、准确、错误少。
  • 使用GRANT语句创建用户是最常用的方法。
  • 创建用户时,MySQL会对用户的密码自动加密,以提高安全性。

语法:

GRANT privileges ON database.table
  TO `username`@`hostname` [IDENTIFIED BY[PASSWORD]`password`]
  • privileges:表示该用户具有的权限信息。
  • database.table:表示新用户的权限范围表,可以在指定的库、表上使用权限。
  • username:新用户名称。
  • hostname:主机名。
  • Password:新用户的密码。

创建新用户:用户名user01,密码1581145,授予对test.student有查询权限。

GRANT SELECT ON test.student TO `user01`@`1581145` IDENTIFIED BY `123`

2. 使用CREATE USER语句创建用户

  • 使用CREATE USER语句创建新用户,服务器会自动修改授权表。不需要手动刷新。
  • 但,新建的用户是没有权限的。
CREATE USER `username`@`hostname` [IDENTIFIED BY [PASSWORD]`password`]
  • username:表示新创建的用户名。
  • hostname:表示主机名。
  • password:表示用户的密码。
  • [PASSWORD]:该参数是可选的,假如密码为普通字符串就不需要使用。

语句:

CREATE USER `user02`@`127.0.0.1` IDENTIFIED BU `123`

3. 使用Insert语句创建用户

  • User表添加数据。
  • 通常只需要添加HostUserPassword这三个字段即可,其它字段取默认值。
  • ssl_cipherx509_issuerx509_subject字段没有默认值,也需要添加。
  • 需要手动刷新权限表或者重启MySQL服务。

新建用户

INSERT INTO mysql.`user` ( `host`, `user`, `Password`, ssl_cipher, x509_issuer, x509_subject )
  VALUES( 'localhost', 'user03', PASSWORD ( '123' ), '', '', '' );

刷新权限:

FLUSH PRIVILEGES;

2.3 删除普通用户

1. 使用DROP User语句删除用户

语法

DROP USER `username`@`hostname` [,`username`@`hostname`];
DROP USER `user01`@`localhost`;

2. 使用DELETE语句删除用户

  • DELETE不仅可以删除普通表数据,还可以删除user表数据。

语法

DELETE FROM mysql.user WHERE Host='hostname' AND User='username';

sql

DELETE FROM mysql.user WHERE Host = 'localhost' AND User = 'user02';

2.4 修改用户密码

1. 使用mysqladmin修改密码

dd

mysqladmin -u username [-h hostname] -p password new_password
  • username:要修改的用户名。
  • -h hostname:可以不写,默认localhost。
  • -p password:为关键字。
  • new_password:新设置的密码。

修改密码:

mysqladmin -u root -p password 1581145

上述语句执行完成后,会提示输入密码。这个密码是旧密码。

2. 使用Update语句修改密码

语法:

UPDATE mysql.user set Password=PASSWORD('new_password')
  WHERE User = 'username' AND Host='hostname';

sql

UPDATE mysql.user set Password=PASSWORD('1581145')
  WHERE User = 'root' AND Host='localhost';

刷新权限:

FLUSH PRIVILEGES;

3. 使用SET语句修改密码

  • 用户登录MySQL服务器以后,可以使用set语句,修改密码。
  • 需使用PASSWORD('new_password')进行密码加密。

语法:

SET PASSWORD FOR `username`@'hostname' = PASSWORD('new_password');
SET PASSWORD = PASSWORD('new_password');
SET PASSWORD = PASSWORD('1581145');

4. root使用GRANT修改普通用户密码

语法:

GRANT USAGE ON *.* TO 'usernmae'@'localhost' IDENTIFIED BY [PASSWORD]‘new_password';

2.5 解决root用户密码丢失

  • --skip-grant-tables:可以停止MySQL的权限判断。也就是任何用户都可以登录MySQL。

1、停止MySQL服务

net stop mysql;

2、使用--skip-grant-tables启动MySQL服务

mysqld --skip-grant-tables

3、登录MySQL服务器

mysql -u -root

4、使用Update语句设置root用户密码

UPDATE mysql.user SET PASSWORD = PASSWORD ( '158145' ) 
  WHERE User = 'root' AND Host = 'localhot';

5、加载权限表

FLUSH PRIVILEGES;

三、权限管理

3.1 MySQL的权限

MySQL的权限信息,被存储在user、db、host、tables、priv、cloumn_priv和procs_priv中。当MySQL启动时,会加载这些表,并将权限信息读取到内存中。

  • CreateDrop权限:可以创建数据库、表、索引,或者删除已有的数据库、表、索引。
  • InsertDeleteUpdateSelect权限:对数据库表进行增删改查。
  • Index权限:可以创建和删除索引。适用于所有表。
  • Alter权限:用于修改表的结构或者重命名表。
  • Grant权限:允许用户为其它用户授权。可用户数据库和表。
  • File权限:能读写MySQL服务器上的所有文件。

3.2 授予权限

语法:

GRANT privileges [(columns)][,privileges [(columns)]...] ON database.table
  TO `username`@`hostname` [IDENTIFIED BY[PASSWORD]`password`]
  [,`username`@`hostname` [IDENTIFIED BY[PASSWORD]`password`]]...
  [WITH with_option [with_option]...]
  • privileges:表示权限类型。
  • columns:表示权限作用域某一列。
  • IDENTIFIED BY:为用户设置密码。

其中WITH关键字有5个参数取值:

  1. GRANT OPTION:将自己权限授予其它用户。
  2. MAX_QUERIED_PER_HOUR count:设置每小时最多可执行多少次count查询。
  3. MAX_UPDATES_PER_HOUR count:设置每小时最多可执行多少次更新。
  4. MAX_CONNECTIONS_PER_HOUR count:设置每小时最大连接数。
  5. MAX_USER_CONNECTIONS:设置每个用户最多可以同时建立的连接数量。s

授予权限:

GRANT INSERT,SELECT ON *.* TO 'user04'@'localhost' IDENTIFIED BY '123' 
  WITH GRANT OPTION;

3.3 查看权限

SHOW GRANTS:用来查看用户的权限

SHOW GRANTS FOR 'username'@'hostname';
SHOW GRANTS FOR 'root'@'1581145';

结果:

root用户

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' 
IDENTIFIED BY PASSWORD '*B105526BD04216F24C8DC48AF956866AA539F35C' WITH GRANT OPTION

普通用户( SELECT,INSERT)

GRANT SELECT,INSERT ON *.* TO 'user03'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257'

3.4 收回权限

REVOKE:用于收回用户的权限。

REVOKE privileges [columns] [,privileges [columns]] ON database.table
  FROM 'username'@'hostname'[,username'@'hostname']...
  • privileges:表示参数列表。
  • columns:表示作用在哪一列。

收回Insert权限

REVOKE INSERT ON *.* FROM 'user04'@'localhost';

收回全部权限

REVOKE ALL PRIVILEGES,GRANT OPTION ON *.* FROM 'user04'@'localhost';
目录
相关文章
|
4月前
|
SQL 运维 关系型数据库
MySQL 中 GRANT 操作会引起复制中断吗?
GRANT 操作并不是一个原子性操作,不管执行成功与否,都会触发一个隐式重载授权表的行为。 在生产环境中需要规范用户创建及授权的操作,不推荐使用 DML 语句去直接变更 mysql.user 表,可能会引发其他的问题,若使用了 DML 语句进行变更, 需要手工执行 flush privileges。
65 4
|
4月前
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
58 0
|
5月前
|
关系型数据库 MySQL
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
37 1
|
4月前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
48 1
|
4月前
|
存储 关系型数据库 文件存储
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
46 2
|
4月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之从mysql读数据写到hive报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之运行mysql to doris pipeline时报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之整库同步mysql到starRock提交任务异常,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4月前
|
SQL 关系型数据库 MySQL
「Python入门」python操作MySQL和SqlServer
**摘要:** 了解如何使用Python的pymysql模块与MySQL数据库交互。首先,通过`pip install pymysql`安装模块。pymysql提供与MySQL的连接功能,例如创建数据库连接、执行SQL查询。在设置好MySQL环境后,使用`pymysql.connect()`建立连接,并通过游标执行SQL(如用户登录验证)。注意防止SQL注入,使用参数化查询。增删改操作需调用`conn.commit()`来保存更改。pymssql模块类似,但导入和连接对象创建略有不同。
57 0
「Python入门」python操作MySQL和SqlServer
|
4月前
|
SQL 存储 关系型数据库