项目纪实 | 版本升级操作get!GreatDB分布式升级过程详解
某客户项目现场,因其业务系统要用到数据库新版本中的功能特性,因此考虑升级现有数据库版本。在升级之前,万里数据库项目团队帮助客户在本地测试环境构造了相同的基础版本,导入部分生产数据,尽量复刻生产环境进行升级,显示测试升级正常。
之后,将万里安全数据库分布式 GreatDB-Cluster由5.1.9 升级为GreatDB-Cluster 6.0.3 版本,以下为具体的升级方案与过程。
01数据库升级操作一览
-
GreatDB-Cluster 5.1.9 对应MySQL功能版本为8.0.25, GreatDB-Cluster 6.0.3 对应 MySQL功能版本为8.0.32(旨在与MySQL驱动程序形成对照);
-
生产环境操作系统使用CentOS Linux release 7.6.1810 (Core)。
2. 执行升级
-
由于版本跨度较大,执行了离线升级操作。
-
先停止应用,所有从副本追平主副本,GTID一致,再安全地关闭数据库实例,所有脏页都刷盘。
-
替换了执行程序后,启动第一个计算节点实例,此时出现异常 libgcc_s.so must be insta lled for pthread_cancel to work ,实例进程退出。
3. 异常处理
-
通过ldd查看程序的依赖包,发现并没有缺失,问题指向了系统的lib包。
-
相同的数据文件在低版本数据库中可以正常运行,高版本就有异常信息。技术人员评估可能与gcc版本有关,挂载系统版本镜像进行gcc升级 yum -y install gcc gcc-c++;
-
重新启动实例后,不再报libgcc_s.so错误,然而启动实例依然失败,在错误日志中显示如下信息:
-- 检查完dbwr文件后的
[Note] [MY-013086] [InnoDB] Starting to parse redo log at lsn=225550883, whereas checkpoint_lsn=225551
[Node] [MY-012547] [InnoDB] Log scan progressed past the checkpoint LSN 225550883
[Node] [MY-012551] [InnoDB] Database was not shutdown normally!
[Node] [MY-012552] [InnoDB] Starting crash recovery.
[ERROR] [MY-012519] [InnoDB] ########## CORRUPT LOG RECORD FOUND ##########
[Node] [MY-012520] [InnoDB] Logrecord type 0, page 0:0. Log parsing proceeded successfully up to 22555
[Node] [MY-012521] [InnoDB] Hex dump starting 100 bytes before and ending 100 bytes after the corrupte
[Node] [MY-012522] [InnoDB] Set innodb_force_recovery to ignore this error
-- 实例退出
从日志中发现,实例启动期间进行了redo恢复。实际上,关闭数据库实例时,设置了 innodb_fast_shutdown=0,不应出现redo恢复的过程。
另外一台服务器上也进行了gcc/gcc-c++升级,启动第二个计算节点。它与第一个节点实例是副本关系,数据完全一致,该实例可以正常启动,启动日志如下所示:
[Node] [MY-012529] [InnoDB] Redo log format is v4. The redo log was created before MySQL 8.0.30.
[Node] [MY-012557] [InnoDB] Redo log is from an earlier version, v4.
[Node] [MY-012532] [InnoDB] Applying a batch of 0 redo log records ...
[Node] [MY-012535] [InnoDB] Applying batch completed!
[Node] [MY-013888] [InnoDB] Upgrading redo log: 0M, LSN=284965900.
[System] [MY-013577] [InnoDB] InnoDB initialization has ended.
[System] [MY-011090] [Server] Data dictionary upgrading from version '80025' to '80025'.
[Node] [MY-013327] [Server] MySQL server upgrading from version '80025' to '80032'.
[Node] [MY-012357] [InnoDB] Reading DD tablespace files
[Node] [MY-012356] [InnoDB] Scanned 38 tablespaes. Validated 38.
[System] [MY-013413] [Server] Data dictionary upgrading from version '80025' to '80025' completed.
[Node] [MY-013327] [Server] MySQL server upgrading from version '80025' to '80032'.
[Node] [MY-010006] [Server] Using data dictionary with version '8025'.
[System] [MY-013381] [Server] Server upgradd from '80025' to '80032' started.
[System] [MY-013381] [Server] Server upgradd from '80025' to '80032' completed.
第三台服务器上未进行gcc/gcc-c++升级,启动报错情况和第一台相同,升级后依然会进行redo恢复异常的操作。
从测试可以看出,新版本需对gcc/gcc-c++进行升级才能启动实例。未升级的前提下启动实例,会导致redo识别异常,后续升级也无法识别到正常的redo内容。
所有服务器都升级了gcc/gcc-c++后,所有实例启动正常,两个异常的计算节点通过备份数据实现了恢复。
02 新的问题出现了
1. 新问题的暴露:
某天深夜22点,客户突然打来电话,说白天升级的数据库集群存在问题:C#程序无法连接到集群, 而升级前是正常连接的。由于场地限制,晚上无法连接到客户的集群环境,于是技术团队通过电话沟通现场情况并进行技术指导。
半小时后,经过细致的排查指导,客户在测试后发现:去掉连接串中的OldGuids=true就能正常连接到数据库,但是写入的汉字全部是乱码。
2. 问题分析:
-
升级前后配置文件未发生变化。通过查询performance_schema.variables_by_thread,确认所有session的字符集都是utf8mb4,和表中字符集一致,因此乱码现象排除字符集原因;
-
查看connector-net的release note,发现MySQL 8.0.33中有修复MySQL.Data.MySqlClient.MySqlConnection相关bug。
3. 问题解决方法:
有两种方法均可解决上述问题:
-
方法1:确认客户的C#驱动版本为MySQL 6.9.8,需升级驱动到MySQL 8.0.32,数据库中连接串可以添加 OldGuids=true,然后数据库连接正常,汉字写入正常;
-
方法2:不升级C#驱动,将vscode工具升级到2013以上版本,数据库中连接串可以添加 OldGuids=true,之后数据库连接正常,汉字写入正常。
03 后续操作指南
经过数据库集群层面的复盘梳理,发现版本升级操作虽然在常规流程上没发现问题,但由于实际环境的差异性,仍可能会出现预料之外的情况。未来数据库升级过程中,有2点值得大家重点关注:
1、关注驱动同步升级
尽管在测试环境中,做了详尽测试并顺利完成所有步骤。但实际生产环境升级仍可能需要执行驱动同步升级这一操作。数据库部署环境中,如果只对Java程序进行验证,而忽略Java驱动程序升级,会遗漏实际生产环境中使用的C#程序。这个问题在测试阶段不会被识别异常,但实际生产环境中会出问题;
规避措施:升级流程必须包含对驱动程序兼容性的全面评估,并且在发现版本不匹配时,立即进行同步升级。
2、升级前备份的必要性
生产环境中,可能会遭遇因libgcc_s.so版本过低导致的undo文件损坏问题。如果事先没有进行备份,将可能导致数据无法完全恢复,造成严重的生产事故。因此,系统升级前进行数据备份,至关重要。
规避措施:必须始终确保在数据库升级前执行全面的数据备份,不仅能保护业务系统的数据安全,还能在出现问题时迅速恢复系统,减少潜在损失。
相关文章:

