MySQL 5.5复制升级到5.7的一点简单尝试

最近有个需求是升级MySQL 5.5到MySQL 5.7版本,为此我们想了一些方案,比如MySQL级联复制升级,这么考虑主要是基于版本的差异性,尽可能保持兼容。

还有逻辑备份恢复,物理备份恢复的方案,当然无论如何体现业务价值才能使得技术价值更有意义。所以我们希望通过升级版本来尽可能使得线上版本统一的同时,带给业务和DBA的几大福利就是online DDL,数据延迟降低,优化器的增强。

当然能不能升级也是拍脑袋想,原理上是可以的,但是实际上效果如何,没有验证心里还没有底。之前所做的比较多的是迁移式升级,通过逻辑备份恢复的方式,在数据量比较大的情况下,那种方式就有些吃力了。

所以我按照5.5,5.6,5.7的版本搭建了3套MySQL环境,然后以这3套环境为基础来实现级联复制。看看能够实现平滑的数据库升级。

数据库版本为5.5.19, 5.6.14, 5.7.19

为了保持尽可能保持兼容性和更好的功能,我计划使用如下的方式。

MySQL 5.5升级到MySQL 5.6使用偏移量的方式来同步

MySQL 5.6升级到MySQL 5.7使用GTID的方式来同步

然后说干就干,其实初始化环境这部分主要就是参数的兼容性,

比如下面的参数在5.5版本中就不存在,但是在5.6,5.7中存在,就需要根据需求来取舍。

171019 9:47:53 [ERROR] /usr/local/mysql_5.5/bin/mysqld: unknown variable 'master_info_repository=TABLE'

171019 9:47:53 [ERROR] Aborting

171019 9:48:48 [ERROR] /usr/local/mysql_5.5/bin/mysqld: unknown variable 'relay_log_info_repository=TABLE'

171019 9:49:12 [ERROR] /usr/local/mysql_5.5/bin/mysqld: unknown variable 'binlog_checksum=NONE'

关键就在于复制关系的配置了。

我先来验证5.6到5.7的配置关系,没想到启动slave后看到了如下的错误。

Last_SQL_Error: Column 1 of table 'mysql.user' cannot be converted from type 'char(48(bytes))' to type 'char(96(bytes) utf8)'

这类问题可以考虑修改参数来设置无损复制的程度,比如这样设置。

mysql> set global slave_type_conversions='ALL_LOSSY,ALL_NON_LOSSY';

接着就收到了另外一个错误。

Last_SQL_Error: Can't create conversion table for table 'mysql.user'

当然按照这个思路,我们可以完全抛弃mysql库,直接复制数据所在的库即可。

然后是配置5.5到5.6的环境,发现5.6配置了GTID,和偏移量的使用方式是有冲突的。

所以折衷下来的取舍就是先取消GTID的设置,统一使用偏移量,重新配置一下主从库,重置一下。重新建立主从关系即可。

经过简单的测试,5.5->5.6->5.7的方式通过偏移量的配置是可行的,无需设置复制的过滤配置,我做了DDL,DML的操作,重新配置了用户,这些操作都是可以的。

然后我更进一步,尝试配置5.5到5.7的复制关系,没想到也是可以的。

所以上面的简单尝试让我对复制有了一种新的认识,至少在这一点上数据确实能够完全同步过来,至于更为复杂的场景后续还要做更多的补充测试。

时间: 2024-07-31 23:36:40

MySQL 5.5复制升级到5.7的一点简单尝试的相关文章

MySQL支持多线程复制

我们知道从5.6开始,MySQL支持多线程复制,到5.7版本又引入了基于GROUP COMMIT的并发事务分发机制.这意味着没有冲突的事务可以在备库并发执行.很显然,备库的事务提交顺序和主库是不能保证一致的. 这可能带来一些问题,尤其是事务之间有一定的业务关联时,提供读访问时可能会带来业务上的不一致问题.因此在MySQL 5.7.6版本,引入了一个新的特性,来保证主库和备库的commit顺序是一致的. 对应的changelog: Replication: Multi-threaded slave

MySQL主备复制原理、实现及异常处理

