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.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L23l5Np1-1670230352774)(http://image.openwrite.cn/28267_3BDE40B879544D85B13C2BAB80567C64)]

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

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群。

在这里插入图片描述

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群。

image-20221030163217640)

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

工作笔记05:imu、底盘车轮、单激光雷达外参校准(基于hdl_graph_slam建图和定位)

目录1. imu 校准1.1 IMU型号1.2 坐标定义1.2.1 大地坐标系(WGS84)1.2.2 当地地理坐标系(ENU)1.2.3 传感器坐标轴定义1.3 传感器校准2. 底盘车辆参数配置3. 单激光雷达校准参考文献 1. imu 校准 1.1 IMU型号 阅读IMU产品说明书,获得如下信息: Yesense YIS300 系列惯性传感系统 YIS300 系列包含: YIS300-U 惯性测量单元(IMU):输出经过校准的加速度和角速度值,同时也能够输出磁场强度信息。 YIS300-V 垂直参考系

穿林需独行的博客 4203

常用函数

switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。 语法 switch case 语句语法格式如下: switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有任意数量的case语句 default : //可选 //语句 }

weixin_43581646的博客 496

运算放大器电路中的T型网络:如何用更小电阻实现高增益并降低噪声?

本文深入解析了运算放大器电路中T型反馈网络的设计与应用。该网络通过三个较小阻值电阻的组合,等效实现高增益,有效规避了传统大反馈电阻带来的显著热噪声问题。文章从数学原理、噪声定量分析到实际设计技巧,系统阐述了如何利用T型网络在实现高增益的同时,显著降低电路噪声并改善整体性能。

banana的博客 318

从内参矩阵到归一化平面:揭秘相机成像的标准化核心

本文深入解析了相机成像中的核心概念——归一化平面。通过拆解内参矩阵(包含焦距、主点等参数)的作用,详细阐述了如何将像素坐标转换为与具体相机硬件无关的归一化坐标。这一标准化过程是计算机视觉算法(如多相机系统对齐、视觉SLAM)实现跨设备通用性的关键,能有效提升算法的鲁棒性和泛化能力。

opencv7vision的博客 449

MYSQL 8 show processlist 到底信息从哪里来,换到哪里了,怎么打开,哪里有进步?...

放假的最后一天,的回答最近有一个小朋友问了一个关于 processlist 的问题,基于MYSQL 8 show processlist 到底从哪里来的信息,MYSQL 8 中提供pro...

sql server的专栏 1023

OpenHarmony 5.1 RK3568 开发板烧录:从源码编译到镜像写入的 6 步实战

本文详细解析了OpenHarmony 5.1在RK3568开发板上的全链路开发流程,包括环境搭建、源码编译、镜像烧录等6个关键步骤。通过实战指南和避坑技巧,帮助开发者快速掌握OpenHarmony系统的烧录与定制能力,提升物联网设备开发效率。

weixin_33722405的博客 343

mysql schema语句_mysql8 参考手册-INFORMATION_SCHEMA的 SHOW语句扩展

INFORMATION_SCHEMA的SHOW语句 实现某些扩展伴随如下 :SHOW可用于获取有关其INFORMATION_SCHEMA自身结构的信息 。多个SHOW语句接受一个WHERE子句,该子句在指定要显示的行时提供了更大的灵活性。INFORMATION_SCHEMA是一个信息数据库,因此其名称包含在的输出中 SHOW DATABASES。同样, SHOW TABLES可用于 INFORMA...

weixin_33110431的博客 245

AIDC智算中心建设:资源池化核心技术解析

AI 应用的POD在运行的时候,通过池化运行时访问虚拟GPU、执行AI任务,池化运行时拦截对虚拟GPU的访问请求、转递给池化服务代理执行,池化服务代理通过向智算池化控制器查询虚拟GPU所对应的真实智算资源位置、规格,按查询结果分配智算资源、执行AI任务,如果真实的智算资源位于远程计算节点,则由本地池化服务代理将访问请求转递给远程计算节点上的池化服务代理处理,相关通信经由参数面网络。

u013891230的博客 2431

TSN新技术,让您的设备网络“更实时、更确定、更安全”

近日,工业和信息化部发布了2022年第23号公告,批准发布行业标准YD/T 4134-2022《工业互联网时间敏感网络需求及场景》。该标准是国内首个时间敏感网络(TSN)技术标准,标志着我国TSN技术标准体系建设迈出了坚实的一步,对构建工业互联网网络标准体系具有重要意义。TSN源于Time-Sensitive Networking的缩写,中文译名为时间敏感网络,因其具备的确定性和微秒级交互特性,受到了对实时性要求较高的工业控制领域的关注。TSN与工业数智化。

创龙,嵌入式一体化解决方案商 771

MySQL(8)——Show Profile、Trace和全局查询日志

一、Show Profile show profile是mysql提供的可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量。 默认情况下,该参数处于关闭状态,并保存最近15次的运行结果。 (一)开启 1. 查看当前版本mysql是否支持 mysql> select @@have_profiling; +------------------+ | @@have_profiling | +------------------+ | YES | +------

tingxuejianghu的博客 869

【Linux】软件控制USB重新上电、加载:usbreset、hubpower、uhubctl

使用命令控制USB的供电、复位

郭老二 2187

MySQL 8 锁表问题

核心指标说明:Table_locks_immediate: 指的是能够立即获得表级锁的次数Table_locks_waited: 指的是不能立即获取表级锁而需要等待的次数,如果数量大,说明锁等待多,有锁争用情况。

fhw925464207的博客 1280

手把手教你学PCIE--固件与BIOS配置 - BIOS设置对PCIe性能的影响

本文详细分析了BIOS设置对PCIe性能的影响,并提供了优化建议。通过合理调整链路参数、功耗管理策略和高级功能配置,可以显著提升系统的性能和稳定性。本文将进一步分析BIOS设置如何影响PCIe设备的性能,并提供优化建议。BIOS(或UEFI)是系统启动时的第一个控制层,其设置直接决定了PCIe设备的工作状态和性能表现。BIOS中的功耗管理选项(如C-States、P-States)会影响PCIe链路的低功耗模式(L0s/L1)。MSI/MSI-X中断具有更高的性能和更好的可扩展性,应作为首选方案。

MHD0815的博客 995

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

weixin_30402343的博客 543

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

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

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

weixin_33743703的博客 566

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

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

3c4x5z6v7b的博客 632

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解析
下一篇: MySQL客户端的进阶操作
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值