写点什么

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

作者:洛神灬殇
  • 2023-08-02
    江苏
  • 本文字数:3189 字

    阅读完需:约 10 分钟

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

项目目标

  • 本次技术调研和分析报告,主要面向于总体分析和建立对应的 MySQL 数据库所需要从 5.7 版本升级到 8.0 版本后的 Java 应用服务项目的调整以及功能变动报告分析。

  • MySQL 8.0 引入一些性能改进,例如新的查询优化器和索引算法。升级后,可以通过重新评估和优化项目中的 SQL 查询和索引来利用新的功能,以提高数据库性能。

官方升级地址

https://dev.mysql.com/doc/refman/8.0/en/upgrading.html

向前兼容性问题

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)的调整。

    <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 参数,例如:

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 配置案例

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 的查询参数中,如下所示的示例:

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 引入了一些兼容性变化,包括新的功能、语法和行为。

https://dev.mysql.com/doc/refman/8.0/en/upgrading.html

重点关注对象

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

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 环境中正常运行。测试包括输入/输出验证、性能测试和回归测试等。确保所有功能都正常工作,并处理任何错误或异常情况。

发布于: 刚刚阅读数: 4
用户头像

洛神灬殇

关注

🏆 InfoQ写作平台-签约作者 🏆 2020-03-25 加入

【出版书籍】《深入浅出Java虚拟机—JVM原理与实战》 【个人简介】酷爱计算机科学、醉心编程技术、热衷悬疑推理的“极客达人” 【技术范畴】Java领域、Spring生态、MySQL专项、微服务/分布式体系和算法设计等

评论

发布
暂无评论
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)_MySQL_洛神灬殇_InfoQ写作社区