复制概述 MySQL支持三种复制方式:基于行(Row)的复制.基于语句(Statement)的复制和混合类型(Mixed)的复制. 基于语句的复制早在3.23版本中就存在,而基于行的复制方式在5.1版本中才被加进来.这两种方式都是通过在主库上记录二进制日志.在备库重放日志的方式来实现异步的数据复制. 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制. 复制通常不会增加主库的开销,主要是启用二进制日志带来的开销,但出于备份或及时从崩溃中恢复的目的,这

源码安装 mysql 5.5.20升级到mysql 5.6.25

环境: centos 6.5  64 mysql 5.5.20 升级 5.6.25 mysql 5.5.20安装参考: http://blog.csdn.net/u010098331/article/details/50730391 mysql 5.6.25安装参考:      http://blog.csdn.net/u010098331/article/details/50886619 CentOS系统下将MySQL升级至5.6.25 (源码安装方式) 摘要:CentOS系统下将MySQL升

LNMP 状态管理命令说明及Nginx、MySQL/MariaDB、PHP升级教程

状态管理命令分 LNmp状态管理命令 和 LNmpA状态管理命令,LNMPA代表的是Linux下Nginx.MySQL.PHP.Apache这种网站服务器架构,是结合LAMP与LNMP各自的优点而产生的新的网站服务器架构. LNmp状态管理命令: LNmp状态管理: /root/lnmp {start|stop|reload|restart|kill|status}Nginx状态管理:/etc/init.d/nginx {start|stop|reload|restart}MySQL状态管理:/

MySQL · 源码分析 · MySQL 半同步复制数据一致性分析

简介 MySQL Replication为MySQL用户提供了高可用性和可扩展性解决方案.本文介绍了MySQL Replication的主要发展历程,然后通过三个参数rpl_semi_sync_master_wait_point.sync_binlog.sync_relay_log的配置简要分析了MySQL半同步的数据一致性. MySQL Replication的发展 在2000年,MySQL 3.23.15版本引入了Replication.Replication作为一种准实时同步方式,得到广泛

mysql跨数据库复制表(在同一IP地址中)示例_Mysql

数据库表间数据复制分类 在利用数据库开发时,常常会将一些表之间的数据互相导入.当然可以编写程序实现,但是,程序常常需要开发环境,不方便.最方便是利用sql语言直接导入.既方便而修改也简单.以下就是导入的方法. 1. 表结构相同的表,且在同一数据库(如,table1,table2) Sql : 复制代码 代码如下: insert into table1 select   *    from table2 (完全复制)insert into table1 select   distinct   * 

mysql主主复制(双主复制)配置步骤

MySQL主主复制结构区别于主从复制结构.在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上,这样两台服务器互为主从,并且都能向外提供服务. 有了上一节的主从复制,那么主主复制就很容易了. 一.先修改配置文件 服务器A(192.168.1.254)配置如下   log-bin   = mysql-bin server-id = 1 expire-logs-days  = 100 replicate-do-db   = test binlog-ignore-db

mysql 主主复制漏少量数据

问题描述 mysql 主主复制漏少量数据 各位大神: 我们自己公司的业务系统部署了mysql主主复制,但近期发现有张数据量较大的表中,每天都会有若干条数据在从库(被复制的那一方)中会丢失(未插入进去),查看主库的binlog中有这条insert语句,再查看从库的relay log中也有这条insert语句,但到了从库的binlog却没有了这条insert语句,这句语句周围其他一批commit的语句到都被执行了,两个库中的error日志都没有任何异常体现,未插入的数据看了一下也是比较正常的数据.请

mysql 主备复制下的可靠性漫谈(三)

引言:    前面两期主要针对各种故障条件下,对数据可靠性带来的挑战及普通应对策略.本文主要针对在主备非强同步复制模式下,能否保证数据可靠性来讨论. 复制模式概述:    异步模式:主库收到commit 请求后,依次执行:写redo log prepare,写入binlog,写redo log commit,返回客户端成功.         半同步模式:主库收到commit 后,依次执行 redo log prepare,写binlog/发往备库(两个步骤并行),等待备库回复收到ack,redo