当前位置: 首页 > news >正文

项目纪实 | 版本升级操作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++后,所有实例启动正常,两个异常的计算节点通过备份数据实现了恢复。

0新的问题出现了

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,之后数据库连接正常,汉字写入正常。

0后续操作指南

经过数据库集群层面的复盘梳理,发现版本升级操作虽然在常规流程上没发现问题,但由于实际环境的差异性,仍可能会出现预料之外的情况。未来数据库升级过程中,有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)是一种字符串压缩方法&#xff0c…...

如何解决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&…...

前端技术专家岗(虚拟岗)

定位&#xff1a; 团队技术负责人、技术领导者&#xff1b;确保框架、工具的低门槛、高性能、可扩展&#xff1b; 素质要求&#xff1a; 具备架构设计能力&#xff1b;一个或者多个领域的技术专家&#xff1b;较为丰富的基础建设经验&#xff1b;项目管理能力、任务分解、协…...

redis windows环境下的部署安装

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

大字体学生出勤记录系统网页HTML源码

源码介绍 上课需要一个个点名记录出勤情况&#xff0c;就借助AI制作了一个网页版学生出勤记录系统&#xff0c; 大字体显示学生姓名和照片&#xff0c;让坐在最后排学生也能看清楚&#xff0c;显示姓名同时会语音播报姓名&#xff0c; 操作很简单&#xff0c;先导入学生姓名…...

筛斗数据提取技术在企业成本预测中的应用

在当今的商业环境中&#xff0c;准确的成本预测对于企业的财务健康和战略规划至关重要。随着大数据和人工智能技术的飞速发展&#xff0c;数据提取技术已经成为企业进行成本预测的强大工具。本文将探讨数据提取技术如何帮助企业进行成本预测&#xff0c;并分析其对企业决策过程…...

enum编程入门:探索枚举类型的奥秘

enum编程入门&#xff1a;探索枚举类型的奥秘 在编程的世界里&#xff0c;enum&#xff08;枚举&#xff09;类型是一种特殊的数据类型&#xff0c;它允许我们为变量设置一组预定义的、有限的值。这种类型在很多编程语言中都得到了广泛的应用&#xff0c;为开发者提供了更加清…...

刷机 iPhone 进入恢复模式

文章目录 第 1 步&#xff1a;确保你有一台电脑&#xff08;Mac 或 PC&#xff09;第 2 步&#xff1a;将 iPhone 关机第 3 步&#xff1a;将 iPhone 置于恢复模式第 4 步&#xff1a;使用 Mac 或 PC 恢复 iPhone需要更多协助&#xff1f; 本文转载自&#xff1a;如果你忘记了 …...

计算属性和侦听器:为什么在某些情况下使用计算属性比使用methods更好,如何使用侦听器来监听数据的变化。

计算属性和methods的区别和使用场景 计算属性&#xff08;Computed properties&#xff09;是 Vue 中非常重要的一个功能&#xff0c;它有以下的优点&#xff1a; 数据缓存&#xff1a;计算属性基于它们的依赖进行缓存。只有在相关依赖发生变化时&#xff0c;才会重新求值。这…...

一文带你搞懂大事务的前因后果

引言 一文带你搞懂Spring事务上篇文章介绍了Spring事务相关内容&#xff0c;本文主要介绍业务开发中遇到的大事务问题。 https://github.com/WeiXiao-Hyy/blog 整理了Java,K8s,极客时间,设计模式等内容&#xff0c;欢迎Star! 什么是大事务 运行时间&#xff08;调用远程事务或…...

关系数据库:关系运算

文章目录 关系运算并&#xff08;Union&#xff09;差&#xff08;Difference&#xff09;交&#xff08;Intersection&#xff09;笛卡尔积&#xff08;Extended Cartesian Product&#xff09;投影&#xff08;projection&#xff09;选择&#xff08;Selection&#xff09;除…...

微信公众号开发(三):自动回复“你好”

上一篇做了服务器校验&#xff0c;但没有处理用户发来的消息&#xff0c;为了完成自动回复的功能&#xff0c;需要增加一些功能&#xff1a; 1、调整服务器校验函数&#xff1a; def verify_wechat(request):tokentokendatarequest.argssignaturedata.get(signature)timestamp…...

docker基本操作命令(3)

目录 1.Docker服务管理命令&#xff1a; 启动&#xff1a;systemctl start docker 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 开机自启&#xff1a;systemctl enable docker 查看docker版本&#xff1a; 2.镜像常用管理命令&…...

003 MySQL

文章目录 左外连接、右外连接 的区别where/having的区别执行顺序聚合 聚合函数MySQL约束事务一致性一致性的含义一致性在事务中的作用如何维护一致性 存储引擎 Innodb MyIsam区别事务的ACID属性数据库的隔离级别MySQL中的并发问题1. 锁等待和死锁2. 并发冲突3. 脏读、不可重复读…...

数据分析------统计学知识点(一)

1.在统计学中&#xff0c;均值分类有哪些&#xff1f; 算术均值&#xff1a;平均值&#xff0c;所有数值加总后除以数值的个数 几何均值&#xff1a;所有数值相乘后&#xff0c;再取其n次方根&#xff0c;n是数值的个数 调和均值&#xff1a;是数值倒数的算术均值的倒数 加…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...