MySQL8.0 show create view BUG解析

MySQL用户权限深度解析:从user@host到动态权限与最小化实践 MySQL用户权限不是简单的账号创建与授权操作,而是一套融合身份认证、访问控制、安全策略与合规治理的系统性机制。其核心在于理解'user@host'原子性、四层权限嵌套(全局/库/表/列)、MySQL 8.0动态权限与角色模型等底层原理。技术价值体现在落实最小权限原则、支撑多租户隔离、满足GDPR/等保等强合规要求,并为DevOps流水线提供可审计、可版本化的权限基础设施。典型应用场景包括Web应用后端的读写分离控制、BI分析员的数据脱敏视图授权,以及DBA账号的分级沙箱管理。本文聚焦生产级权限设计逻辑与避 阅读详情
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者:崔弘晨
  • 作者介绍:诺亚财富数据库DBA 擅长数据库SQL优化,喜欢分享技术
  • 文章来源:社区投稿

背景

​ 前段时间碰到一个比较古怪的MySQL Crash事件,当时打了general日志,发现是一条命令show create view造成的,经过反复实验以及查看源码,终于得以复现并找到原因。

环境如下:

OS:Centos7.8
MySQL:8.0.13/8.0.14/8.0.15

复现

​ 我在测试环境模拟了一套最简单的复现场景。

用户权限如下:

root@localhost:[(none)]> show grants for test;
+-------------------------------------+
| Grants for test@%                   |
+-------------------------------------+
| GRANT USAGE ON *.* TO `test`@`%`    |
| GRANT `test_role`@`%` TO `test`@`%` |
+-------------------------------------+
root@localhost:[(none)]> show grants for test_role;
+-----------------------------------------------------+
| Grants for test_role@%                              |
+-----------------------------------------------------+
| GRANT USAGE ON *.* TO `test_role`@`%`               |
| GRANT ALL PRIVILEGES ON `test`.* TO `test_role`@`%` |
+-----------------------------------------------------+

​ 此处注意role角色是MySQL8.0新增的功能(大概是从oracle借鉴过来的),先将权限赋予role,再将role赋予用户。记得role赋权后用set default role all to user 激活(否则无法复现)。

视图结构如下:

CREATE ALGORITHM=UNDEFINED DEFINER=`test`@`%` SQL SECURITY DEFINER VIEW `test_show_view` AS select 1 AS `1`

​ 这里创建了一个最简单的视图,仅仅执行select 1,然后顺便给大家复习一下视图definer的定义:

​ MySQL创建视图等其他对象时有两个选项:definer和invoker,SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。DEFINER 表示按定义者拥有的权限来执行;INVOKER 表示用调用者的权限来执行。默认情况下,系统指定为DEFINER。

复现Crash

​ 先卖个关子,大家看看下两条指令有何不同,为何案例2会引发MySQL崩溃(而且是100%触发)?

案例1:

root@localhost:[test]> show create view test.test_show_view\G
*************************** 1. row ***************************
                View: test_show_view
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`test`@`%` SQL SECURITY DEFINER VIEW `test_show_view` AS select 1 AS `1`
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci

案例2:

root@localhost:[(none)]> show create view test.test_show_view\G
ERROR 2013 (HY000): Lost connection to MySQL server during query

​ 眼尖的同学们肯定发现了,案例2没有指定当前DB,是不是觉得很神奇?但的确是这个原因引发的一个bug。

原因分析

​ 首先看errorlog。 ​ 我截取了一些关键信息,错误日志显示是acl_getroot函数上发生的问题以及is an invalid pointer 无效指针造成的Crash.

file

​ 接着我们可以从源码中找出原因(启动Vscode!),调试后发现acl_getroot函数在 build/sql/auth/sql_auth_cache.cc代码里,用处是获取用户ROLE权限,然后出现问题的是在下面这段代码中。

  if (acl_user && sctx->get_active_roles()->size() > 0) {
    sctx->checkout_access_maps();
    ulong db_acl = sctx->db_acl({db, strlen(db)});
    sctx->cache_current_db_access(db_acl);
  }
  DBUG_RETURN(res);

​ 重点在这一句

ulong db_acl = sctx->db_acl({db, strlen(db)});

​ 还记得前面说的吗?复现的情况是没有指定当前db,此时db的值是0x0,sctx->db_acl({db, strlen(db)})直接报错返回空指针,MySQL此时也崩溃了。

