当前位置: 首页 > news >正文

【MySQL】我在广州学Mysql 系列——MySQL用户管理详解

ℹ️大家好,我是练小杰,本博客是春节前最后一篇了,在此感谢大佬们今年的支持!!🙏🙏
接下来将学习MYSQL用户管理的相关概念以及命令~~
回顾:👉【MYSQL触发器的使用】
数据库专栏:👉【数据库专栏】~
想了解更多,主页: 【练小杰的CSDN】

在这里插入图片描述

文章目录

  • 权限表
    • 权限管理的基本原则
    • user表
    • db表和host表
    • tables_priv表和columns_priv表
    • procs_priv表
  • 账户管理
    • 登录和退出MySQL服务器
    • 新建普通用户
    • 删除普通用户
      • 1. 使用DROP USER语句删除用户
      • 2. 使用DELETE语句删除用户
    • root用户修改自己的密码
    • root用户修改普通用户密码
    • 普通用户修改密码
      • 示例:假设用户lxj 想要修改自己的密码。
    • ⚠️注意
    • root用户密码丢失的解决办法
    • ⚠️注意事项
  • 权限管理
    • 授权
    • 收回权限
    • 查看权限
  • 访问控制
    • 连接核实阶段
    • 请求核实阶段

在这里插入图片描述

权限表

权限管理是通过一系列的权限表来实现的,这些表存储在mysql系统数据库中。理解这些权限表对于我们更高效地管理数据库安全性和用户权限至关重要。

权限管理的基本原则

  • 最小权限原则:为用户分配完成其任务所需的最小权限,避免过度授权。

  • 定期审查:定期检查和更新用户权限,确保权限的合理性和安全性。

  • 使用角色:利用数据库角色(Roles)来简化权限管理,将一组权限分配给一个角色,然后将角色分配给用户。

user表

User表是MySQL中最重要的一个权限表,记录允许连接到服务器的帐号信息,里面的权限是全局级的。

  • 主要字段如下:

Host:允许连接的主机名或IP地址。
User:用户名。
Password:用户密码(以哈希形式存储)。
Select_priv、Insert_priv、Update_priv等:各种全局权限,如SELECT、INSERT、UPDATE等。
Grant_priv:是否允许用户授予权限给其他用户。
Max_questions、Max_updates、Max_connections等:限制用户在一小时内可以执行的查询、更新和连接次数。

  • 示例:查看mysql数据库权限表的信息
SELECT Host, User, Select_priv, Insert_priv FROM mysql.user;
+-----------+------------------+-------------+-------------+
| Host      | User             | Select_priv | Insert_priv |
+-----------+------------------+-------------+-------------+
| localhost | lxj              | Y           | Y           |
| localhost | mysql.infoschema | Y           | N           |
| localhost | mysql.session    | N           | N           |
| localhost | mysql.sys        | N           | N           |
| localhost | root             | Y           | Y           |
+-----------+------------------+-------------+-------------+
5 rows in set (0.00 sec)

db表和host表

db表和host表都是MySQL数据中非常重要的权限表。

  • db表中存储了用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库。

  • host表中存储了某个主机对数据库的操作权限,配合db权限表对给定主机上数据库级操作权限做更细致地控制。

  • 示例:

SELECT Host, Db, User, Select_priv, Insert_priv FROM mysql.db;
+-----------+--------------------+---------------+-------------+-------------+
| Host      | Db                 | User          | Select_priv | Insert_priv |
+-----------+--------------------+---------------+-------------+-------------+
| localhost | performance_schema | mysql.session | Y           | N           |
| localhost | sys                | mysql.sys     | N           | N           |
+-----------+--------------------+---------------+-------------+-------------+
2 rows in set (0.00 sec)

其中,Host、Db、User:分别表示主机名、数据库名和用户名。

tables_priv表和columns_priv表

tables_priv表: 用来对表设置操作权限。
columns_priv表: 用来对表的某一列设置权限。

  • 主要字段
  • Host、Db、User、Table_name:分别表示主机名、数据库名、用户名和表名。
  • Column_name:表示列名
  • Grantor:授予权限的用户。
  • Timestamp:权限授予的时间戳。
  • Table_priv:表级别的权限,如SELECT、INSERT、UPDATE、DELETE等。
  • Column_priv:列级别的权限,如SELECT、INSERT、UPDATE等。
  • 示例如下:
SELECT Host, Db, User, Table_name, Table_priv FROM mysql.tables_priv;
+-----------+-------+---------------+------------+------------+
| Host      | Db    | User          | Table_name | Table_priv |
+-----------+-------+---------------+------------+------------+
| localhost | mysql | mysql.session | user       | Select     |
| localhost | sys   | mysql.sys     | sys_config | Select     |
+-----------+-------+---------------+------------+------------+
2 rows in set (0.00 sec)SELECT Host, Db, User, Table_name, Column_name, Column_priv FROM mysql.columns_priv;

