【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)

项目目标

  • 本次技术调研和分析报告,主要面向于总体分析和建立对应的MySQL数据库所需要从5.7版本升级到8.0版本后的Java应用服务项目的调整以及功能变动报告分析。
  • MySQL 8.0引入一些性能改进,例如新的查询优化器和索引算法。升级后,可以通过重新评估和优化项目中的SQL查询和索引来利用新的功能,以提高数据库性能。

官方升级地址

dev.mysql.com/doc/refman/…

向前兼容性问题

MySQL 8.0的驱动程序可以与MySQL 5.7数据库一起使用。MySQL的驱动程序通常是向后兼容的,这意味着较新版本的驱动程序通常可以与较旧版本的数据库一起正常工作。

注意:一般上是可以正常使用的,但仍有一些潜在的兼容性问题需要注意。这些问题可能涉及到新的功能、改变的默认设置或废弃的功能等方面。

任务拆分调整

当将Java项目升级MySQL版本时,需要注意以下几个方面来制定改造方案

项目前提工作

数据库备份/迁移:在进行任何升级操作之前,请务必备份项目中使用的MySQL数据库。这是为了防止出现任何意外情况,以便可以还原到先前的状态。

强烈建议先备份数据库,并进行彻底的测试和验证,以确保升级过程不会影响到您的数据的完整性和应用程序的正常运行。

应用服务改造

兼容性检查:首先,确保项目中使用的所有MySQL驱动程序和相关库都支持MySQL 8.0版本。检查项目中的依赖项和第三方库以确认它们与新的MySQL版本兼容。

驱动器改造(p0)

改造范围

所有涉及到数据库连接的项目服务,调整对应的驱动配置。

  • 驱动配置:更新配置文件:根据新版本的要求,更新项目中的数据库连接配置文件(通常是在一个properties或yml文件中),以使用新的MySQL 8.0驱动程序和相关参数。确保您使用最新的连接驱动程序,并进行必要的配置更改。
  • 关于驱动名称的更改,在5.0版本之前,驱动类名为com.mysql.jdbc.Driver。而在8.0版本及以上,驱动类名需要加上cj,变为com.mysql.cj.jdbc.Driver。
  • 驱动依赖:需要将MySQL的JAR包升级到8.0版本以上,并相应地进行项目管理文件(POM)的调整。
  • xml
  • 复制代码
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.18</version>
</dependency>

解决问题

  • 稳定性:MySQL 8.0版本与低版本的驱动兼容性存在一些问题,可能会导致一些潜在的错误和功能不正常的情况。
  • 性能问题:低版本的驱动程序可能无法充分利用MySQL 8.0版本引入的性能优化和改进。因此,在使用低版本的驱动程序时可能会遇到性能下降的问题。
  • 认证失败:MySQL 8.0引入了新的身份验证机制来增强安全性。低版本的驱动程序可能无法与新的身份验证机制进行兼容,导致无法成功连接到数据库。
  • 数据类型兼容性:MySQL 8.0引入了一些新的数据类型和功能,这些新的类型可能无法被低版本的驱动程序正确解析和处理。这可能导致数据类型错误或转换错误。

客户端连接配置(p0)

改造范围

所有涉及到数据库连接的项目服务所对应的数据库连接字典配置选项。

时区问题选项

根据历史经验,当使用驱动版本为5.7来连接高于该版本的MySQL8数据库时,即使调整了驱动的设置,仍然可能遇到乱码和启动报错等问题。为了解决这些问题,官方提供了一个解决方案,即在连接字符串中添加serverTimezone字段。这个字段的作用是指定时区。

经过测试,发现在缺少该字段的情况下,可能导致时区设置不正确,进而引发乱码和报错。因此,建议按照以下方法优化您的连接设置:

在连接字符串中添加serverTimezone参数,例如:

bash

复制代码

jdbc:mysql://server:port/database?serverTimezone=Asia/Shanghai

通过采用以上优化措施,您的连接将能够正确设置时区,从而解决5.7驱动连接MySQL8数据库时可能遇到的乱码和启动报错等问题。

SSL选项配置

在MySQL配置数据库连接URL时,可以通过在URL末尾添加"useSSL=false"来禁用SSL连接。这个配置的作用是告诉MySQL驱动 程序在建立连接时不要使用SSL协议。

禁用SSL连接以下几个原因:
  1. 避免SSL证书验证的开销:SSL连接需要进行证书验证,这会增加建立连接的延迟和计算开销。如果您的环境中不需要对连接进行加密和验证,禁用SSL可以提高连接性能。
  2. 解决SSL握手错误:有时候,在某些环境下,连接MySQL时可能会遇到由于SSL握手错误导致的连接问题。在这种情况下,禁用SSL连接可以解决这个问题。
MySQL连接URL配置案例

bash

复制代码

jdbc:mysql://your_server:your_port/database?useSSL=false

通过在MySQL连接URL中添加"useSSL=false",您可以禁用SSL连接,从而提高连接性能或解决可能出现的SSL握手错误。

注意:请在确保了解和评估安全风险后再做决策。

批量处理SQL参数

将"allowMultiQueries=true"和"rewriteBatchedStatements=true"添加到MySQL连接URL中可以同时启用多查询和批量重写语句的功能。

