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.

image-20221115105907333

​ 接着我们可以从源码中找出原因(启动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

Robocup3d

一、 比赛介绍 RoboCup 仿真比赛是一个能为多智能体系统和模拟智能进行研究、教育的工具。比赛是在一个标准的计算机环境中进行的,提供了一个完全分布式控制、实时异步多智能体环境。通过这个平台,可以测试各种理论、算法和Agent体系结构。在实时异步、有噪声的对抗环境中,研究多智能体的合作对抗问题。当然,仿真组的比赛使用的机器人并非是真的机器人。一个机器人是一个Agent, 它拥有自己的大脑,

zhanghe2775115的专栏 7265

记录mysql8.0遇到的bug

记录mysql8.0遇到的bug 目录MySql链接报错Springboot链接Mysql8.0出错报错代码springboot项目中的pom文件中配置的Mysql驱动版本与mysql数据库版一致application.yml MySql链接报错 新安装了mysql8.0.22 明明前两天测试能通过连接,但是在cmd运行 mysql -u root -p时,输入密码后总会报错。显示如下: ERROR 1045 (28000): Access denied for user ‘root’@‘localhos

weixin_43977402的博客 711

Cluster Computing期刊投稿实战:从格式调整到技术检查的全流程解析

本文详细解析了向Cluster Computing期刊投稿的全流程,涵盖心理准备、格式调整、参考文献处理及投稿系统操作。重点介绍了如何利用Springer LaTeX模板,特别是使用picins宏包解决作者简介排版难题,并强调了将BibTeX转换为BBL文件以避免技术审查陷阱,为研究者提供了一份实用的投稿指南。

weixin_28432777的博客 668

CubeMX配置ADC+DMA避坑实战:如何避免采样过快导致的系统崩溃

本文针对STM32开发中常见的ADC采样过快导致程序卡死问题,提供了基于CubeMX的实战避坑指南。通过分析ADC与DMA协作机制,详解时钟配置、采样时间、DMA缓冲区长度及中断设置等关键步骤,帮助开发者从源头规避系统崩溃风险,实现稳定可靠的数据采集。

weixin_28273593的博客 324

mysql grant 用户权限总结

用户权限管理主要有以下作用: 1. 可以限制用户访问哪些库、哪些表 2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作 3. 可以限制用户登录的IP或域名 4. 可以限制用户自己的权限是否可以授权给别的用户 一、用户授权 mysql> grant all privileges on *.* to 'yangxin'@'%' identified by 'yangxin123456' with grant option; 1 all pri

YHJ 2万+

555定时器呼吸灯电路制作全攻略:从仿真到实物搭建(附避坑指南)

本文详细介绍了使用555定时器制作呼吸灯电路的完整流程,从基础原理到实物搭建,包括电路设计、元件选择、仿真验证、焊接技巧及调试优化。特别提供了避坑指南,帮助电子爱好者快速掌握这一经典DIY项目,实现美观的呼吸灯效果。

weixin_33734785的博客 402

MySQL8.0常见疑难问题有哪些

MySQL 8.0 引入了许多新特性和改进,但同时也带来了一些新的挑战和疑难问题。

专注于数据库技术分享,包含但不限于Oracle,MySQL,PostgreSQL,ElasticSearch及国产数据库等 1144

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。

我是一条寻水的鱼 2979

IEPE传感器4mA恒流源接口电路

另外传感器的偏置电压大概在10V多点,一般接个电容把直流分量去掉。这里我们要把恒流源的电流设置在4毫安左右,R1取33Ω差不多正好。经过CR的隔直流电路后的波形是这样的。

老白的博客 6112

mysql 8.0 近期使用问题汇总

公司服务器近期将mysql全部从之前的5.7 升级到了新的8.0版本,但是遇到了好多的坑,近期吭哧吭哧的改了两个礼拜的存储过程了,全部都是血泪啊。 下面说说几个大坑 1. mysql 8.0 使用其他客户端登陆的权限问题,登陆时一直提示 ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be lo...

从未完美过的博客 864

BlockUI专栏目录

BlockUI是一个设计NX对话框的工具,是官方推荐使用的对话框制作方法,能够与NX自身风格相统一,并且在实际开发中经常被使用。BlockUI可以帮助用户快速创建NX对话框,支持多种控件类型,如按钮、文本框、标签等。通过使用BlockUI,用户可以轻松地自定义对话框的布局、样式和交互行为。此外,BlockUI还提供了一些高级功能,如动态更新、条件显示和事件处理等,以帮助用户创建更加复杂和灵活的对话框。本专栏讲述了使用BlockUI制作NX对话框的方法,介绍了每个控件的功能,并且分享一些常用操作的源码。

王牌飞行员_里海的博客 1633

MySQL8.0 视图

PART1. 视图概述 视图是从一个或者多个表中导出的,视图的行为与表非常相似,但是试图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录。视图操作方便,而且可以保障数据库系统的安全。 1. 视图的含义 视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基础上定义。 视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中在存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操

S_zhangmin的博客 2066

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro

Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 547

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

weixin_30402343的博客 543

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

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

OV9734 DATASHEET,完整规格书

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

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

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

3c4x5z6v7b的博客 632

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

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

weixin_33743703的博客 566

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
上一篇: MySQL分区表对NULL值的处理
下一篇: MySQL8.0 show create view BUG解析
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值