procs_priv表

procs_priv表可以对存储过程和存储函数设置操作权限。

  • 主要字段:
  • Host、Db、User、Routine_name、Routine_type:分别表示主机名、数据库名、用户名、存储过程/函数名和类型(FUNCTIONPROCEDURE)。
  • Proc_priv:存储过程/函数级别的权限,如EXECUTE、ALTER ROUTINE等。
  • 示例如下:
SELECT Host, Db, User, Routine_name, Routine_type, Proc_priv FROM mysql.procs_priv;

账户管理

登录和退出MySQL服务器

我们利用常用参数登录mysql服务器,通常用mysql命令行登录客户端,基本格式如下:

mysql -u [用户名] -p [数据库名] -h [主机名] -P [端口号]
  • 说明:

-u [用户名] 或 --user=[用户名]:指定要登录的MySQL用户名。例如,-u root


-p--password:提示输入密码。
若是在-p后面直接输入密码(例如-p123456),密码会以明文形式显示在命令行中,存在安全风险,因此推荐只使用-p,然后在提示时输入密码。


[数据库名]:可选参数,指定要连接的数据库。如果不指定,将连接到默认数据库。


-h [主机名]--host=[主机名]:指定要连接的主机名或IP地址。默认是localhost,表示连接到本地MySQL服务器。


-P [端口号]--port=[端口号]:指定要连接的端口号,默认为3306端口。

  • 登录Mysql服务器示例:
  1. 以root用户身份登录本地MySQL服务器:
 mysql -u root -p

执行后,系统会提示输入密码:

Enter password:

输入正确的密码后,即可登录成功。

2.以指定用户身份登录远程MySQL服务器:

mysql -u lianxiaojie -p -h 192.168.1.100  -P 3306

由以上命令可知,将登录到IP地址为192.168.1.100的远程MySQL服务器,端口号为3306,使用用户名为lianxiaojie的用户。

3.登录并连接到特定数据库:

mysql -u username -p database_name

将登录并连接到名为database_name的数据库。

  • 退出MySQL服务器

退出MySQL客户端一般使用EXIT命令或者 QUIT命令,最后分号可加也可不加!!!

EXIT;  
//或者exitQUIT;
//或者quit

新建普通用户

  • 使用CREATE USERGRANT语句。在更改用户权限后,需要使用 FLUSH PRIVILEGES 语句来使更改生效。
-- 创建一个新用户
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';-- 授予数据库级别的SELECT和INSERT权限
GRANT SELECT, INSERT ON database_name.* TO 'username'@'localhost';-- 刷新权限
FLUSH PRIVILEGES;

删除普通用户

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

若需要删除一个用户,可以使用 DROP USER 语句。

DROP USER 'username'@'host';

2. 使用DELETE语句删除用户

DROP USER 语句用于删除一个或多个MySQL账户及其所有权限。

DROP USER 'username'@'host';
  • 示例如下:
-- 删除特定主机上的用户
DROP USER 'lxj'@'localhost';-- 删除允许从任何主机连接的用户
DROP USER 'lxj'@'%';-- 删除多个用户
DROP USER 'lxj'@'localhost', 'gem'@'192.168.1.%';

root用户修改自己的密码

  1. 使用 ALTER USER 语句(推荐)
  • 如果你当前已经以root用户登录,可以直接执行以下命令:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

当你使用的是不同的主机名(例如远程主机),请将 'localhost' 替换为相应的主机名或IP地址。

  1. 使用mysqladmin命令在命令行指定新密码

适用于所有版本的MySQL,并且可以在不登录MySQL服务器的情况下修改密码。

mysqladmin -u root -p'current_password' password 'new_password'

⚠️在-p选项和current_password 之间不要有空格。

  1. 直接修改mysql数据库的user表(不推荐,容易出错)

利用UPDATE 语句直接修改 mysql.user 表

USE mysql;
UPDATE user SET authentication_string=PASSWORD('new_password') WHERE User='root' AND Host='localhost';FLUSH PRIVILEGES;
  1. 使用SET语句修改root用户的密码
SET PASSWORD FOR 'root'@'localhost' = 'new_password';-- 刷新权限(可选)
FLUSH PRIVILEGES;

root用户修改普通用户密码

  1. 使用SET语句修改普通用户的密码
SET PASSWORD FOR 'john'@'localhost' = 'NewSecureP@ssw0rd!';FLUSH PRIVILEGES;

这里是修改普通用户john的密码并刷新权限

  1. 使用UPDATE语句修改普通用户的密码
USE mysql;
UPDATE user SET authentication_string=PASSWORD('new_password') WHERE User='lianxiaojie' AND Host='host';
  1. 使用GRANT语句修改普通用户密码
