在MySQL执行流程中,用户权限验证究竟是在哪一步完成的?

P粉602998670

P粉602998670

2026-08-04

215人浏览

原创

mysql权限验证在连接建立时完成,连接器立即校验'user'@'host'三元组并加载全部权限到会话内存,后续sql均基于该快照执行;权限检查按user→db→tables_priv→columns_priv层级短路匹配;grant/revoke修改仅对新连接生效,flush privileges不刷新已有连接。

在mysql执行流程中,用户权限验证究竟是在哪一步完成的?

权限验证发生在连接器阶段,不是执行SQL时才检查

用户权限验证在建立连接的第一时间就完成了,不是等到你敲下SELECTINSERT才去查。你执行mysql -u user -p输入密码后,连接器立刻做两件事:先校验mysql.user表里的用户名、密码哈希、客户端IP(即'user'@'host'三元组),通过后再一次性加载该用户全部权限到当前会话内存中。

这意味着:
• 后续所有SQL语句的权限判断,都基于这个“快照”,哪怕管理员此时用GRANT改了权限,也不会影响已连上的连接;
FLUSH PRIVILEGES只对新连接生效,对已有连接完全无效;
• 错误如ERROR 1142 (42000): SELECT command denied to user,说明权限快照里没开对应操作,不是语法或表不存在。

权限检查顺序是 user → db → tables_priv → columns_priv

当你要访问某张表的某个字段时,MySQL不会只看user表就放行,而是按固定层级逐级匹配:

  • 先查mysql.user:如果Select_priv = 'Y',直接允许查所有库所有表所有列,不再往下查;
  • 否则查mysql.db:看当前USE db_name选中的库是否对该用户开放Select_priv
  • 再查mysql.tables_priv:针对具体表(比如users)是否有Table_priv
  • 最后查mysql.columns_priv:仅当你SQL里明确写了某列(如SELECT phone FROM users),且该列在columns_priv里被单独设为'Y'才放行。

注意:SHOW GRANTS FOR 'user'@'host'显示的是最终合并结果,但实际校验是分步短路的——只要某一层满足,就停止后续检查。

MySQL(Linux)
MySQL(Linux)

MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。

下载

current_user() 和 user() 的区别直接影响权限判断

你登录时写的账号不等于你实际拥有的权限。比如用mysql -u admin -h 192.168.1.100连上,USER()返回'admin'@'192.168.1.100',但CURRENT_USER()可能返回'admin'@'192.168.%'——因为MySQL按Host精确度匹配,192.168.%%更优先,所以真正生效的是后者对应的权限记录。

常见陷阱:

  • 创建了'app'@'10.0.0.%''app'@'%'两个用户,从10.0.0.5连接时,永远匹配前者,后者权限再高也无效;
  • 误以为'root'@'localhost'能远程连,其实localhost在MySQL里特指socket连接,'root'@'%'才是通配远程;
  • CREATE USER 'u'@'%' IDENTIFIED BY 'p'建完用户,却忘了GRANT,此时current_user()能查到,但所有操作都会报ERROR 10451142

权限变更何时生效?取决于修改方式和作用域

权限不是改完立刻全局生效的,不同场景下延迟不同:

  • GRANT/REVOKE修改:已存在连接的权限不变,新连接立即生效;
  • 手动UPDATE mysql.user后没FLUSH PRIVILEGES:更改根本不会加载进内存,相当于白改;
  • mysql.db表:下次执行USE db_name时才重新读取该库权限;
  • mysql.columns_priv:下一条涉及该列的SQL才会触发重新校验。

最易忽略的一点:长连接空闲超wait_timeout(默认8小时)会被服务端断开,重连时才加载最新权限——所以线上服务若长期不重启,权限更新可能“看不见”。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

2422

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

447

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

612

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3923

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

1301

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

3518

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

3394

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

638

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

525

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 123人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 222人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习