MySQL数据库升级的一些"陷阱"

对于商业数据库而言,数据库升级是一个优先级很高的事情,有版本升级路线图,有相应的补丁,而且对于方案还有一系列的演练,显然是一场硬仗。而在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的新版本服务生效

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

以上就是MySQL数据库升级的一些"陷阱"的详细内容,更多关于MySQL数据库升级的资料请关注我们其它相关文章!

(0)

相关推荐

  • Docker版的MySQL5.7升级到MySQL8.0.13,数据迁移

    1.备份旧的MySQL5.7的数据 记得首先要备份旧的数据,防止升级失败导致数据丢失.备份的方式有两种,一种是在宿主机直接执行导出命令,另外一种是先进入Docker环境下进行操作.主要的导出命令如下: #方式一,直接在宿主机器进行数据备份 # 0df568 是docker的id ;-uroot -p123456 是用户名和密码;dbA dbB是要备份的数据,--databases 后面可以接多个数据库名,导出的sql到/root/all-databases3306.sql docker exec

  • phpStudy中升级MySQL版本到5.7.17的方法步骤

    前言 今天在工作发现一个错误,在往本地导数据表的时候老是报错: [Err] 1294 - Invalid ON UPDATE clause for '字段名' column 报错的数据表字段: `字段名` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP 同事说同一个 sql 文件他可以导成功.猜可能是数据库版本的问题,同事的是 5.6,我查了下本地的数据库版本是 5.5.53.网上查了一下,果然是版本的问题,5.5 和 5.6 在 TIMEST

  • phpstudy2018升级MySQL5.5为5.7教程(图文)

    一.MySQL官网下载MySQL5.7版本,我这里下载的是MySQL5.7.24. 二.直接到D:phpStudyPHPTutorial目录下删除之前的MySQL版本,把下载好的MySQL5.7.24版本解压并修改为MySQL,然后在MySQL目录下新建my.ini文件并加入如下内容: [mysqld] port=3306 basedir="D:/phpStudy/PHPTutorial/MySQL/" datadir="D:/phpStudy/PHPTutorial/MyS

  • MySQL 5.7.30 安装与升级问题详细教程

    楔子 由于之前电脑上安装的MySQL版本是比较老的了,大概是5.1的版本,不支持JSON字段功能.而最新开发部门开发的的编辑器产品,使用到了JSON字段的功能. 因此需要升级MySQL版本,升级的目标版本是MySQL 5.7.30(虽然最新版本已经到8.x,但是5.7基本够用了). 发现在升级安装过程中,会有一些坑,所以使用本文记录一下. 卸载老版本 首先需要卸载老的版本,卸载其实也挺简单,只需要移除MySQL服务即可,首先打开CMD,然后cd到MySQL的bin目录,然后输入下面的命令移除My

  • Windows(x86,64bit)升级MySQL 5.7.17免安装版的详细教程

    MySQL需要升级到5.5.3以上版本才支持Laravel 5.4默认的utf8mb64字符编码.因此就把MySQL升级了一下,期间还是遇到些小问题,记录一下以供参考. 升级准备 备份之前MySql目录下的data目录(数据库目录). MySql官网下载MySQL 5.7.17版本压缩包. 管理员身份运行命令行,输入net stop mysql命令,停止mysql服务. 输入sc delete mysql命令,删除mysql服务. 卸载当前版本MySQL. 开始升级 解压MySQL 5.7.17

  • CentOS 7中升级MySQL 5.7.23的坑与解决方法

    前言 最近发现CentOS 7下升级MySQL5.7.23的一个坑,以前面升级到MySQL 5.7.23的一个集群为例 在我们环境下打开文件描述符个数的参数open_files_limit在MySQL 5.6.21下都统一配置为65535,而CentOS 7系统下安装MySQL5.7.23的open_files_limit参数的默认值为5000 否则像分区表数量较多的集群,打开的文件个数过大时,数据库就会报错. 原因如下: 1.CentOS 7安装MySQL5.7.23,服务管理发生了变化,从s

  • Win下Mysql5.6升级到5.7的方法

    写在前面 MySQL的升级方式分为两种:原地升级和逻辑升级.这两种升级方式,本质没有什么区别的.只是在对数据文件的处理上有些区别而已.原地升级是直接将数据文件进行拷贝,而逻辑升级对数据文件的处理方式是通过逻辑导出导入,需要用到mysqldump. 逻辑升级大家都理解,这种方式在数据量比较大的情况下花费时间比较长.所以今天我们来讲讲原地升级. 原地升级 1.将现有的mysql关闭.使用cmd窗口,进入到mysql目录下面,将mysql服务移除. X:\Ares\bin\mysql5.6\bin>m

  • 升级到MySQL5.7后开发不得不注意的一些坑

    前言 前段时间,将线上MySQL数据库升级到了5.7.考虑到可能产生的不兼容性,在升级之前,确实也是战战兢兢,虽然测试环境,开发环境早在半年前就已提前升级. 基于前期的调研和朋友的反馈,与开发相关的主要有两点: sql_mode MySQL 5.6中,其默认值为"NO_ENGINE_SU BSTITUTION",可理解为非严格模式,譬如,对自增主键插入空字符串'',虽然提示warning,但并不影响自增主键的生成. 但在MySQL 5.7中,其就调整为了严格模式,对于上面这个,其不会提

  • 实战MySQL升级的最佳方法

    MySQL5.7新增了不少新功能,比如:Online DDL.多源复制.增强半同步.表空间传输.sys 库.Group Replication等.最近终于等到了一个机会,将MySQL升级到5.7,很是兴奋不已. MySQL升级的概述 MySQL升级的实质: 对数据字典的升级 数据字典有:mysql.information_schema.performance_schema.sys schema. MySQL升级的两种方式: in-place upgrade: 适合小版本的升级. 即 关闭当前的M

  • MySQL数据库升级的一些"陷阱"

    对于商业数据库而言,数据库升级是一个优先级很高的事情,有版本升级路线图,有相应的补丁,而且对于方案还有一系列的演练,显然是一场硬仗.而在MySQL方向上,升级这件事情就被淡化了许多,好像只能证明它的存在而已,当然正是由于这种不重视,也让我今天走了不少弯路. 一般来说,升级MySQL有两类可行方案,一类是直接升级数据字典,在本机完成,整个过程会有离线操作,会对业务有中断,第二种是通过高可用切换平滑实现,原理是搭建低版本到高版本的数据复制关系,这种方案优势比较明显,对于业务的侵入性最低,而且还可以提

  • MySQL/MariaDB/Percona数据库升级脚本

    MySQL/MariaDB/Percona数据库升级脚本 MySQL/MariaDB/Percona数据库升级脚本截取<OneinStack>中upgrade_db.sh,一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们.为防止大版本之间兼容问题,脚本默认仅支持同一大版本之间的升级,如:MySQL-5.6.25升级到MySQL-5.6.26.MySQL-5.5.44升级到MySQL-5.5.45.MariaDB-10.0.20升级到MariaDB-10.0.21:不能跨分支版本且不能

  • Mysql数据库锁定机制详细介绍

    前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制.锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一.本章将对MySQL中两种使用最为频繁的存储引擎MyISAM和Innodb各自的锁定机制进行较为详细的分析. MySQL锁定机制简介 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外.MyS

  • centos7 mysql数据库安装和配置

    一.系统环境 yum update升级以后的系统版本为 [root@yl-web yl]# cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) 二.mysql安装 一般网上给出的资料都是 #yum install mysql #yum install mysql-server #yum install mysql-devel 安装mysql和mysql-devel都成功,但是安装mysql-server失败,如下: [root

  • Openstack 使用migrate进行数据库升级实现方案详细介绍

    Openstack 使用migrate进行数据库升级实现方案详细介绍 OpenStack中随着版本的切换,新版本加入一些数据库表或者增加字段等是必然的事情,如何比较容易的进行这些数据库升级的适配和管理,这里就要用到oslo_db中的migrate了,这里以为M版本的heat为例,讲解一下migrate管理db的原理. 我们使用migrate需要用到的主要包含以下两部分:1.versions里面的为版本号+数据库适配脚本:2.migrate.cfg为migrate需要用到的配置文件,两部分的命名是

  • Mysql数据库性能优化一

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是

  • 一款简单实用的php操作mysql数据库类

    本文实例讲述了一款简单实用的php操作mysql数据库类.分享给大家供大家参考.具体如下: 复制代码 代码如下: /* 本款数据库连接类,他会自动加载sql防注入功能,过滤一些敏感的sql查询关键词,同时还可以增加判断字段 show table status的性质与show table类 获取数据库所有表名等.*/ @ini_set('mysql.trace_mode','off'); class mysql {  public $dblink;  public $pconnect;  priv

  • MySQL数据库InnoDB引擎主从复制同步经验总结

    近期将公司的MySQL架构升级了,由原先的一主多从换成了DRBD+Heartbeat双主多从,正好手上有一个电子商务网站新项目也要上线了,用的是DRBD+Heartbeat双主一从,由于此过程还是有别于以前的MyISAM引擎的,所以这里也将其心得归纳总结了一下: 1)MySQL的replication过程是一个异步同步的过程,并非完全的主从同步,所以同步的过程中是有延迟的,如果做了读写分离的业务的话,建议也要监控此延迟时间: 2)MySQL的master与slave机器记得server-id要保

  • 建立Apache+PHP+MySQL数据库驱动的动态网站

    本文只介绍这3个软件的安装,有关PHP和MySQL的编程和使用请见其他资料. 一.如何获得软件? 获得这3个软件包的方法很多,目前大多数Linux分发都捆绑了这3个软件包,如RedHat.本文介绍的安装方法是基于从这些软件的官方站点上下载获得的软件包进行的,针对RedHat Linux 6.1,也介绍它们的安装和配置. 这3个软件的官方站点是: 软件 官方网站 当前版本 下载 Apache 1.3.9 这里 PHP 3.0.13 这里 MySQL 3.22.29 这里 从上述网站上,你应该下在以

  • 详解Mysql数据库date, datetime类型设置0000-00-00默认值(default)报错问题

    现象:MySQL5.7版本之后,date, datetime类型设置默认值"0000-00-00",出现异常:Invalid default value for 'time' 原因:在命令行窗口查看当前的sql_mode配置: select @@sql_mode; 结果如下: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE,  ERROR_FOR_DIVISION_BY_ZERO, NO_AU

随机推荐