上午10:00 某运营商核心报表平台升级前夕

作为万里数据库的战略合作伙伴,某运营商一直密切关注着国产数据库的发展。其系统中一套基于MySQL8.0.11版本的核心报表平台,近期由于存在安全扫描的漏洞,需要尽快将其升级到MySQL8.0.25及以上版本。

由于客户对MySQL新版本存在一定的观望心理,以及对业务验证的充分性待提升,客户最终选择升级到MySQL8.0.25。该运营商客户运维人员按照MySQL官网的流程,提前编写了数据库版本升级方案,并在公司内的测试环境进行了多次验证,然后信心满满地开始评审。

看似一切轻车熟路。该运营商客户的运维组、业务线、项目部等诸多部门在确认了升级方法、changes in MySQL 8.0.25后,评审流程成功通过。接下来,他们根据升级方案在测试环境中进行验证,也没遇到任何阻碍。

在一片安静祥和中,开始提单升级生产环境……

晚上22:40 叮铃铃… “生产环境升级失败了,且无法回退”

晚上22:40,万里数据库DBA收到客户的紧急求助,“核心报表平台升级MySQL8.0.11到MySQL8.0.25失败了,运维人员尝试回退但是无法回退成功!!!”。

客户在遇到困难时,第一时间想到了万里数据库。接到客户求助电话后,手握《深入理解MySQL主从原理》、睡眼惺忪的我(DBA运维人员)顿时清醒,以迅雷不及掩耳之势迅速打开电脑,远程登陆客户环境查看情况。

10分钟后,我确定了问题状况:该方案在同版本的测试环境多次验证均成功,当前即使加上选项--upgrade=force也无济于事,确实也无法回退。

接着,紧急定位MySQL的错误日志,发现以下信息:

2022-03-26T22:22:18.224527+08:00 1 [Note] [MY-013627] [InnoDB]     Scanning temp tablespace dir:'./#innodb_temp/'
2022-03-26T22:22:18.234733+08:00 1 [Note] [MY-013018] [InnoDB]     Created 128 and tracked 128 new rollback segment(s) in the temporary     tablespace. 128 are now active.
2022-03-26T22:22:18.235849+08:00 1 [Note] [MY-012976] [InnoDB]     Percona XtraDB (http://www.percona.com) 8.0.25-15 started; log sequence     number 225808521
2022-03-26T22:22:18.254595+08:00 1 [System] [MY-013577] [InnoDB]     InnoDB initialization has ended.
2022-03-26T22:22:18.307905+08:00 1 [System]     [MY-011090] [Server] Data dictionary upgrading from version '80011' to     '80025'.
2022-03-26T22:22:18.308597+08:00 1 [Note] [MY-013327] [Server] MySQL     server upgrading from version '80025' to '80025'.
2022-03-26T22:22:18.533034+08:00 1 [Note] [MY-012357] [InnoDB]     Reading DD tablespace files
2022-03-26T22:22:18.535481+08:00 1 [Note] [MY-012356] [InnoDB]     Scanned 27 tablespaces. Validated 27.
2022-03-26T22:22:19.210608+08:00 0 [ERROR]     [MY-010020] [Server] Data Dictionary initialization failed.
2022-03-26T22:22:19.217762+08:00 0 [ERROR] [MY-010119] [Server]     Aborting
2022-03-26T22:22:19.218695+08:00 0 [Note] [MY-012330] [InnoDB] FTS     optimize thread exiting.
2022-03-26T22:22:19.548897+08:00 0 [Note] [MY-010120] [Server] Binlog     end
2022-03-26T22:22:19.549458+08:00 0 [Note] [MY-010733] [Server]     Shutting down plugin 'MyISAM'
2022-03-26T22:22:19.549518+08:00 0 [Note] [MY-010733] [Server]     Shutting down plugin 'InnoDB'
2022-03-26T22:22:19.549623+08:00 0 [Note] [MY-013072] [InnoDB]     Starting shutdown..

初步定位到的地方是,MySQL8.0.11升级到MySQL8.0.25时,涉及data dictionary变更,此时确实无法回滚。由此,升级失败的详细原因需要从更深一层的底层源码分析了,这已经超出了一个普通DBA运维人员的能力范畴!

好在,万里数据库之前是MySQL中国研发中心,公司积累了大量的MySQL源码级资深研发人才。当下办法,只能赶紧联系公司的研发大神。

研发大神经过半小时的gdb调试,锁定到了升级失败的原因:

MySQL8.0.25源码中的data dictionary version变更后,升级流程中会检查并编译routines。当检查到含有“Optimizer hint syntax errornear 'parallel(t1,4)*/”的routine抛出warnings,而MySQL源码把这个warning当作ERROR处理了,引发升级失败。

听到研发大神的答复,心里终于有底了!失败的原因搞清之后,公司的研发大神紧急帮我编译版本包。终于在研发紧急修复、CI构建、用例执行成功后,客户的MySQL版本现场升级成功!

凌晨4:40 既然一夜无眠,那就按照研发建议复现看看

升级成功后,此时业务已经影响几小时了,联系运营商客户进行了业务测试,最终成功。但此时的我已经毫无困意,干脆再请教一下研发大神,MySQL bug的复现方法和后续操作。

按照研发大神的指导,在低版本(如MySQL8.0.11)升级到高版本(如MySQL8.0.25)时,只要涉及到dd_version变更,确实会在含warning的routine中显示升级失败(构建warning的routine很容易,参考bug107384复现步骤)。

本着开源共享和回馈MySQL社区的原则,我赶紧将bug提交到MySQL官方。当前,该bug已经验证通过。

bug链接如下:https://bugs.mysql.com/bug.php?id=107384

本次升级的复盘总结和效果反馈

此次的升级过程可谓一波三折,并且也发现了升级流程和方案中很多值得优化的地方。同时,通过帮助客户进行紧急的版本升级和向公司研发大神请教相关的经验和实操方法,我们总结了一些升级反馈和复盘经验,如下:

小/霸/王/盘/点

1.本次升级失败的原因

属于MySQL代码层面的bug,简要介绍如下:

在MySQL版本升级涉及dd_version变更,涉及到routine的hint解析报错(Optimizer hint syntaxerror near 'parallel(t1,4)*/)时,升级就会失败;

复现方法:

MySQL8.0早期版本搭建实例,创建routine(内含hint parser失败的语句),此时升级到新版本(dd_version变更)就会出现。

2.无法回退的原因

MySQL升级跨较大版本(一般指的是dd表变更,升级成功后MySQL的机制就禁止回退。

3.本次的经验教训

A.必须在测试环境验证,本次也在同样版本的测试环境验证,但是由于没有涉及routine的hint解析报错场景,所以没验出来;

B.测试环境选择上,最好可以充分模拟待升级的环境(表结构、对象、数据量等),充分利用测试环境;

C.针对测试环境验证成功的升级方案,也需要再验证下回退流程,提前预知风险。

尽管路途曲折,但此次的紧急响应协助让客户看到了万里数据库的DBA运维人员连夜处理问题的响应时效、处理Bug认真负责的服务态度,以及后台研发人员分析修复问题的能力。在对bug修复和方案的讨论验证过程中,万里数据库和客户的革命友谊也得到了进一步的增进。

此次的升级经验和结果,也为万里数据库后期的客户技术支持工作带来了更多的经验借鉴和信心。未来,万里数据库将一如既往秉持着认真严谨的态度,对待每一次的系统升级、故障处理、产品测试。同时,在国产数据库前进的征程上,万里数据库将一往无前地坚持“极致稳定、极致易用、极致性能”的产品理念,打磨锤炼产品,为GreatDB每一次的完美进阶全力以赴。

项目纪实丨MySQL Bug引发客户现场升级失败 万里DBA 6小时攻克难关相关推荐

  1. 【项目管理】记第一次出差到客户现场推进项目验收感悟-后续1

    导读:上次出差回来后,实际推进项目验收没有想象中那样顺利,直到12-31号才最终取得实质性进展,这段时间通过自己一系列的跟进才逐步推进项目验收时间.现分享这期间几点实践的想法. 目录 监控 文档 意外 ...

  2. 【项目管理】记第一次出差到客户现场推进项目验收感悟

    导读:这是本人第一次出差到客户现场,也是转型项目经理第一次出差,慢慢啃下了这个历史遗留项目的"硬骨头"的过程.希望这次出差的感悟,对于面对客户时候如何直面问题,分析问题,解决问题, ...

  3. 到客户现场进行项目开发流程

    一.找到客户项目负责人对接 当我们去到客户现场,首先要做的就是找到客户的项目负责人,说明此次的来意,以及本次来现场预先准备的项目开发计划内容,让客户对此次项目的开发有一个大致的预期.(切记:一到达现场 ...

  4. 项目纪实--如何搭建一个高可用强一致性灵活元数据管理的数据平台实现高效可靠的数据分发等功能

    项目纪实–大型数据平台系统构建 背景:18年入职这家轻松的国企,在19年难得接(抢)到一个有意思的项目,开始定义还比较简单:写一个CMS用于近期某XX项目中发布数据,开始是找到别人被别婉拒后我主动给接 ...

  5. 9.3.客户现场私有云实施部署规范

    项目系统通过测试后,可以供客户使用,就必须要先安装部署.有些项目需要部署到客户自己的服务器上面去:有的需要部署到客户内网服务器,那么就需要到客户现场进行部署. 针对单独部署到客户自己服务器上的项目,我 ...

  6. 『转』度百死去飞秋一个BUG引发的血案

    作了一篇文章度百死去飞秋一个BUG引发的血案,昨天,度百死去的美国客户发邮件给我,说我的软件出问题了,我查来查去,发现居然是服务器上一个目录无法删除,一删除就报 cannot read from th ...

  7. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...

    阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程) (仅此纪念人生第一篇学习博客) 前阵子接了一个小小的JavaWe ...

  8. ubantu20.04服务器使用docker以及docker-compose编排部署前后端分离个人博客项目(springboot+vue+mysql+redis)

    ubantu20.04使用docker部署前后端分离个人博客项目(springboot+vue+mysql+redis) 前言 本博客是基于springboot+vue+jwt+redis+mysql ...

  9. 数据库与身份认证(数据库的基本概念,安装并配置 MySQL,MySQL 的基本使用,在项目中操作 MySQL,前后端的身份认证)

    theme: channing-cyan 数据库与身份认证 1. 数据库的基本概念 1.1 什么是数据库 数据库(database)是用来组织.存储和管理数据的仓库. 当今世界是一个充满着数据的互联网 ...

最新文章

  1. python创建图片对应的csv格式_Python:如何从csv文件创建图形节点和边?
  2. 【数学专题】组合数学与计数
  3. 【PAT乙级】1081 检查密码 (15 分)
  4. matlab计算联合熵,如何用matlab软件计算一幅图像信息的熵以及两幅图像间的联合熵?...
  5. 从概念到落地,中台可以解决哪些问题?怎么做?(附PPT)
  6. html禁止页面左右滑动,js阻止移动端默认事件以及只阻止横向滚动事件方法
  7. php mysql单引号 双引号_php单引号、双引号与数据库
  8. 关于创业,潮汕人、温州人做生意的多
  9. NAND Flash和NOR Flash的比较
  10. msfconsole连接mysql数据库_kali2.0 msfconsole连接postgresql及启动armitage
  11. 国家统计局 省市区 数据爬取
  12. 常用的线性充电IC和开关充电IC的区别
  13. 广义相对论 狭义相对论 双生子
  14. 拒酒词――――――社交必备
  15. js加ajax实现分页
  16. 由ERP生产提前期的设定引发的思考
  17. GPU 资源消耗原因和解决方案:
  18. 区块链链上数据全公开,你却不知道怎么查?找Gikee啊
  19. 【社招和校招】格灵深瞳合肥研发中心计算机视觉算法岗招聘
  20. android 混淆debug版本,在Android Studio中的混淆debug與release

热门文章

  1. BA-业务架构_优化“价值主张画布”,助力企业数字化赋能
  2. 2023年最有前景的行业
  3. LibreOJ10082. 「一本通 3.3 例 1」Word Rings【二分+SPFA】
  4. 【工作技巧】医疗行业标准查询方式
  5. “2019-04-25T16:00:00.000+000”时间格式转换 (IE兼容问题)
  6. java自定义注解实现excel数据导入导出,设置单元格数据验证与生成省市区多列联动效果
  7. jQuery网页版简易qq音乐
  8. 【c语言作业-二维数组】编写程序,求一个给定的n阶方阵的鞍点。
  9. 基于GEC6818的智能家居系统[完整源码/项目报告/笔记分享]
  10. 凡人修真3D(3)神翼