项目目标
- 本次技术调研和分析报告,主要面向于总体分析和建立对应的MySQL数据库所需要从5.7版本升级到8.0版本后的Java应用服务项目的调整以及功能变动报告分析。
- MySQL 8.0引入一些性能改进,例如新的查询优化器和索引算法。升级后,可以通过重新评估和优化项目中的SQL查询和索引来利用新的功能,以提高数据库性能。
官方升级地址
向前兼容性问题
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连接以下几个原因:
-
避免SSL证书验证的开销:SSL连接需要进行证书验证,这会增加建立连接的延迟和计算开销。如果您的环境中不需要对连接进行加密和验证,禁用SSL可以提高连接性能。
-
解决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有一些变化,总结升级过程的主要差异:
- 字符集的默认值: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引入了一些兼容性变化,包括新的功能、语法和行为。
重点关注对象
编码和解码(项目中没有使用,直接忽略)
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环境中正常运行。测试包括输入/输出验证、性能测试和回归测试等。确保所有功能都正常工作,并处理任何错误或异常情况。