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

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

时间:2023-08-02 14:02:48浏览次数:57  
标签:实战 8.0 驱动程序 数据库 SSL 版本升级 MySQL 连接

项目目标

  • 本次技术调研和分析报告,主要面向于总体分析和建立对应的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字段。这个字段的作用是指定时区。

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

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

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

标签:实战,8.0,驱动程序,数据库,SSL,版本升级,MySQL,连接
From: https://blog.51cto.com/alex4dream/6937597

相关文章

  • MYSQL启动的参数
    MYSQL启动的参数--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data--plugin-dir=/usr/local/mysql/lib/plugin--user=mysql--log-error=/usr/local/mysql/log/mysqld_error.log--pid-file=/usr/local/mysql/data/mysqld.pid 启动参数可以组合使用,如下/usr/local/my......
  • iptables实战-SNAT|DNAT|负载均衡
    一、路由转发与SNAT实验环境说明:debian机器位于内网,有一个网卡ens38,ip地址172.16.1.2/24,网关为172.16.1.1(router的eth2)router机器位于内网和外网的边界,有2个网卡eth1和eth2,eth1地址192.168.124.247接外网,网关192.168.124.1;eth2地址172.16.1.1,连接debian在网卡配置正确的情况下,......
  • mysql在执行innobackupex增量备份时报错cannot open *****/xtrabackup_checkpoints
    问题描述:mysql在执行innobackupex增量备份时报错cannotopen*****/xtrabackup_checkpoints,如下所示:数据库:mysql5.7.21说明:此次测试环境为从节点.1、异常重现[mysql@mysql-leo-perslave~]$/usr/bin/innobackupex--defaults-file=/home/mysql/etc/my.cnf--socket=/mysql/da......
  • MySQL8_SQL语法
    MySQL8_SQL语法SQL全称StructuredQueryLanguage,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。 一、SQL通用语法在学习具体的SQL语句之前,先来了解一下SQL语言的同于语法。1).SQL语句可以单行或多行书写,以分号结尾。2).SQL语句可......
  • 因MySQL数据库无法启动导致LiteCVR视频平台也无法启动的问题解决教程
    近期呢,我们的数据人员发现有时候MySQL数据库无法启动会导致LiteCVR视频平台也无法启动,所以接下来我们将为大家讲解遇见这种问题时的解决教程。但是在这之前值得一提的一件事那就是我们的LiteCVR平台默认的数据库是SQLite,不过用户可以根据自己的使用需求选择将数据库切换为MySQL。具......
  • 【腾讯云Cloud Studio实战训练营】使用Cloud Studio快速开发一个3D家具个性化定制应用
    目录前言: 一、腾讯云CloudStudio介绍:1、接近本地IDE的开发体验2、多环境可选,或连接到云主机3、随时分享预览效果4、兼容VSCode插件 5、AI代码助手二、腾讯云CloudStudio项目实践(3D家具个性化定制应用)1、注册并登录CloudStudio2、进入Vue预置开发环境2.1登录成功进入C......
  • .NET+MySQL的坑
    #JSON字段访问时,引号格式--需要替换C#里的""\""""为"\""--C#里的SQL代码rtrim(ltrim(REPLACE(JSON_EXTRACT(b.yarn_type_id,'$.dye_name'),""\"""",'')))--MySQL直接执行的代码rtri......
  • 火山引擎ByteHouse:云原生数据库如何提升MySQL兼容性?
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群当前各类软件层出不穷,单独某一款软件往往难以满足企业应用需求,一般都需要与各类软件组合使用,这时软件生态兼容性就显得格外重要。作为关系数据库管理系统的代表之一,MySQL支持大多数操作系统、编程......
  • 求和计算MySQL中如何对两列求和(mysql 中两列总和)
    求和计算:MySQL中如何对两列求和?在MySQL数据库中,对两列进行求和运算是一项常规操作。本文将介绍在MySQL中如何对两列进行求和运算,并给出相关的SQL代码示例。SQL语句中使用的SUM()函数是MySQL中常用的聚合函数之一,用于计算某一列的总和。而对于两列的求和,则需要将两个......
  • PostgreSQL-pg_upgrade 大版本升级14.7-15.2
    文档参考pg_upgrade1大纲pg_upgrade-boldbindir-Bnewbindir-doldconfigdir-Dnewconfigdir[option...]2描述PG_UPGRADE(以前称为PG_Migrator)允许将存储在PostgreSQL数据文件中的数据升级到较新的PostgreSQL主要版本,而无需进行主要版本升级通常所需的数据转储/恢复,例如......