MySQL8.0 show create view BUG解析

news2024/12/24 2:50:46
  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】详解Linux权限管理

文章目录 1.Shell命令以及运行原理 2.Linux权限的概念 2.1用户介绍 2.2用户切换指令 su 当前所处目录不变 当前所处目录改变 3.Linux 权限管理 3.1文件访问者的分类 3.1.1 拥有者 3.1.2 所属组 3.1.3 other 3.1.4 总结 3.2文件类型和访问权限 3.2.1文件类型 3.2…

基于 SE (2)-XYZ 约束的地面车辆视觉-轮速计定位与建图

摘要-本文关注的是地面车辆使用轮速计和单目视觉传感器的SLAM问题,为了改进基于视觉的地面车辆估计精度,研究人员利用了近似平面运动的约束,通常将其作为 SE (3)位姿的随机约束来实现,在本文中提出了一个更简单的算法,…

如何利用数字创新使您的企业脱颖而出

如何利用数字创新使您的企业脱颖而出 数字创新并非易事,但它会对您的企业内部和外部产生积极影响。 然而,数字化的方式如此之多,企业很难决定将注意力集中在哪里。 本文的目的是概述数字创新的战略方法。这种方法让您重新审视现在与未来的…

订单管理是客户关系管理的有效延伸,那么订单管理系统对于企业的作用有哪些呢?

订单管理是客户关系管理的有效延伸,能更好的把个性化,差异化服务有机的融入到客户管理中去,能推动经济效益和客户满意度的提升。与此同时,随着电商的发展与经济全球化的影响,不少企业的订单量都是暴增状态。海量订单数…

【读书笔记】高级FPGA设计之高速率结构设计

目录 写在前面 1. 概念介绍 2. 高速度结构设计 2.1 高流量 2.2 低延时 2.3 优时序 2.3.1 组合逻辑插寄存器 2.3.2 并行结构 2.3.3 展平逻辑结构 2.3.4 寄存器平衡 2.3.5 重新安排路径 3. 总结 写在前面 本博客为阅读书籍《高级FPGA设计》的部分读书笔记&#xff0c…

XXL-JOB核心源码解读及时间轮原理剖析

你好,今天我想和你分享一下XXL-JOB的核心实现。如果你是XXL-JOB的用户,那么你肯定思考过它的实现原理;如果你还未接触过这个产品,那么可以通过本文了解一下。 XXL-JOB的架构图(2.0版本)如下: 它…

易基因|ChIP-seq等实验揭示CHD6转录激活前列腺癌通路的关键功能 | 肿瘤耐药研究

易基因|ChIP-seq等实验揭示CHD6转录激活前列腺癌通路的关键功能 | 肿瘤耐药研究 大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 2022年11月21日,北京大学基础医学院赵东宇研究员、美国休斯敦卫理公会研究所Min…

详解 Redis 中 big keys 发现和解决

在使用 Redis 时,可能会出现请求响应慢、网络卡顿、数据丢失的情况。排查问题的时候,发现是 big keys 的问题。 什么是 big keys 在 Redis 中,一个字符串类型最大可以达到 512MB,其他非字符串类型的集合类型(list、set、hash、z…

网络常见面试题

1.简述OSI七层模型主要功能 OSI---开放(协议公有)系统互联参考模型 解决数据传输不兼容性 IS0---国际标准化组织---定义->OSI 7层(基本功): 应用层:人机交互的接口,接收应用程序的数据…

【AI】Python 实现粒子群算法

粒子群算法 1. 题目介绍 粒子群算法,其全称为粒子群优化算法 (Particle Swarm Optimization, PSO) 。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。粒子群算法属于启发式算法也叫智能优化算法,其基本思想在于通过群体中个体之间的…

零入门容器云网络-6:基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例

已发表的技术专栏(订阅即可观看所有专栏) 0  grpc-go、protobuf、multus-cni 技术专栏 总入口 1  grpc-go 源码剖析与实战  文章目录 2  Protobuf介绍与实战 图文专栏  文章目录 3  multus-cni   文章目录(k8s多网络实现方案) 4  gr…

ROS系列:第六章 机器人建模

文章目录六、机器人系统仿真1.概述仿真优势:仿真缺陷:2. URDF集成Rviz基本流程1.创建功能包,导入依赖2.编写 URDF 文件3.在 launch 文件中集成 URDF 与 Rviz4.在 Rviz 中显示机器人模型5.优化 rviz 启动3. URDF语法详解3.1 URDF语法详解01_robotrobot1.属性2.子标签…

Promethus实操部署ARM架构 麒麟系统

由于有个地市局的等保测评要求安装监控软件,实操安装普罗米修斯和Zabbix,原本想安装Zabbix在本地安装非常顺利,但是服务器是华为鹏鲲的、ARM架构,Zabbix的有些东西找不到ARM的,所以两个都尝试了下。本篇讲解下Promethu…

协同过滤推荐算法

协同过滤:利用集体智慧,借鉴相关人群的观点进行推荐。 过去兴趣相似的用户在未来的兴趣也会相似;相似的用户会产生相似的历史行为数据。 根据历史行为,产生相似用户,分析出推荐结果。 用一句大白话说,其实也…

Android请求应用权限

文章目录前言参考一、请求应用权限基本原则二、请求权限的流程(官网摘抄)三、请求权限编码1.允许系统管理权限请求代码2.自行管理权限请求代码总结前言 学习Android为什么需要动态申请危险权限 学会Android应用危险权限申请的方式 参考 Android官方文档…

8 种 Python 定时任务的解决方案

在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现,另外一种方式是直接使用Python。 最近我整理了一下 Python 定时任务的实现方式,内容较长,建议收藏后学习&a…

uni-app云开发(我直接访问后端)

uniCloud 是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 熟悉的js的程序员,轻松搞定前后台整体业务。实现了前端完成前后端工作的可能 用法: 第一步新建uniCloud项目 点击文件 ——>新建—…

Hue编译安装使用

简介 由于大数据框架很多,为了解决某个问题,一般来说会用到多个框架,但是每个框架又都有自己的web UI监控界面,对应着不同的端口号。比如HDFS(9870)、YARN(8088)、MapReduce(19888)等。这个时候有一个统一的web UI界面去管理各个大…

高斯混合模型下的变分推断

大概从下面几个部分学习: 1.EM算法 人人都懂EM算法 - 知乎 (zhihu.com) 18分钟理解EM算法 - 知乎 (zhihu.com) 变分贝叶斯深度学习综述 - 知乎 (zhihu.com) 【未看完】 EM算法存在的意义是什么? - 知乎 (zhihu.com)【八种境界】 EM 算法具备收敛性…

java计算机毕业设计ssm体育赛事管理系统App2qrcr(附源码、数据库)

java计算机毕业设计ssm体育赛事管理系统App2qrcr(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#x…