首页 > 数据库 >MySQL 5.6 到 MYSQL 5.7 应用迁移有什么问题,升级后打脸又降回去

MySQL 5.6 到 MYSQL 5.7 应用迁移有什么问题,升级后打脸又降回去

时间:2023-12-28 14:01:08浏览次数:34  
标签:table1 name 5.6 5.7 MySQL +----+--------+ sec mysql id



MySQL 5.6  到 MYSQL 5.7 应用迁移有什么问题,升级后打脸又降回去_adb

最近说来惭愧,有开始说mysql 5.6 的问题了,是在是无奈有一个项目古老且XX,大批的在用MySQL 5.6 这个版本的数据库,之前并未进行管理,但基于Enterprise 的数据库都管理的还可以,所以这个项目也就到了手里,然后我们提出从5,6升级数据库版本的问题,并提出升级后的各种利好,但在升级过程中,我们遇到了升级后,又降级回去的问题,这里和各位说说为什么,以及我们疏忽了什么。

首先需要说明MySQL5.6 中存在的一些问题,估计已经被很多人所忘记,这里先回顾一下MySQL5.6 的问题点

问题1  MySQL 5.6 更容易产生主从同步的问题,基于MYSQL 5.7 提出的并行复制的概念,允许复制时间并行应用,可以启用多个线程来完成原来单一线程完成的工作,基于MYSQL 5.7 以后的MYSQL 在复制延迟上有很多的改善。

问题2  MYSQL5.6 performance_schema的问题,主要是这个部分的性能你开销较大开启对性能负面影响大,所以在部分情况下,还在遵循MYSQL5.5 之前对于PF 的一些尽量关闭的方式来处理 MYSQL5.6的 PF。

问题3  BINLOG 复制容易出现数据复制的问题,基于MYSQL.5.7 基于这个问题,推出了 GTID 等方式来进行功能上的增强和为MYSQL 数据复制拓扑上的稳定性上做出的改善方案。

问题4  对于内存的管理和句柄的限制等问题,在MYSQL5.6还是一个问题,这样的问题导致MYSQL5.6 无法良好的支持高并发和工作负载较重的场景,相对于MYSQL5.7 来说。

基于从数据库的复制方式,数据一致性,内存管理,句柄管理高并发等问题,从MYSQL 5.6 升级到MYSQL 5.7 好处是非常多的,尤其到了MYSQL5.7 的后面版本。

但但但,为什么升级后,又回退了,这个就是今天要说的

1  升级前,开发与DB 进行了评估,忽略了MYSQL 5.6 与 MYSQL5.7 之间的语法的不同,以及一些配置的问题。

MYSQL 5.7 

问题1  语句撰写的语法变化,在MySQL 5.6中存在大量不符合SQL语法的一些写法,比如下面的关于union all  与 limit 1 的写法在 MySQL 5.6中可以被接受,但是在MySQL 5.7 中无法被接受。相关此次项目数据库版本回退主要就是因为这个问题产生的回退。

mysql> create table table1 (id int primary key,name varchar(20));
on all
select * from table2 limit 1;
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> 
mysql> create table table2 (id int primary key,name varchar(20));
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> insert into table1 (id,name) values (1,'system');
Query OK, 1 row affected (0.01 sec)

mysql> insert into table2 (id,name) values (2,'system2');
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> 
mysql> select * from table1 limit 1
    -> union all
    -> select * from table2 limit 1;
ERROR 1221 (HY000): Incorrect usage of UNION and LIMIT
mysql> create table table1 (id int primary key,name varchar(20));
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> 
mysql> create table table2 (id int primary key,name varchar(20));
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> insert into table1 (id,name) values (1,'system');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table2 (id,name) values (2,'system2');
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> 
mysql> select * from table1 limit 1
    -> union all
    -> select * from table2 limit 1;