​ 到这里,我们也终于找了崩溃的原因:因为show create view需要取definer的用户权限,但当用户有角色(role)权限时,且当前db未指定(0x0),会出现无效指针并引发Crash。

​ 接下来我又去查看下8.0.13后版本是否有修改,发现在8.0.16版本上,此行代码加上了一个判断。

ulong db_acl = db ? sctx->db_acl({db, strlen(db)}) : 0;

​ 也就是当前判断当前db未指定时,直接赋值是0。

解决方案

知道了原因,解决方案就很方便商定了

  1. 不使用role角色功能,直接赋予用户权限。
  2. 视图定义上definer直接定义为root@localhost,可以跳过acl_getroot函数。
  3. 升级版本,建议升级至更稳定的8.0.17或者20版本。

Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

捉虫活动详情:https://greatsql.cn/thread-97-1-1.html

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

6440

MySQL事务深度解析:从ACID原理到Spring失效场景实战 事务是数据库保障数据一致性的核心机制,其本质是通过原子性、隔离性、持久性协同实现业务逻辑的可靠执行。理解事务需从底层原理切入:InnoDB借助WAL日志与MVCC多版本控制达成崩溃恢复与并发读写隔离;不同隔离级别(如READ COMMITTED与REPEATABLE READ)在MySQL 8.0中直接影响快照生成时机和幻读行为;而Spring的@Transactional注解因AOP代理限制,常在同类调用、私有方法或异常捕获时失效。技术价值在于规避资损与数据不一致——电商扣库存、金融转账、订单创建等典型场 阅读详情

相关推荐

mysql面试题

面试官想听:理解隐藏字段、undo log版本链、Read View,能说清楚RR和RC的区别。回答MVCC 是多版本并发控制的缩写,主要用在 InnoDB 等存储引擎中,目的是实现读不阻塞写、写不阻塞读,提升并发性能。它的核心思想是:每次修改数据时不覆盖旧数据,而是生成一个新版本,读操作根据事务的启动时间或 Read View 选择可见的版本。面试官想听:主键索引就是聚簇索引,二级索引是非聚簇索引,回表的概念和代价。回答聚簇索引(主键索引):叶子节点存储整行数据。

m0_47691180的博客 825

CentOS 8 安装 MySQL 8.0 实操指南:RPM 部署、SELinux 与 firewalld 配置

MySQL 是一种广泛使用的关系型数据库管理系统,其核心原理在于基于 SQL 的数据存储、事务处理与 ACID 特性保障。在 CentOS 8 这一采用模块化仓库和强制安全策略(SELinux + firewalld)的现代 Linux 发行版中,直接安装 MySQL 面临官方源缺失、依赖冲突与默认拒绝连接等技术挑战。因此,掌握通过 MySQL 官方 RPM 仓库部署 MySQL 8.0.x(如 8.0.33)、正确配置 SELinux 布尔值(mysqld_connect_any)及 firewalld

注重长远 天天积累 cqujsjcyj 473

15.3.4 使用SHOW CREATE VIEW语句查看视图

15.3.4 使用SHOW CREATE VIEW语句查看视图 使用SHOW CREATE VIEW语句查看视图,语法格式如下: SHOW CREATE VIEW 'view_name' 其中,view_name为视图的名称。 例如,查看view_category_goods视图的信息。 mysql> SHOW CREATE VIEW view_catego...

weixin_41275260的博客 2755

12.视图

MySOL将 自动选择算法:MERGE表示将使用的视图语句与视图定义合并起来,使得视图定义的某 一部分取代语句对应的部分;那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。因此,在使用视图的时候,可能用户根本就不需要了解基本表的结构,更接触不到实际表中的数据,从而保证了数据库的安全。这个视图中的信息很简单,只包含了id、姓名和班级,id 字段对应student 表中的s_id。用同样的语句来查看一下数据表t的信息,从查询的结果来看,这里的信息包含了存储引擎、创建时间等,

m2282475145的博客 4639

STM32+EC800M-CN 4G模块数据透传踩坑实录:从AT指令调试到花生壳内网穿透

本文详细介绍了STM32与移远EC800M-CN 4G模块的数据透传实现过程,包括硬件连接、AT指令调试、TCP连接建立以及花生壳内网穿透配置。通过实战案例和代码示例,帮助开发者快速解决4G通信模块在物联网应用中的常见问题,提升数据传输稳定性。

weixin_42715608的博客 322

科研党必看!Zotero+Claude3插件实战:如何用AI高效阅读文献(附详细配置步骤)