项目纪实 | 版本升级操作get!GreatDB分布式升级过程详解
某客户项目现场,因其业务系统要用到数据库新版本中的功能特性,因此考虑升级现有数据库版本。在升级之前,万里数据库项目团队帮助客户在本地测试环境构造了相同的基础版本,导入部分生产数据,尽量复刻生产环境进行升级&a…...
富格林:应用正规技巧阻挠被骗
富格林悉知,随着如今入市现货黄金的朋友愈来愈多,不少投资者也慢慢开始重视起提高自身的正规投资技巧,希望能阻挠被骗更高效地在市场上获利。虽然目前黄金市场存在一定的受害风险,但只要投资者严格按照正规的交易规则来做单&#…...

【模型架构】学习RNN、LSTM、TextCNN和Transformer以及PyTorch代码实现
一、前言 在自然语言处理(NLP)领域,模型架构的不断发展极大地推动了技术的进步。从早期的循环神经网络(RNN)到长短期记忆网络(LSTM)、Transformer再到当下火热的Mamba(放在下一节&a…...

【LeetCode】38.外观数列
外观数列 题目描述: 「外观数列」是一个数位字符串序列,由递归公式定义: countAndSay(1) "1"countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。 行程长度编码(RLE)是一种字符串压缩方法,…...
如何解决Ubuntu中软件包安装时的404错误(无法安装gdb、cgddb等)
目录 问题描述 解决方法 1. 更新软件包列表 2. 使用--fix-missing选项 3. 更换软件源 4. 清理和修复包管理器 总结 在使用Ubuntu进行软件包安装时,有时可能会遇到404错误。这种错误通常是由于软件源中的某些包已经被移除或迁移到其他位置。本文将介绍几种解决…...

SpringBoot中MyBatisPlus的使用
MyBatis Plus 是 MyBatis 的增强工具,提供了许多强大的功能,简化了 MyBatis 的使用。下面是在 Spring Boot 中使用 MyBatis Plus 的步骤: 添加依赖:在 Maven 或 Gradle 的配置文件中添加 MyBatis Plus 的依赖。 配置数据源&#…...
前后端交互:axios 和 json;springboot 和 vue
vue 准备的 <template><div><button click"sendData">发送数据</button><button click"getData">接收</button><button click"refresh">刷新</button><br><ul v-if"questions&…...
前端技术专家岗(虚拟岗)
定位: 团队技术负责人、技术领导者;确保框架、工具的低门槛、高性能、可扩展; 素质要求: 具备架构设计能力;一个或者多个领域的技术专家;较为丰富的基础建设经验;项目管理能力、任务分解、协…...

redis windows环境下的部署安装
2024Redis windows安装、部署与环境变量 一、下载 Redis官网目前暂不支持Windows版本,只能从github中下载。 windows 64位系统下载redis路径:https://github.com/tporadowski/redis/releases,下载zip包。 目前Windows版本只更新到5.0的版本…...

大字体学生出勤记录系统网页HTML源码
源码介绍 上课需要一个个点名记录出勤情况,就借助AI制作了一个网页版学生出勤记录系统, 大字体显示学生姓名和照片,让坐在最后排学生也能看清楚,显示姓名同时会语音播报姓名, 操作很简单,先导入学生姓名…...
筛斗数据提取技术在企业成本预测中的应用
在当今的商业环境中,准确的成本预测对于企业的财务健康和战略规划至关重要。随着大数据和人工智能技术的飞速发展,数据提取技术已经成为企业进行成本预测的强大工具。本文将探讨数据提取技术如何帮助企业进行成本预测,并分析其对企业决策过程…...
enum编程入门:探索枚举类型的奥秘
enum编程入门:探索枚举类型的奥秘 在编程的世界里,enum(枚举)类型是一种特殊的数据类型,它允许我们为变量设置一组预定义的、有限的值。这种类型在很多编程语言中都得到了广泛的应用,为开发者提供了更加清…...

刷机 iPhone 进入恢复模式
文章目录 第 1 步:确保你有一台电脑(Mac 或 PC)第 2 步:将 iPhone 关机第 3 步:将 iPhone 置于恢复模式第 4 步:使用 Mac 或 PC 恢复 iPhone需要更多协助? 本文转载自:如果你忘记了 …...
计算属性和侦听器:为什么在某些情况下使用计算属性比使用methods更好,如何使用侦听器来监听数据的变化。
计算属性和methods的区别和使用场景 计算属性(Computed properties)是 Vue 中非常重要的一个功能,它有以下的优点: 数据缓存:计算属性基于它们的依赖进行缓存。只有在相关依赖发生变化时,才会重新求值。这…...
一文带你搞懂大事务的前因后果
引言 一文带你搞懂Spring事务上篇文章介绍了Spring事务相关内容,本文主要介绍业务开发中遇到的大事务问题。 https://github.com/WeiXiao-Hyy/blog 整理了Java,K8s,极客时间,设计模式等内容,欢迎Star! 什么是大事务 运行时间(调用远程事务或…...

关系数据库:关系运算
文章目录 关系运算并(Union)差(Difference)交(Intersection)笛卡尔积(Extended Cartesian Product)投影(projection)选择(Selection)除…...

微信公众号开发(三):自动回复“你好”
上一篇做了服务器校验,但没有处理用户发来的消息,为了完成自动回复的功能,需要增加一些功能: 1、调整服务器校验函数: def verify_wechat(request):tokentokendatarequest.argssignaturedata.get(signature)timestamp…...

docker基本操作命令(3)
目录 1.Docker服务管理命令: 启动:systemctl start docker 停止:systemctl stop docker 重启:systemctl restart docker 开机自启:systemctl enable docker 查看docker版本: 2.镜像常用管理命令&…...
003 MySQL
文章目录 左外连接、右外连接 的区别where/having的区别执行顺序聚合 聚合函数MySQL约束事务一致性一致性的含义一致性在事务中的作用如何维护一致性 存储引擎 Innodb MyIsam区别事务的ACID属性数据库的隔离级别MySQL中的并发问题1. 锁等待和死锁2. 并发冲突3. 脏读、不可重复读…...
数据分析------统计学知识点(一)
1.在统计学中,均值分类有哪些? 算术均值:平均值,所有数值加总后除以数值的个数 几何均值:所有数值相乘后,再取其n次方根,n是数值的个数 调和均值:是数值倒数的算术均值的倒数 加…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...