+----+--------+
| id | name   |
+----+--------+
|  1 | system |
+----+--------+
1 row in set (0.00 sec)
mysql> create table table1 (id int primary key,name varchar(20));
on all
mysql> explain select * from table1 limit 1 union all select * from table2 limit 1;
+----+--------------+------------+------+---------------+------+---------+------+------+-----------------+
| id | select_type  | table      | type | possible_keys | key  | key_len | ref  | rows | Extra           |
+----+--------------+------------+------+---------------+------+---------+------+------+-----------------+
|  1 | PRIMARY      | table1     | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL            |
|  2 | UNION        | table2     | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL            |
| NULL | UNION RESULT | <union1,2> | ALL  | NULL          | NULL | NULL    | NULL | NULL | Using temporary |
+----+--------------+------------+------+---------------+------+---------+------+------+-----------------+

MySQL 5.6  到 MYSQL 5.7 应用迁移有什么问题,升级后打脸又降回去_数据库_02

MySQL 5.6  到 MYSQL 5.7 应用迁移有什么问题,升级后打脸又降回去_adb_03

问题 2 大小写敏感的问题

我们可以从下面的文字中发现5.6 中同样的意思的文字,大小写不同,在查询中可以根据输入条件的大小写的不同来进行对应大小写字段的查询,但是在5.7中则查询的结果很mysql ,5.6的查询结果与POSTGRESQL很类似。

当然5.6可以调整与MySQL 5.7 一样的模式,可基于当时数据已经复制到5.7 同时应用程序也无法进行修改符号5.7的当时的模式,所以这也是导致升级失败的一个原因。

这里我们只需要在建立数据的时候将数据库设置为

CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;

在导入数据即可,MYSQL5.7就可以和MYSQL5.6在大小写查询方面一致。
但基于当时数据已经灌入,无法在改变的问题,所以只好进行回退。
但问题1 部分是无法进行解决的,所以回退也是必然。

mysql> 
mysql> insert into table1 (id,name) values (2,'System');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table2 (id,name) values (3,'SYSTEM');
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> 
mysql> select * from table1; 
+----+--------+
| id | name   |
+----+--------+
|  1 | system |
|  2 | System |
+----+--------+
2 rows in set (0.00 sec)

mysql> select * from table2;
+----+---------+
| id | name    |
+----+---------+
|  2 | system2 |
|  3 | SYSTEM  |
+----+---------+
2 rows in set (0.00 sec)

mysql> select * from table1 where name = 'system';
+----+--------+
| id | name   |
+----+--------+
|  1 | system |
|  2 | System |
+----+--------+
2 rows in set (0.01 sec)

mysql> select @@version
    -> ;
+-----------+
| @@version |
+-----------+
| 5.7.44    |
+-----------+
1 row in set (0.00 sec)

mysql> insert into table1 (id,name) values (3,'SYSTEM');
Query OK, 1 row affected (0.01 sec)

mysql> select * from table1 where name = 'System';
+----+--------+
| id | name   |
+----+--------+
|  1 | system |
|  2 | System |
|  3 | SYSTEM |
+----+--------+
3 rows in set (0.00 sec)