-- 以root用户登录
mysql -u root -p-- 修改用户john的密码
GRANT USAGE ON *.* TO 'john'@'localhost' IDENTIFIED BY 'NewSecureP@ssw0rd!';-- 刷新权限
FLUSH PRIVILEGES;
  • 命令说明:

USAGE 权限:表示不授予任何新的权限,仅用于修改用户属性(如密码)。
*.*: 表示全局级别,适用于所有数据库和表。
'username'@'host': 指定要修改密码的用户和主机。
IDENTIFIED BY 'new_password':设置新的密码。

普通用户修改密码

普通用户登录MySQL服务器后,通过SET语句设置自己的密码。
登录后,可以使用以下两种形式的 SET PASSWORD 语句来设置或修改密码。

  • 设置当前用户密码:
SET PASSWORD = 'new_password';
  • 为特定用户设置密码:

若需要为其他用户设置密码(前提是当前用户有足够的权限),才能使用。

SET PASSWORD FOR 'username'@'host' = 'new_password';

示例:假设用户lxj 想要修改自己的密码。

  • 登录mysql
mysql -u lxj -p

输入当前密码后登录。

  • 修改密码
SET PASSWORD = 'sheniankuaile!';
  • 然后,使用新密码重新登录,测试密码是否修改。
mysql -u lxj -p

输入 sheniankuaile! 以确认更改。

⚠️注意

  • 使用 SET PASSWORD 语句后,MySQL会自动刷新权限,无需手动执行 FLUSH PRIVILEGES;

root用户密码丢失的解决办法

  1. 使用--skip-grant-tables选项启动MySQL服务
  2. 使用root用户登录和重新设置密码
  3. 加载权限表

⚠️注意事项

  • 安全性:确保在安全的环境下修改密码,避免密码泄露。
  • 权限:修改root密码需要当前root用户具有足够的权限。
  • 备份:在进行密码修改前,建议备份相关的系统表,以防止意外情况发生。
  • 远程访问:如果需要远程访问MySQL服务器,确保防火墙和网络配置允许相应的连接。
  • 避免直接操作 mysql.user 表,除非在特殊情况下并明确了解受到的影响。

权限管理

MySQL的各种账户权限信息被存储在mysql数据库的userdbhosttables_privcolumns_privprocs_priv表中。在MySQL启动时,服务器将这些数据库表内容读入内存。

授权

授权就是为某个用户授于权限。合理的授权可以保证数据库的安全。
MySQL中可以使用GRANT语句为用户授于权限。

收回权限

收回权限就是取消已经赋于用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全性。
MySQL中使用REVOKE语句取消用户的某些权限。

// 撤销数据库级别的INSERT权限
REVOKE INSERT ON database_name.* FROM 'username'@'localhost';// 刷新权限
FLUSH PRIVILEGES;

查看权限

SHOW GRANTS语句可以显示指定用户的权限信息。
而使用SHOW GRANT语句查看当前账户信息。

  • 基本语法:
SHOW GRANTS FOR 'user'@'host';

访问控制

连接核实阶段

当连接MySQL服务器时,服务器基于用户的身份以及用户是否能通过正确的密码验证身份来接受或拒绝连接。

  • 验证user表中是否存在该用户。
  • 验证3个字段(Host,User和Password)

请求核实阶段

建立了连接之后,对在此连接上进来的每个请求,服务器检查用户要执行的操作,然后检查是否有足够的权限来执行它。

  • 核实user、db、host、tables_priv或columns_priv表的权限信息

  • Mysql请求核实的过程如下:
    在这里插入图片描述

本文有关Mysql数据库用户管理相关内容已经讲完了,年后再见啦👋
主页:【练小杰的CSDN】😆
ℹ️欢迎各位在评论区踊跃讨论,积极提出问题,解决困惑!!!
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!

在这里插入图片描述

相关文章:

【MySQL】我在广州学Mysql 系列——MySQL用户管理详解

ℹ️大家好,我是练小杰,本博客是春节前最后一篇了,在此感谢大佬们今年的支持!!🙏🙏 接下来将学习MYSQL用户管理的相关概念以及命令~~ 回顾:👉【MYSQL触发器的使用】 数据…...

Linux-rt下卡死之hrtimer分析

Linux-rt下卡死之hrtimer分析 日志 超时读过程分析 #define readl_poll_timeout(addr, val, cond, delay_us, timeout_us) \readx_poll_timeout(readl, addr, val, cond, delay_us, timeout_us)34 #define readx_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) \…...

【AI日记】25.01.24

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Forecasting Sticker Sales 读书 书名:法治的细节作者:罗翔 律己 AI:8 小时,良作息:00:30-8:30&…...