本文详细介绍了如何通过Zotero与Claude3插件的深度整合,实现科研文献的高效阅读与管理。从环境配置到核心功能实战,包括智能摘要生成、精准学术翻译和论文写作辅助等,帮助科研人员大幅提升工作效率。特别适合需要处理大量文献的研究者使用。

o0p1q2r3的博客 433

【MySQL 视图的操作二-查看视图】

目录一级目录二级目录一级目录二级目录一级目录二级目录生词表 一级目录 二级目录 一级目录 二级目录 一级目录 二级目录 生词表 单词 读音 译文 MySQL 如有错误敬请高人指点,书写的易读性可否,希望大家多提意见。 ...

尘雾博客 1万+

第10章: MMU notifier与HMM的协作

本文摘要: HMM(Heterogeneous Memory Management)是Linux内核提供的异构内存管理框架,用于统一CPU与设备(如GPU、DSP等)的内存访问。它通过镜像页表技术实现虚拟地址空间共享,自动同步CPU和设备页表变化,支持透明的内存迁移和设备内存管理。HMM构建在mmu_interval_notifier机制上,利用序列号检测页表修改冲突,提供高效并发控制。核心数据结构包括hmm_range和HMM PFN标志位,通过hmm_range_fault()实现页表遍历和缺页处理。

图形/计算GPU的驱动与虚拟化技术分享园地 3097

【MySQL学习】视图 (Views)

视图(View)是一个虚拟表,它基于一个或多个表的查询结果(SELECT语句)生成。视图本身不是存储数据,而是存储查询定义,每次使用时动态生成结果。可以将视图看作是一个已命名并存储在数据库中的SELECT查询。当你查询一个视图时,数据库系统通常会执行存储在该视图定义中的SELECT语句,并返回结果集,让你感觉就像在查询一个真实的表。今天主要学习了MySQL数据库中Views视图章节了内容,了解了视图的基本定义,怎么创建视图,视图的主要应用场景以及视图的权限管理四部分的内容。

PANSS__的博客 2557

【NI Multisim 14.0原理图设计基础——元器件分类】

电阻(RESISTOR):该元器件栏中的电阻都是标称电阻,是根据真实电阻元器件而设计的,其电阻值不能改变。 排阻(RESISTOR PACK):相当于多个电阻并列封装在一个壳内,它们具有相同的阻值。 电位器(POTENTIOMETER):即可调电阻,可以通过键盘字母动态调节电阻,大写表示增加电阻值,小写表示减小电阻值,调节增量可以设置。 电容(CAPACITOR):所有电容都是无极性的,不能改变参数,没有考虑误差,也未考虑耐压大小。 电解电容器(CAP_ELECTROLIT):所有电容都是有极性的,“+”极

RL2698853114的博客 4万+

WinCC7.5 SP2 安装与授权(文末附授权软件)

安装部分参考了wincc7.5官网下载及安装配置(适配window10超详细教程) 主要介绍授权部分(仅供学习,商用请下载正版授权): 通过官网下载安装了WinCC7.5(需要在西门子官网注册账户,10积分下载)。 安装成功以后,还没授权,先别立即打开。 下载Sim_EBK_Install 复制链接到百度网盘中离线下载: 都是一样的软件,版本不同。有部分解压时需要输入密码,可选择方框里的不需要解压密码: 解压以后,打开: 最后检查秘钥授权是否成功 打开桌面(这是安装WinCC以后就有的): 左

skr? 7万+

Mysql之视图的创建、修改、查看、删除

Mysql之视图的创建、修改、查看、删除

SHOHOKU_1997的博客 5557

AutoSAR系列讲解(入门篇)4.6-BSW的Watchdog功能

BSW的看门狗功能

雪云飞星的博客 1万+

MySQL DDL报错主键冲突:从ERROR 1062解析Online DDL机制与长事务陷阱

数据定义语言(DDL)是数据库管理的核心操作,用于创建、修改或删除数据库对象结构。其执行原理涉及数据库引擎的内部机制,特别是在线DDL技术通过创建临时表、复制数据并切换元数据的方式,力求在修改表结构时减少业务中断。这一过程的技术价值在于支持高可用架构下的平滑变更,但同时也引入了数据一致性的复杂挑战。在MySQL的InnoDB存储引擎中,当DDL操作与未提交的长事务并发执行时,MVCC机制可能导致数据复制阶段读取到旧版本数据,若该数据在临时表中违反唯一性约束,便会触发ERROR 1062主键冲突错误。这一现象

