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

MySQL数据库升级的一些坑

这是学习笔记的第 2257 篇文章

读完需要

9

分钟

速读仅需7分钟

对于商业数据库而言,数据库升级是一个优先级很高的事情,有版本升级路线图,有相应的补丁,而且对于方案还有一系列的演练,陷入是一场硬仗。而在MySQL方向上,升级这件事情就被淡化了许多,好像只能证明它的存在而已,当然正是由于这种不重视,也让我今天走了不少弯路。

一般来说,升级MySQL有两类可行方案,一类是直接升级数据字典,在本机完成,整个过程会有离线操作,会对业务有中断,第二种是通过高可用切换平滑实现,原理是搭建低版本到高版本的数据复制关系,这种方案优势比较明显,对于业务的侵入性最低,而且还可以提前验证,更甚还可以做到平滑回退,当然第二种方案要做很多前期的准备工作。

今天处理的一套环境基于存储和时长等因素使用的是第一种方法,整个流程如下:

1) mysqldump备份数据库,备份文件大约为120G

2) 停止MySQL 5.5数据库

3) 修改数据库端口重新启动数据库,比如从4308调整正为4318,使得迁移过程中避免其他业务连接的影响,验证无误后停库 

4)修改mysql_base路径为5.7版本,修改/usr/bin/mysql等环境变量配置

5)替换配置文件为5.7版本,在5.7模式下启动数据库

6)使用upgrade模式升级数据字典,命令如下:

mysql_upgrade --socket=/data/mysql_4306/tmp/mysql.sock --port=4308 -uroot -pxxxx

7) 检查复核

整个过程看上去还OK,实际操作的时候漏洞百出。

1) mysqldump备份数据库,备份文件大约为120G,为了快速在线备份采用mysqldump,但是异常情况下的恢复效率是硬伤,所以此处不建议使用mysqldump备份,而是建议使用物理备份,甚至如果条件允许,直接使用冷备模式

2) 停止MySQL 5.5数据库

3) 修改数据库端口重新启动数据库,比如从4308调整正为4318,使得迁移过程中避免其他业务连接的影响,验证无误后停库 

4)修改mysql_base路径为5.7版本,修改/usr/bin/mysql等环境变量配置

5)替换配置文件为5.7版本,在5.7模式下启动数据库这里没有注意ibdata的配置,运气不好,碰上了一个奇葩配置,如下:

innodb_data_file_path = ibdata1:1000M;ibdata2:100M:autoextend

而原本的规范配置都是一个ibdata文件,如下:

innodb_data_file_path = ibdata1:1G:autoextend,

导致数据库启动时报错,提示ibdata文件已经被损坏了。

6)使用upgrade模式升级数据字典,命令如下:

mysql_upgrade --socket=/data/mysql_4306/tmp/mysql.sock --port=4308 -uroot -pxxxx

upgrade这个命令的实现提示不够友好,抛出了一大堆的错误,但是最后竟然安慰我说,升级成功。问题到了这个阶段的时候,其实已经比较难收场了,因为数据字典文件损坏,导致升级数据字典的操作完全不可能,现在数据库连里面的表都desc不出来了

7) 检查复核,本来轻轻松松收工的验证工作现在变成了紧急修复工作。

后续的第一波补救措施如下:

8)使用已有的凌晨固定的物理备份恢复数据,大约为1个小时,mysqldump恢复果断放弃,印象中至少得6个小时以上。

9)使用物理备份模式备份当前数据库

10)重新升级数据库,尤其注意ibdata的配置,如果升级失败则使用物理备份快速回退

11)升级过程再次受阻,这一次是sql_mode,系统数据字典升级成功,但是数据库的表检测中,主要因为sql_mode的数据格式校验,导致很多数据表的格式校验失败,需要执行类似 alter table test.xxxxx force这样的重构操作。

12)因为恢复过程中未知原因,InnoDB的redo log也受到一些影响,日志开始抛错,所以当前恢复的数据库就算升级字典成功,本身也有一些硬伤。

后续的第二波补救措施如下:

13)使用mysqldump备份当前数据库,仅仅备份指定的数据库,不使用all-databases选项,权限单独导出。

14)部署MySQL 5.7的实例,不同的端口,如4390端口

15)sql_mode和5.5版本通配,修改其他参数等

16)导入mysqldump数据至4390的5.7实例

17)建立主从复制关系

18)切换数据库端口,使5.7的新版本服务生效

整个过程也是一波多折,见招拆招,发现想走捷径,最后发现一个坑都没有拉下,而这也给了我深刻的教训,千万不能掉以轻心,不能带着试运气的态度处理问题。

QQ群号:763628645

QQ群二维码如下, 添加请注明:姓名+地区+职位,否则不予通过

订阅我的微信公众号“杨建荣的学习笔记”,第一时间免费收到文章更新。别忘了加星标,以免错过新推送提示。

   

近期热文

你可能也会对以下话题感兴趣。点击链接就可以查看。

相关文章:

  • 如何做一个聪明的老人,如何让自己更幸福?我有4个小建议
  • 技术分享 | MySQL binlog 日志解析
  • 工作中的半成品
  • 基于Maxwell的MySQL数据传输服务整体设计
  • 迁移到MySQL的语法转换工具初步设计
  • MySQL空间报警后的一揽子解决方案
  • 超12万人申请北京积分落户,顺带分析了一波近年的数据
  • MySQL中insert阻塞问题的分析
  • MySQL数据延迟跳动的问题分析
  • 彻底取代Redis+数据库架构,京东618稳了!
  • 一个扭蛋的故事
  • 做一次完美的数据迁移
  • 招贤纳士-第16期,来自北京和成都的职位
  • MySQL安装部署,从半成品状态的改进
  • 从SQL Server到TiDB的架构设计及对数据中台的思考
  • [笔记] php常见简单功能及函数
  • 「面试题」如何实现一个圣杯布局?
  • ES6之路之模块详解
  • JavaScript中的对象个人分享
  • Linux gpio口使用方法
  • React Native移动开发实战-3-实现页面间的数据传递
  • react-native 安卓真机环境搭建
  • tensorflow学习笔记3——MNIST应用篇
  • 从PHP迁移至Golang - 基础篇
  • 浮现式设计
  • - 概述 - 《设计模式(极简c++版)》
  • 聚簇索引和非聚簇索引
  • 两列自适应布局方案整理
  • 前端设计模式
  • 从如何停掉 Promise 链说起
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #、%和$符号在OGNL表达式中经常出现
  • #QT(智能家居界面-界面切换)
  • (1)Android开发优化---------UI优化
  • (20050108)又读《平凡的世界》
  • (3)(3.5) 遥测无线电区域条例
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)逆序输出字符串
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (十一)c52学习之旅-动态数码管
  • (转)程序员技术练级攻略
  • **PHP二维数组遍历时同时赋值
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .gitignore文件—git忽略文件
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net web项目 调用webService
  • .NET 分布式技术比较
  • .NET 回调、接口回调、 委托
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net多线程总结
  • .NET学习全景图
  • @html.ActionLink的几种参数格式