项目纪实 | 版本升级操作get!GreatDB分布式升级过程详解

news2025/1/11 22:42:18

某客户项目现场,因其业务系统要用到数据库新版本中的功能特性,因此考虑升级现有数据库版本。在升级之前,万里数据库项目团队帮助客户在本地测试环境构造了相同的基础版本,导入部分生产数据,尽量复刻生产环境进行升级,显示测试升级正常。

之后,将万里安全数据库分布式 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文件损坏问题。如果事先没有进行备份,将可能导致数据无法完全恢复,造成严重的生产事故。因此,系统升级前进行数据备份,至关重要

规避措施:必须始终确保在数据库升级前执行全面的数据备份,不仅能保护业务系统的数据安全,还能在出现问题时迅速恢复系统,减少潜在损失。

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

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

相关文章

机器学习笔记(1):sklearn是个啥?

sklearn 简介 Sklearn是一个基于Python语言的开源机器学习库。全称Scikit-Learn,是建立在诸如NumPy、SciPy和matplotlib等其他Python库之上,为用户提供了一系列高质量的机器学习算法,其典型特点有: 简单有效的工具进行预测数据分…

GEYA格亚GRT8-S1S2间歇性双时间循环继电器时间可调交流220V 24v

品牌 GEYA 型号 GRT8-S2 AC/DC12-240V 产地 中国大陆 颜色分类 GRT8-S1 A220,GRT8-S1 AC/DC12-240V,GRT8-S2 A220,GRT8-S2 AC/DC12-240V GRT8-S,循环延时,时间继电器:LED指示灯,触头容量大,电压超宽&#xff0…

构建树结构的几种方式

表结构 CREATE TABLE sys_dept (dept_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ID,pid bigint(20) DEFAULT NULL COMMENT 上级部门,sub_count int(5) DEFAULT 0 COMMENT 子部门数目,name varchar(255) NOT NULL COMMENT 名称,dept_sort int(5) DEFAULT 999 COMMENT 排…

【C#】类和对象的区别

1.区别概述 结构体和类的最大区别是在存储空间上,前者是值类型,后者是引用类型,它们在赋值上有很大的区别,在类中指向同一块空间的两个类的值会随一个类的改变而改变另一个,请看如下代码所示: namespace …

020.有效的括号,用栈来解决的 Java 版 LeetCode 刷题笔记

题意 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型…

FreeRTOS【12】队列集使用

1.开发背景 基于以上的章节,了解了 FreeRTOS 多线程间的信号量、队列的使用,已经满足了日常使用场景。这个篇章要介绍的是队列集,实际上队列的升级版,存储信号量和队列等的触发事件。 队列集在实际的开发项目中应用相对比较少&…

linux同步搭建多台服务器

前言: 如果在安装服务器的过程中,需要安装多台服务器,同样的配置,同样的步骤就可以使用此方法,搭建集群同步安装 1.配置网卡 想要两台机器进行同步的话,必须网段是同样的,保持在同一网段并且能…

科技智慧园区解决方案

随着科技创新的推动和城市化进程的加速,城市面临着诸多挑战和机遇。如何提升城市的竞争力和可持续性,是一个亟待解决的问题。在这个背景下,科技智慧园区作为一种新型的城市发展模式,引起了越来越多的关注和探索。 什么是科技智慧园…

Jmeter的线程组之间传递参数

使用jemter做接口测试,有时候需要会遇到不同线程组之间调用相同变量的情况,最多见的就是token的传递,网上有很多处理方法,这里只记录setProperty的办法,一招鲜走遍天! 首先我有两个线程组: 线程…

Servlet搭建博客系统

现在我们可以使用Servlet来搭建一个动态(前后端可以交互)的博客系统了(使用Hexo只能实现一个纯静态的网页,即只能在后台自己上传博客)。有一种"多年媳妇熬成婆"的感觉。 一、准备工作 首先创建好项目,引入相关依赖。具体过程在"Servlet的创建"中介绍了。…

WiFi蓝牙模块促进传统零售数字化转型:智能零售体验再升级

随着科技的不断发展,数字化转型已经成为了各行各业的必然趋势。在传统零售业中,WiFi蓝牙模块的应用正逐渐推动着行业的数字化转型,为消费者带来更加智能化、便捷化的零售体验。本文MesoonRF美迅物联网将从以下几个方面阐述WiFi蓝牙模块在传统…

Claude 3可使用第三方API,实现业务流程自动化

5月31日,著名大模型平台Anthropic宣布,Claude3模型可以使用第三方API和工具。 这也就是说,用户通过文本提问的方式就能让Claude自动执行多种任务,例如,从发票中自动提取姓名、日期、金额等,该功能对于开发…

GCN 代码解析(一) for pytorch

Graph Convolutional Networks 代码详解 前言一、数据集介绍二、文件整体架构三、GCN代码详解3.1 utils 模块3.2 layers 模块3.3 models 模块3.4 模型的训练代码 总结 前言 在前文中,已经对图卷积神经网络(Graph Convolutional Neural Networks, GCN&am…

linux nohup命令详解:持久运行命令,无视终端退出

nohup (全称为 “no hang up”),用于运行一个命令,使其在你退出 shell 或终端会话后继续运行。 基本语法 nohup command [arg1 ...] [&> output_file] &command 是你想要运行的命令。[arg1 ...] 是该命令的参数。&am…

STM32-14-FSMC_LCD

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU 文章目录 1. 显示器分类2. LCD简…

【稳定检索/投稿优惠】2024年语言、文化与艺术发展国际会议(LCAD 2024)

2024 International Conference on Language, Culture, and Art Development 2024年语言、文化与艺术发展国际会议 【会议信息】 会议简称:LCAD 2024大会时间:2024-08-10截稿时间:2024-07-27(以官网为准)大会地点:中国…

【数学不建模】赛程安排

你所在的年级有5个班,每班一支球队在同一块场地上进行单循环赛, 共要进行10场比赛. 如何安排赛程使对各队来说都尽量公平呢. 下面是随便安排的一个赛程: 记5支球队为A, B, C, D, E,在下表左半部分的右上三角的10个空格中, 随手填上1,2,10, 就得到一个赛程…

新书推荐:9.5堆栈图解析生命周期

本节必须掌握的知识点: 掌握局部变量、全局变量存放在哪 熟练画堆栈图 掌握每个函数从哪开始被调用的,从哪结束的 开始看本节前,请读者思考如下几问题: 局部变量存放在哪里?全局变量存放在哪里?编译器是怎…

FPGA新起点V1开发板(七-语法篇)——程序框架+高级语法(选择性做笔记)

文章目录 一、模块结构二、赋值三、条件语句 一、模块结构 默认是wire类型&#xff0c;assign是定义功能。 上面这两个always都是并行 例化 二、赋值 有两种赋值“”和“<” “”是阻塞赋值&#xff0c;也就是从上到下&#xff0c;依次完成 “”是非阻塞赋值&#xff0c;…

uniapp实现图片上传——支持APP、微信小程序

uniapp实现图片、视频上传 文章目录 uniapp实现图片、视频上传效果图组件templatejs 使用 相关文档&#xff1a; 结合 uView 插件 uni.uploadFile 实现 u-upload uploadfile 效果图 组件 简单封装&#xff0c;还有很多属性…&#xff0c;自定义样式等…根据个人所需调整 te…