项目纪实 | 版本升级操作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文件损坏问题。如果事先没有进行备份,将可能导致数据无法完全恢复,造成严重的生产事故。因此,系统升级前进行数据备份,至关重要

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NVM】nvm常用命令,切换node版本命令

nvm常用的命令,切换node版本命令 nvm 查看支持安装的node版本 nvm list available nvm安装指定版本node nvm install 版本号 例如:nvm install 10.24.1 nvm查看本机安装所有node版本 nvm list nvm切换node版本 nvm use 10.24.1 检测当前node版本 node -…

玄机平台应急响应—Linux日志分析

1、前言 啥是日志呢,日志就是字面意思,用来记录你干了啥事情。日志大体可以分为网站日志和系统日志,网站日志呢就是记录哪个用户在哪里什么时候干了啥事,以及其它的与网站相关的事情。系统日志呢,就是记录你的电脑系统…

动态分配函数参数用二级指针的作用

文章目录 前言一、案例 前言 在一些情况下,我们需要在函数内部动态地分配内存来存储结构体,并且需要在函数外部访问该结构体。在这种情况下,可以使用二级指针作为函数参数来实现动态内存分配,并且在函数外部使用指针访问结构体。…

12V转19V4A升压恒压WT3207

12V转19V4A升压恒压WT3207 WT3207是款高效的PWM升压控制器,采用SO-8封装设计。该控制器经过优化以适应低输入电压应用,具有从5V至36V的广泛输入电压范围,适用于需要提高12V、15V和19V系统电压的场合,特别是对于两节或三节锂离子电…

Apache Doris 基础 -- 数据表设计(数据模型)

Versions: 2.1 1、模型概览 本主题从逻辑角度介绍了Doris中的数据模型,以便您可以在不同的业务场景中更好地使用Doris。 基本概念 本文主要从逻辑的角度描述Doris的数据模型,旨在帮助用户在不同的场景更好地利用Doris。 在Doris中,数据在…

GEE 10m近实时 LULC 数据集Dynamic World

Google Earth Engine 和 Dynamic World Google 利用其地球引擎(Earth Engine)和人工智能(AI)平台技术,推出了 Dynamic World 数据库,能够提供接近实时的全球土地环境数据。Dynamic World 是基于 Google Ear…

【Gradle】Gradle的本地安装和使用

目录 1、Gradle 的安装 2、集成 IntelliJ IDEA 3、使用 Gradle Gradle 完全兼容 Maven 和 Ivy 仓库,你可以从中检索依赖也可以发布你的文件到仓库中,Gradle 提供转换器能把 Maven 的构建逻辑转换成 Gradle 的构建脚本。 1、Gradle 的安装 Gradle 的…

卷积网络迁移学习:实现思想与TensorFlow实践

摘要:迁移学习是一种利用已有知识来改善新任务学习性能的方法。 在深度学习中,迁移学习通过迁移卷积网络(CNN)的预训练权重,实现了在新领域或任务上的高效学习。 下面我将详细介绍迁移学习的概念、实现思想&#xff0c…

【Qt】Qt界面美化指南:深入理解QSS样式表的应用与实践

文章目录 前言:1. 背景介绍2. 基本语法3. QSS 设置方式3.1. 设置全局样式3.2. 从文件加载样式表3.3. 使用 Qt Designer 编辑样式 总结: 前言: 在当今这个视觉至上的时代,用户界面(UI)的设计对于任何软件产…

嵌入式Linux复制剪切删除指令详解

指令操作 1. cp 复制指令 a. 用法:cp [ 选项 ] [ 源文件或目录 ] [ 目标文件或目录 ]; b. 用途:用于复制文件或目录; c. 通常情况下,复制的都不是空文件夹,所以直接使用 cp 复制空文件会失败&#xff0…

[ROS 系列学习教程] 建模与仿真 - Xacro 语法

ROS 系列学习教程(总目录) 本文目录 一、属性与属性块二、数学表达式三、宏3.1 宏的基本使用3.2 属性块做为宏的入参3.3 任意数量元素做为宏的入参3.4 指定多个块元素的处理顺序3.5 宏嵌套3.6 默认参数3.7 局部属性 四、Rospack 命令五、包含其他 xacro 文件六、条件语句七、YA…

C#中接口的显式实现与隐式实现及其相关应用案例

C#中接口的显式实现与隐式实现 最近在学习演化一款游戏项目框架时候,框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行“密封”,增加实现接口的类访问方法的“成本”。 接口的显式实现和隐式实现: 先定义一个接口,接口…

KotlinConf 2024:深入了解Kotlin Multiplatform (KMP)

KotlinConf 2024:深入了解Kotlin Multiplatform (KMP) 在近期的Google I/O大会上,我们推荐了Kotlin Multiplatform (KMP)用于跨移动、网页、服务器和桌面平台共享业务逻辑,并在Google Workspace中采用了KMP。紧接着,KotlinConf 2…

豆包浏览器插件会造成code标签内容无法正常显示

启用状态:页面的代码会显示不正常 禁用后,正常显示 害得我重置浏览器设置,一个个测试

CentOS7.9部署安装OpenGauss 5.0.2企业版

1、更新系统: yum update -y 2、更改主机名: hostnamectl set-hostname opendb01 3、关闭透明页: echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag# 加入开机自启动 echo …

微信小程序使用echarts

思路 五个tab公用一个柱状图组件切换tab以及切换时间改变数据,传入子组件,子组件监听数据重新更新点击柱状图显示具体数值每个时间点有两个柱子(高压和低压),柱状图显示高压的最大值到最小值的范围除了血压其余只有一…

【Epoch,Batch,Iteration】深度学习模型训练相关基础概念光速理解!

🔥模型训练相关基础概念! Epoch: 一次 epoch 代表整个训练数据集已经被完整地送入神经网络进行了一轮训练。通常,模型需要多次 epoch 才能充分学习数据集中的模式。Batch: 由于数据集可能过大,无法一次性全部加载到内存中进行训练…

【前端】Mac安装node14教程

在macOS上安装Node.js版本14.x的步骤如下: 打开终端。 使用Node Version Manager (nvm)安装Node.js。如果你还没有安装nvm,可以使用以下命令安装: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 然后关…

LAMP分布式安全方案搭建网页 (LinuxCentOS7+Apache+Mariadb+PHP)包括服务端口及防火墙规则配置

目录 一、实验目的 二、设计方案及规划 三、实验内容及步骤 (1)实验前基础配置 (2)Test配置,安装Firefox浏览器和图形界面 (3)Web安装Apache (4)Database安装Mari…

2.4 Docker部署JDK

2.4 Docker部署JDK jdk17部署(自定义镜像) 1.在官网上下载jdk-17_linux-x64_bin.tar.gz,并安装到/usr/local目录下 cd /usr/local2.创建Dockerfile vim Dockerfile# 基于官方的Ubuntu 20.04镜像作为基础镜像 FROM ubuntu:20.04# 设置环境…