mysql>
mysql> create table table1 (id int primary key,name varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> insert into table1 (id,name) values (1,'system');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table1 (id,name) values (2,'System');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table1 (id,name) values (3,'SYSTEM');
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> select * from table1 where name = 'system';
+----+--------+
| id | name   |
+----+--------+
|  1 | system |
+----+--------+
1 row in set (0.00 sec)

mysql> select * from table1 where name = 'SYSTEM';
+----+--------+
| id | name   |
+----+--------+
|  3 | SYSTEM |
+----+--------+
1 row in set (0.00 sec)

mysql> select * from table1 where name = 'System';
+----+--------+
| id | name   |
+----+--------+
|  2 | System |
+----+--------+
1 row in set (0.01 sec)

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.6.51    |
+-----------+
1 row in set (0.00 sec)

mysql>

MySQL 5.6  到 MYSQL 5.7 应用迁移有什么问题,升级后打脸又降回去_MySQL_04

总结:MySQL 5.x 到 MySQL 8 很多人都会抱着12万分的小心,进行迁移的测试和语法的测试,但MySQL 5.6 到 5.7 却大多认为比较简单,问题点少,此次的回退就是给粗心大意的人,当头一棒。

MySQL 5.6  到 MYSQL 5.7 应用迁移有什么问题,升级后打脸又降回去_数据库_05

标签:table1,name,5.6,5.7,MySQL,+----+--------+,sec,mysql,id
From: https://blog.51cto.com/u_14150796/9014298

相关文章

  • mysql5.7 wait_timeout (转)
    参考:https://blog.csdn.net/ivory_town1/article/details/777023571.修改参数配置文件vi/etc/my.cnf[mysqld]wait_timeout   =28800interactive_timeout   = 28800#增加以上两列即可,因为官方文档要求修改此参数必须同时修改interactive_......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、广播变量BroadcastVariables示例1、介绍2、广播变量示例3、验证三、BroadcastState与BroadcastVariable区别本文简单的介绍了flink中关于广播变量的简单使用示例。一、maven依赖为避免篇幅过长,所有基础依赖均在第一篇文章中列出,具......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、Flinksink介绍三、sink到文件、console示例1、console输出2、sink到文件1)、sinktxt文件到hdfs上2)、sinkcsv文件到本地3)、sinktext文件到hdfs上(writeUsingOutputFormat)四、sink到socket示例(writeToSocket)五、Jdbc/mysql示例1、maven依......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、分布式缓存(DistributedCache)示例1、介绍2、maven依赖3、实现4、验证1)、验证步骤2)、验证本文介绍了flink关于分布式缓存的使用示例,比较简单。本文除了maven依赖外,没有其他依赖。本示例需要hadoop环境可用。一、maven依赖为避免篇幅过长,所......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、sink到ClickHouse示例1、介绍2、maven依赖3、创建clickhouse表4、验证clickhouseweb页面是否正常5、实现1)、userbean2)、sink实现6、验证1)、nc输入2)、启动应用程序3)、观察应用程序控制台输出4)、查看clickhouse表中的数据本文介绍了nc作......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、环境或版本说明三、flinksink到kafka示例1、介绍2、1.13.6版本示例1)、maven依赖2)、实现3)、验证步骤3、1.17.0版本示例1)、maven依赖2)、实现3)、验证步骤本文介绍了flink将数据sink到kafka的示例,并提供了flink的1.13.6和1.17两个版本sink到......
  • SpringBoot 整合 ShardingSphere JDBC、MySQL分表实例
    1.概述ShardingSphere分为ShardingSphere-JDBC、ShardingSphere-Proxy、ShardingSphere-Sidecar(TODO)。ShardingSphere官方手册:传送门;这里使用的是ShardingSphere-JDBC,ShardingSphere-JDBC为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar......
  • rpm 安装mysql8
    下载MySQL安装包 https://dev.mysql.com/downloads  安装 rpm-ivh包名 默认配置/etc/my.cnf 初始化mysql  mysqld--initialize--user=mysql--console 安装完密码默认存放在 /var/log/mysqld.log 修改root密码alteruser'root'@'localhost'......
  • (Linux环境)MySQL数据库定时备份
    最近遇到MySQL数据库备份的问题,其实备份可以直接备份数据库数据目录,但是这个方法比较困难,得停数据库才能备份。于是写了shell脚本,采用for循环备份MySQL里面的所有库,然后用rsync软件将备份数据同步到其他服务器上实现异地备份,保留7天的备份数据。脚本展示如下:#!/bin/bash#date202......
  • MySQL数据库知识重构(1)
    平时工作会用到mysql数据,但是没有对知识点进行系统的学习,知识比较零散。所以为了将mysql吃透,方便以后工作。从现在起,开始知识点重构的旅程。MySQL数据库?MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库......