MySQL崩溃问题:根源与解决方案

背景与问题概述

近期,我遭遇了一起奇特的MySQL崩溃事件 。在查看general日志后,我发现崩溃是由一条show create view命令触发的。经过深入的实验和源码审查,我终于成功复现了该问题并找到了其根源。

事故发生时的环境配置如下:

操作系统:Centos7.8

MySQL版本:8.0.13/8.0.14/8.0.15

为了复现问题 ,我在测试环境中精心构建了一个简单的场景。用户test仅拥有GRANT USAGE权限,而该用户又被赋予了一个名为test_role的角色。当执行show grants for test\_role命令时,MySQL便出现了崩溃。

02视图与role机制

在MySQL 8.0中,role是一个新增的功能 ,类似于Oracle中的角色概念。通过先赋予role权限,再将role授权给用户的方式,可以实现对用户的权限管理。需要注意的是,在赋予role权限后,需要使用set default role all to user命令来激活它,否则无法正确复现该问题。

◉ 视图创建问题

视图结构如下:

```sql

CREATE ALGORITHM=UNDEFINED DEFINER=test SQL SECURITY DEFINER VIEW test\_show\_view AS SELECT ...;

```

这里只是一个示例视图结构,具体的SELECT语句需要根据实际情况编写。需要注意的是,视图创建时若未正确指定字符集及排序规则,可能影响查询结果和触发崩溃。在创建视图等对象时,会遇到两个选项:definer和invoker。SQL SECURITY { DEFINER | INVOKER }用于指定谁有权执行该对象。DEFINER选项表示将根据定义者的权限来执行;而INVOKER选项则表示使用调用者的权限。在默认情况下,系统会选择DEFINER作为执行者。

03崩溃原因分析

◉ 相关错误日志

查看errorlog,我摘取了其中的关键信息。errorlog显示崩溃于acl_getroot函数,这似乎与一个无效指针有关,导致程序崩溃。问题出现在acl_getroot函数上,这涉及角色权限的获取。

◉ 代码调试过程

接着,我们深入源码进行调试,以找出问题的根源。启动Vscode后,我们发现了acl\_getroot函数在build/sql/auth/sql\_auth\_cache.cc代码文件中,其作用是获取用户的ROLE权限。而问题恰恰出现在下面这段代码中:

```cpp

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);

}

```

在调试过程中,我们进一步深入到源码层面,试图找出问题的根源。在Vscode中,我们聚焦于acl\_getroot函数,该函数位于build/sql/auth/sql\_auth\_cache.cc文件中。查看源码发现db\_acl返回空指针,引发崩溃,此问题在8.0.16后得到修复。

04解决方案与总结

◉ 解决方案

既然我们找到了问题的根源,那么解决它也就变得相对简单了。有几种可能的解决方案供选择:

  1. 不使用role角色功能,而是直接赋予用户所需的权限。

  2. 升级MySQL至更稳定的版本,比如8.0.17或8.0.20,这些版本可能已经修复了这个问题。

希望这些信息能够帮助您解决问题!

相关推荐
辻弋2016 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
可乐鸡翅yeah_7 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
石头麻辣鱼7 小时前
Bamboo 调度系统 OceanBase 适配实战:存储过程迁移踩过的三个大坑
数据库
龙亘川7 小时前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
念何架构之路8 小时前
zap扩展生态与总结
java·前端·数据库
晚安日记wanna8 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
第七页独白8 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
晚安日记wanna8 小时前
索引建了却不走?7 个失效原因逐层排查
数据库·mysql·性能优化
KID1412号9 小时前
PostgreSQL入门
数据库·postgresql
Elastic 中国社区官方博客9 小时前
使用 Lucene 搜索你的 Bean — 索引
java·大数据·数据库·elasticsearch·搜索引擎·全文检索·lucene