React 中hooks之useSyncExternalStore使用总结

1. 基本概念 useSyncExternalStore 是 React 18 引入的一个 Hook,用于订阅外部数据源,确保在并发渲染下数据的一致性。它主要用于: 订阅浏览器 API(如 window.width)订阅第三方状态管理库订阅任何外部数据源 1.1 基…...

C++11新特性之decltype

1.decltype的作用 decltype是C11新增的一个关键字,与auto的功能一样,都是在编译期间推导变量类型的。不了解auto的可以转到——C11新特性之auto。 为什么引入decltype?看过上边那篇博客的读者应该知道auto在有些场景中并不适用,所以引入declt…...

二叉树相关oj题 1. 检查两颗树是否相同。

二叉树相关oj题 检查两颗树是否相同。OJ链接 另一颗树的子树。OJ链接 if(rootnull)易漏掉 会导致空指针异常翻转二叉树。OJ链接...

element tbas增加下拉框

使用Tabs 标签页的label插槽,嵌入Dropdown 下拉菜单,实现Tabs 标签页增加下拉切换功能 Tabs 标签页 tab-click"事件"(这个事件当中到拥有下拉框的tab里时,可以存一下Dropdown 第一个菜单的id,实现点击到拥有…...

新浪安卓(Android)开发面试题及参考答案(68道题,9道手撕题)

链表判环,找入口 思路: 判断是否有环:使用快慢指针,快指针每次走两步,慢指针每次走一步,如果它们相遇,说明有环。找出环入口:当判断出有环后,将慢指针重新指向头节点,然后快慢指针同时以相同速度移动,再次相遇的节点就是环的入口。以下是判断链表是否有环以及找出环…...

Zbrush导入笔刷

Zbrush笔刷目录: ...\Zbrush\ZStartup\BrushPresets...

实战演示:利用ChatGPT高效撰写论文

在当今学术界,撰写论文是一项必不可少的技能。然而,许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是,人工智能的快速发展为我们提供了新的工具,其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…...

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…...

k8s简介,k8s环境搭建

目录 K8s简介环境搭建和准备工作修改主机名(所有节点)配置静态IP(所有节点)关闭防火墙和seLinux,清除iptables规则(所有节点)关闭交换分区(所有节点)修改/etc/hosts文件&…...

深入理解MySQL事务(万字详)

文章目录 什么是事务为什么会出现事务事务的版本支持事务的提交方式事务常见操作方式正常演示 - 证明事务的开始与回滚非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)非正常演示2 - 证明commit了…...

微信小程序使用picker根据接口给的省市区的数据实现省市区三级联动或者省市区街道等多级联动

接口数据如上图 省市区多级联动&#xff0c;都是使用的一个接口通过传参父类的code。返回我们想要的数据 比如获取省就直接不要参数。市就把省得code传给接口&#xff0c;区就把市的code作为参数。 <picker mode"multiSelector" :range"mulSelect1" …...

Go Fx 框架使用指南:深入理解 Provide 和 Invoke 的区别

1. 什么是 Fx 框架&#xff1f; Fx 是一个基于 Go 语言的依赖注入框架&#xff0c;专注于简化应用程序的生命周期管理和依赖的构建。在复杂的应用程序中&#xff0c;Fx 通过模块化的设计方式将组件连接起来&#xff0c;使开发者能够更高效地管理依赖关系。 Fx 的核心理念是&a…...

VSCode+Continue实现AI辅助编程

Continue是一款功能强大的AI辅助编程插件&#xff0c;可连接多种大模型&#xff0c;支持代码设计优化、错误修正、自动补全、注释编写等功能&#xff0c;助力开发人员提高工作效率与代码质量。以下是其安装和使用方法&#xff1a; 一、安装VSCode 参见&#xff1a; vscode安…...

阿里云服务器在Ubuntu上安装redis并使用

1、redis安装 sudo apt install lsb-release curl gpgcurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpgecho "deb [signed-by/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.…...

Blazor-Blazor呈现概念

静态和交互式呈现概念 在Blazor开发中&#xff0c;Razor 组件具备两种重要的呈现方式&#xff0c;分别是静态呈现和交互式呈现。 静态呈现 也被称为静态渲染&#xff0c;是一种典型的服务器端方案。在这种模式下&#xff0c;组件呈现时&#xff0c;用户与.NET/C# 代码之间缺…...

14-6-2C++的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…...

StarRocks常用命令

目录 1、StarRocks 集群管理&配置命令 2、StarRocks 常用操作命令 3、StarRocks 数据导入和导出 1、StarRocks 集群管理&配置命令 查询 FE 节点信息 SHOW frontends; SHOW PROC /frontends; mysql -h192.168.1.250 -P9030 -uroot -p -e "SHOW PROC /dbs;"…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...