allowMultiQueries(系统内部的SQL注入)

  • "allowMultiQueries=true":配置允许在单个SQL语句中执行多个查询。
  • 可以一次性执行多个独立的SQL语句,而无需多次与数据库进行通信。
  • "rewriteBatchedStatements=true(系统内部的SQL注入)":配置启用批量重写语句的功能,它可以将多个单独的SQL语句组合成一个批处理请求来提高性能。
  • 批量操作通常用于大量的插入或更新操作,通过将多个操作组合为一个批处理请求,可以减少与数据库的通信次数,从而提高性能。

要同时启用这两个配置,请将它们添加到MySQL连接URL的查询参数中,如下所示的示例:

sql

复制代码

jdbc:mysql://your_server:your_port/database?allowMultiQueries=true&rewriteBatchedStatements=true

注意,这个配置存在一定的安全风险,因为允许执行多个查询可能会导致SQL注入攻击。确保在使用前对输入进行适当的验证和参数化以防止潜在的安全问题。

数据库强依赖关系(p0)

数据库启动组件(直接忽略,系统排查后未直接用到)

如果在升级过程中需要进行数据库迁移,使用适当的数据库迁移工具(如Flyway或Liquibase)来处理模式和数据的变更。这些工具可以帮助您将数据库结构升级到新版本,并确保不会丢失或损坏任何现有的数据。

Binlog的日志格式兼容性问题

MySQL 5.7和MySQL 8之间的binlog有一些变化,总结升级过程的主要差异:

  1. 字符集的默认值:MySQL 8中,默认的字符集设置为utf8mb4,而不是MySQL 5.7中的utf8。如果您在升级后出现字符编码问题,可能需要修改相关的字符集设置。

注意:待验证对应的源库中表/字段定义为utf8的数据,之后导入到utf8mb4长度中的数据是否会存在兼容问题。这比较考验对应的数据库迁移工具功能。

数据库从库同步问题兼容性

Binlog格式

MySQL 5.7默认使用的是“statement”模式的binlog格式,而MySQL 8则默认使用“row”模式的binlog格式。这两种格式具有不同的记录方式,因此在升级后,您的应用程序可能需要进行相应的调整以正确处理新的binlog格式。

Clickhouse数据库的兼容性

Flink-CDC-可识别的版本号

MySQL 8的binlog文件对版本号的格式有所变化,版本号不再以“5.”开头。这可能会影响到需要解析binlog的某些工具或应用程序。

MySQL内部对象变化

MySQL8.0引入了一些兼容性变化,包括新的功能、语法和行为。

dev.mysql.com/doc/refman/…

重点关注对象

编码和解码(项目中没有使用,直接忽略)

ENCODE/DECODE

在MySQL 8中,ENCODE()和DECODE()函数仍然可用,但它们被视为废弃的功能,并且可能会在未来的版本中被移除。建议使用其他更安全和更现代的方法来处理数据的加密和解密。

加密和解密(项目中没有使用,直接忽略)

ENCRYPT/DES_ENCRYPT/DES_DECRYPT

ENCRYPT()、DES_ENCRYPT()和DES_DECRYPT()函数,它们在MySQL 8中已被删除。这些函数使用了已被认为不安全的加密算法,不再被推荐使用。

对于加密和解密数据的需求,MySQL 8推荐使用更强大和更安全的加密函数和算法,例如AES_ENCRYPT()和AES_DECRYPT()函数,以及其他基于密钥的加密算法。

测试和验证

在升级过程完成后,进行全面的测试和验证,以确保项目在新的MySQL 8.0环境中正常运行。测试包括输入/输出验证、性能测试和回归测试等。确保所有功能都正常工作,并处理任何错误或异常情况。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
13 0
|
4天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
20 0
|
2天前
|
关系型数据库 MySQL API
实时计算 Flink版产品使用合集之可以通过mysql-cdc动态监听MySQL数据库的数据变动吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
16 0
|
4天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
26 0
|
4天前
|
Java 关系型数据库 MySQL
【JavaEE】表白墙再升级(MySQL实现持久化)
【JavaEE】表白墙再升级(MySQL实现持久化)
9 0
|
4天前
|
SQL 关系型数据库 Serverless
阿里云关系型数据库RDS
阿里云关系型数据库RDS
16 2
|
4天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
24 0
|
4天前
|
关系型数据库 MySQL 数据库
mysql 设置环境变量与未设置环境变量连接数据库的区别
设置与未设置MySQL环境变量在连接数据库时主要区别在于命令输入方式和系统便捷性。设置环境变量后,可直接使用`mysql -u 用户名 -p`命令连接,而无需指定完整路径,提升便利性和灵活性。未设置时,需输入完整路径如`C:\Program Files\MySQL\...`,操作繁琐且易错。为提高效率和减少错误,推荐安装后设置环境变量。[查看视频讲解](https://www.bilibili.com/video/BV1vH4y137HC/)。
24 3
mysql 设置环境变量与未设置环境变量连接数据库的区别
|
4天前
|
关系型数据库 MySQL 数据库连接
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
19 0
|
4天前
|
存储 Oracle 关系型数据库
oracle 数据库 迁移 mysql数据库
将 Oracle 数据库迁移到 MySQL 是一项复杂的任务,因为这两种数据库管理系统具有不同的架构、语法和功能。
24 0

推荐镜像

更多