weixin_30402343的博客 543

[Dify实战] 招聘筛简历机器人:自动筛选、排序、生成面试要点-带绑定资源

摘要:本文介绍了如何利用Dify优化简历筛选流程,解决人工筛选耗时、标准不统一等问题。通过结构化输出"评分+亮点+风险+面试关注点",将主观判断转化为规则化流程。关键步骤包括:设计标准化Prompt、配置权重排序策略、确保公平合规性、与ATS系统对接,以及持续优化评估指标。该方法能显著提升筛选效率(缩短招聘周期)、增强一致性(避免主观偏差),并为面试官提供结构化参考信息,最终实现更高效精准的人才筛选。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 581

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 88

Databricks CREATE TABLE 五种语法本质与Delta表治理实践

在湖仓一体架构中,CREATE TABLE 不再是简单建表操作,而是定义数据契约的核心机制。它关联 Delta Lake 的 ACID 事务、时间旅行、Schema 强制、CDC 变更数据捕获等关键能力,直接影响数据可靠性、可追溯性与治理水平。理解不同语法(USING DELTA、LIKE、CLONE、OR REPLACE、Hive format)背后的数据生命周期语义,是构建高可用、可审计、易扩展表的基础。尤其在 Databricks + Unity Catalog 环境下,建表即定权属、定位置、定策略—

weixin_33739646的博客 405

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MySQL问题诊断思维链:从连接失败到死锁的五步定位法

MySQL作为最主流的关系型数据库,其稳定性直接关系到业务连续性。理解其底层原理——如连接建立机制、查询优化器如何选择索引、InnoDB事务与锁的协同逻辑、配置参数对资源调度的影响——是高效排障的前提。技术价值在于将模糊的‘慢’‘连不上’‘数据不一致’等现象,转化为可验证的指标(如Threads_connected、Innodb_buffer_pool_hit_rate、INNODB_TRX状态)和可回溯的操作路径。典型应用场景覆盖金融核心账务、电商大促后台与SaaS平台等高要求环境,尤其适用于处理ERRO

weixin_33743703的博客 566

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL到ES数据同步实战:Canal配置避坑指南(含常见报错解决方案)

本文是一份基于Canal实现MySQL到Elasticsearch数据同步的实战配置与问题排查指南。文章深入解析了MySQL的binlog配置、Canal Server与Adapter的生产级调优、高可用部署方案,并针对数据同步延迟、一致性等常见问题提供了详细的解决方案,帮助开发者有效避坑,构建稳定可靠的数据同步管道。

3c4x5z6v7b的博客 632

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MySQL 选型与安装完全指南 | 从版本对比到多平台部署,零基础也能轻松上手

📌 MySQL选型与安装指南摘要 本文为2026年最新MySQL安装教程,涵盖版本选型、多平台安装及常见问题解决方案。主要内容包括: 版本对比:详细分析MySQL 9.7 LTS/8.4 LTS/8.0 LTS特性差异,推荐新手选择8.4 LTS版本 安装指南: 提供Windows/Linux(Ubuntu)/macOS三大平台的详细安装步骤 包含字符集配置、远程访问设置等关键配置说明 问题解决:整理密码设置、端口占用、连接失败等新手常见报错的解决方案 版本建议: 新项目推荐MySQL 9.7 LTS(最

专注于跨端开发实战,分享从工程搭建到应用落地的全流程技术干货,助力开发者快速掌握跨平台开发核心能力,打造稳定、高效的应用。 395

Ubuntu 14.04 安装 MySQL 5.5 实战指南

MySQL 是一种关系型数据库管理系统(RDBMS),其核心原理是基于客户端-服务器架构、SQL 查询语言与事务ACID特性实现数据持久化与并发控制。在老旧系统运维与遗留环境迁移中,MySQL 5.5 仍具重要技术价值——它轻量、稳定、兼容性强,且无需 systemd 或现代插件机制。典型应用场景包括嵌入式教学实验、工业控制终端、课程实训平台及 Ubuntu Trusty Tahr(14.04)等已终止支持的 LTS 系统维护。本文聚焦于该特定组合下的真实部署难点:源失效修复、upstart 启动适配、my

weixin_34221036的博客 411

知识体系之MySQL

mysql

JaweG 5251
上一篇: MySQL8.0 show create view BUG解析
下一篇: MySQL8.0 show create view BUG解析
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值