ysql5.7 升级为Mysql8 调查报告

发布时间 2023-05-22 10:52:56作者: 陈忠福

Mysql5.7 升级为Mysql8 调查报告

Mysql8特性

  • 支持数据类型:MySQL 8添加了对JSON数据类型的支持,包括JSON数据的解析和索引,使得在处理半结构化数据方面更加方便。

  • 更好的性能:MySQL 8提供了更好的性能优化,包括更快的查询速度和更高的并发性能。例如,MySQL 8中对InnoDB存储引擎的改进,包括更快的索引查找和更好的缓存管理,可以提高查询速度。

  • 更高的安全性:MySQL 8加强了安全性,包括对密码验证的改进、加密算法的更新,以及更好的安全性配置。

  • 新功能:MySQL 8新增了一些功能,如支持Window函数和Common Table Expressions(CTE)等,这些功能使得查询更加强大和灵活。

  • 改进管理工具和监控工具:MySQL 8改进了其管理和监控工具,如MySQL Shell和MySQL Workbench等,使得管理和监控更加方便和直观。

Mysql5.7与Mysql8 SQL差异

  • 聚合函数:GROUP BY 子句:MySQL 8中,如果您在SELECT语句中使用了GROUP BY子句,则必须将所有非聚合列添加到GROUP BY子句中。在MySQL 5.7中,可以省略非聚合列,但在MySQL 8中不再支持。

  • 数据类型:MySQL 8添加了对JSON数据类型的支持,因此您可以在MySQL 8中使用JSON函数和操作符。但是,如果您在MySQL 5.7中使用了不支持的数据类型或特性,则可能需要修改SQL语句以便与MySQL 8兼容。

  • 存储引擎:MySQL 8对InnoDB存储引擎的某些参数和默认值进行了更改,因此在某些情况下,您可能需要根据新的参数进行相应的更改。

  • 视图:MySQL 8中引入了新的视图功能,因此如果您在MySQL 5.7中使用了视图,则可能需要进行一些修改以便与新的视图语法兼容。

Mysql版本升级测试

  • 数据库连接和访问:测试应用程序与新数据库的连接和访问,确保它们可以正常工作。尝试连接到新数据库,读取和写入数据,确保一切正常。

  • 数据库结构和架构:验证数据库的结构和架构是否与原来的一致,并检查是否需要更改或调整。这包括检查表、索引、约束、视图、存储过程等。

  • 数据库功能:验证数据库功能是否与原来的一致,并检查是否需要更改或调整。例如,检查SQL语句是否正确地执行,特定的函数和存储过程是否正确地工作,是否需要更改SQL查询等。

  • 数据完整性:验证数据的完整性是否得到保留。这包括检查是否有任何数据丢失、重复、不一致等。

  • 性能测试:性能测试是验证迁移后数据库的关键方面之一。测试读取和写入操作的性能,以及数据库在不同负载下的响应时间和吞吐量。

  • 安全性和权限:验证数据库安全性和权限是否得到保留,并检查是否需要更改或调整。

  • 其他集成测试:测试与应用程序中其他组件(例如,Java代码、Web应用程序等)的集成,确保迁移后应用程序的所有组件都可以正常工作。

基于CIL-filehanding测试:

数据库连接和访问

在springboot程序使用的驱动程序为mysql-connector-java:5.1.43,该版本不可以连接到MySQL 8数据库。在应用启动时会报如下错误信息:

[D: 2023-05-19 15:09:59,191] [H: chenzhongfudeMacBook-Pro.local] [P: INFO ] [C: ] [T: main] [L: org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler] - [M: Shutting down ExecutorService]  
[D: 2023-05-19 15:09:59,207] [H: chenzhongfudeMacBook-Pro.local] [P: ERROR] [C: ] [T: main] [L: org.springframework.boot.SpringApplication] - [M: Application startup failed]  
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at
Caused by: org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource
	at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:56)
	at org.flywaydb.core.Flyway.execute(Flyway.java:1385)
	at org.flywaydb.core.Flyway.migrate(Flyway.java:1006)
	at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66)
	at 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
	at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2104)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2029)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
Caused by: java.sql.SQLException: Unknown system variable 'tx_isolation'
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
  • pom.xml文件中添加数据库版本对应的依赖。
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
</dependency>

但是,需要注意的是,在MySQL 8中,默认使用utf8mb4字符集,而在以前的MySQL版本中,则使用的是utf8字符集。因此,如果您连接到MySQL 8并使用utf8字符集,将无法存储某些Unicode字符。如果您需要在MySQL 8中存储这些字符,则需要在连接字符串中指定使用utf8mb4字符集,如下所示:

jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8mb4

其中,db_name应替换为您的实际数据库名称。

数据库结构和架构

Flyway集成在Springboot中后,在启动项目时会对数据库的表进行版本验证,如果版本信息小于Flyway中记录的版本,则Flyway会自动将数据库表结构更新到最新版本。如果数据库版本信息大于Flyway中记录的版本,则无法启动应用程序。在日志中可以看到如下的错误信息。

注:Flyway记录的数据库版本信息在schema_version表中。表中最新的数据库版本应当与/db/migration/目录下脚本版本信息一致。

[D: 2023-05-09 17:01:08,078] [H: chenzhongfudeMacBook-Pro.local] [P: ERROR] [C: ] [T: main] [L: org.springframework.boot.SpringApplication] - [M: Application startup failed]  
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema `cilbizprod` without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
	at cn.jlr.cil.dataprocessor.Application.main(Application.java:19)
Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema `cilbizprod` without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.
	at org.flywaydb.core.Flyway$1.execute(Flyway.java:1035)
	at org.flywaydb.core.Flyway$1.execute(Flyway.java:1006)
	at org.flywaydb.core.Flyway.execute(Flyway.java:1418)
	at org.flywaydb.core.Flyway.migrate(Flyway.java:1006)
	at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
	... 16 common frames omitted
  • 解决方案:

认真核对升级前后数据库表结构,找出存在结构差异的表。然后将数据库进行回滚或快照恢复到之前版本。采用蓝绿升级方式,在将绿色数据库进行升级,之后核对蓝绿数据库表结构是否存在差异。如果没有差异,就可以进行数据库切换操作完成数据库升级。

数据完整性

在执行数据库升级之前,对数据库中各表的结构和数据量进行统计,在升级完成后再对各表中的结构和数据量进行统计,然后进行升级前后的对比,以确保数据的完整性。使用SQL语句查询操作相对麻烦,建议由CMS Team使用可视化工具直接连接到数据库进行记录。

数据库功能

通过查看springboot应用程序的日志信息,确定数据的写入是否正常。通过调用接口的方式确定数据功能的查询是否正常。

Mysql8大部分SQL语句是向下兼容的,只有部分聚合函数需要做出调整。在springboot项目中,没有使用到相关的聚合函数,所以不需要对SQL语句进行调整。

性能测试

从官方介绍中得知,Mysql8的性能大于Mysql5.7的。如果需要进行性能测试,则可以使用JMeter对应用程序进行性能测试。

安全性和权限

从官方介绍中可以得知,Mysql8的安全性高于Mysql5.7版本的,如果需要对其进行安全方面测试,则可以请Security Team进行测试。

数据库升级操作

  • 在数据库升级期间,数据库为不可用状态。
  • 在对数据库进行升级前需要对数据库进行备份。
  • 可以采用蓝绿部署方式,这样能够极大的减少宕机时间。具体操作步骤参考官网。

https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Maintenance.html#USER_UpgradeDBInstance.OSUpgrades

https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/blue-green-deployments-switching.html

从 MySQL 5.7 升级到 8.0 的预检查

MySQL 8.0 与 MySQL 5.7 存在一定的不兼容性。在从 MySQL 5.7 升级到 MySQL 8.0 时,这些不兼容性会引起问题。因此,为了让升级成功,可能需要对数据库做一些准备。以下是这些不一致项的一般列表:

不得有使用过时的数据类型或函数的表。

ENUM:在 MySQL 8.0 中,ENUM 被标记为过时 (deprecated),并且不再建议使用该数据类型。枚举类型建议使用 SET 替代。

SET:虽然 SET 比 ENUM 灵活,但仍然建议使用文本数据类型代替 SET。

  • 在cil-filehanding中未使用过时的数据类型和函数。

不得有孤立的 *.frm 文件。

在MySQL中,*.frm文件是数据表定义文件,存储了表的结构和元数据。每当创建一个表时,都会生成一个frm文件。如果某个表丢失了或被删除了,对应的frm文件可能仍然存在,这种文件就称为“孤立的frm文件”。

为了查找MySQL中是否有孤立的 *.frm文件,可以按照以下步骤进行:

  1. 进入MySQL数据目录,该目录通常为/var/lib/mysql/opt/mysql/data等。

  2. 使用以下命令查找所有frm文件:

find . -name '*.frm'

该命令会在当前目录以及其子目录中搜索所有以.frm结尾的文件,并返回它们的路径。

  1. 使用以下命令查找没有对应表的frm文件:
find . -name '*.frm' -exec mysql -e "SHOW TABLES LIKE '{}';" \; -ls

该命令会搜索所有frm文件,并通过MySQL的SHOW TABLES命令检查是否存在与该文件名称相同的表。如果表不存在,则会显示该frm文件的详细信息。

通过上述命令,就可以查找MySQL中是否有孤立的 *.frm 文件了。如果存在这种文件,则可以判断是否需要将其删除,同时也需要检查数据库的完整性。

触发器不得具有缺失的或空的定义程序或无效的创建上下文。

在MySQL中,可以通过执行SHOW TRIGGERS命令查看数据库中所有触发器的信息,包括它们的名称、表、事件、状态、创建时间和定义语句等。如果一个触发器有缺失的或空的定义程序或无效的创建上下文,可以通过该命令查看其状态信息,并通过其定义语句进行检查。

具体步骤如下:

  1. 连接到MySQL服务器:可以使用以下命令连接到MySQL服务器(需要替换成实际的用户名和密码):
mysql -u <username> -p
  1. 查看触发器信息:连接到MySQL服务器后,在命令行中执行以下命令,查看数据库中所有触发器的信息:
SHOW TRIGGERS;

该命令将返回一张表格,其中包含每个触发器的名称、表、事件、状态、创建时间和定义语句等信息。

  1. 检查触发器定义:通过上述命令查看触发器信息后,可以查看到定义语句列,即Create Trigger语句。检查该语句是否存在缺失的或空的定义程序或无效的创建上下文。

  2. 修改触发器定义:如果发现触发器存在问题,可以通过ALTER TRIGGER语句修改其定义。例如,修改某个触发器的名称和定义,可以执行以下命令:

ALTER TRIGGER <trigger_name> RENAME TO <new_trigger_name>;
ALTER TRIGGER <new_trigger_name> DEFINER = <User_Name>@<Host_Name> TRIGGER ...;

通过执行以上步骤,就可以查看触发器是否具有缺失的或空的定义程序或无效的创建上下文,并进行相应的处理。

  • 在CIL没有触发器。

不得有使用不支持本机分区的存储引擎的分区表。

在MySQL中,有一些存储引擎不支持分区表,例如MyISAM存储引擎。如果使用不支持分区的存储引擎,那么将无法创建分区表,会提示“ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function”。

为了查看MySQL数据库中是否有使用不支持本机分区的存储引擎的分区表,可以按照以下步骤进行:

  1. 连接到MySQL服务器:可以使用以下命令连接到MySQL服务器(需要替换成实际的用户名和密码):
mysql -u <username> -p
  1. 执行以下命令,列出所有分区表的名称和存储引擎(需要改成你想要的数据库名称):
SELECT table_name, engine
FROM information_schema.tables
WHERE table_schema = 'dbname'
AND partitioned = 'YES';

该命令将返回所有分区表的名称和存储引擎,如果存储引擎是不支持分区的存储引擎,则表示此分区表是使用不支持本机分区的存储引擎创建的。

  1. 根据需要进行修改:如果需要使用分区技术来管理数据,可以将表迁移到支持分区的存储引擎,例如InnoDB存储引擎。可以使用ALTER TABLE语句将现有的分区表迁移到支持分区的存储引擎上,例如:
ALTER TABLE tablename ENGINE=InnoDB;

通过执行以上命令,就可以查看MySQL中使用不支持本机分区的存储引擎创建的分区表,并进行相应的处理。如果需要使用分区技术,建议使用支持分区的存储引擎来创建分区表。

  • 在CIL中未创建分区表,且存储引擎都是InnoDB。

不得出现关键字或保留关键字违规情况。MySQL 8.0 中可能会保留一些以前未保留的关键字。

在MySQL中,关键字和保留关键字是指被MySQL解析器使用的标识符。当用户在创建数据库和表时使用了与关键字或保留关键字相同的名称,可能会导致语法错误和其他异常。

为了查看MySQL数据库中是否出现关键字或保留关键字违规情况,可以按照以下步骤进行:

  1. 连接到MySQL服务器:可以使用以下命令连接到MySQL服务器(需要替换成实际的用户名和密码):
mysql -u <username> -p
  1. 执行以下命令,列出数据库中所有的关键字和保留关键字:
SHOW RESERVED WORDS;

该命令将返回MySQL中当前版本的所有关键字和保留关键字列表。

  1. 执行以下命令,查找数据库中使用了关键字或保留关键字的对象:
SELECT *
FROM information_schema.TABLES
WHERE table_schema = 'database_name' AND table_name
IN (SELECT DISTINCT table_name
FROM information_schema.COLUMNS
WHERE table_schema = 'database_name'
AND (COLUMN_NAME = 'select' OR COLUMN_NAME = 'FROM' OR COLUMN_NAME = 'group_by'));

该命令将返回与关键字或保留关键字(在这里示例选择‘select’, 'FROM', 'group_by')相关的所有对象的列表。

需要注意MySQL 8.0可能会保留一些以前未保留的关键字,因此需要多次执行上述步骤,以便找到所有与当前版本有冲突的关键字和保留关键字。

通过以上步骤,就可以查看MySQL数据库中是否出现关键字或保留关键字违规情况,并进行相应的处理。如果有,则应修改相关对象的名称,以避免与关键字或保留关键字冲突。有关更多信息,请参阅 MySQL 文档中的关键字和保留关键字

  • cil-filehanding数据库中未出现关键字或保留关键字的违规情况。

MySQL 5.7 mysql 系统数据库中不得有与 MySQL 8.0 数据字典使用的表同名的表。

在MySQL中,MySQL 8.0 引入了数据字典,用于存储关于数据库和它们的对象(如表、列和索引)的信息。 MySQL 8.0 数据字典使用performance_schemainformation_schema来存储元数据,而 MySQL 5.7 中的 mysql 系统数据库包含一些带有元数据的表,因此可能会与 MySQL 8.0 数据字典使用的表同名。如果在MySQL 5.7中创建了这些表,则必须将它们重命名,以及在 MySQL 8.0 中还原这些表的名称。

为了查看MySQL 5.7 mysql 系统数据库中是否有与 MySQL 8.0 数据字典使用的表同名的表,可以按照以下步骤进行:

  1. 连接到MySQL 5.7服务器:可以使用以下命令连接到MySQL 5.7服务器(需要替换为实际的用户名和密码):
mysql -u <username> -p
  1. 在命令行中执行以下命令,查看 MySQL 5.7 的 mysql 数据库的所有表:
USE mysql;
SHOW TABLES;

该命令将返回MySQL 5.7 mysql 数据库中的所有表的列表。

  1. 手动比较表名称:根据 MySQL 8.0 数据字典使用的表的名称,手动比较MySQL 5.7 mysql 数据库中的表名,以确定是否存在名称相同的表。 MySQL 8.0 数据字典使用的表的名称可以参考MySQL官方文档。

  2. 重命名同名表:如果MySQL 5.7 mysql 数据库中存在与 MySQL 8.0 数据字典使用的表同名的表,则必须将这些表重命名,以便在 MySQL 8.0 中还原这些表的名称。可以使用以下命令将表重命名(例如,将user表重命名为user_old):

RENAME TABLE table_name TO new_table_name;

通过以上步骤,就可以查看MySQL 5.7 mysql 系统数据库中是否有与 MySQL 8.0 数据字典使用的表同名的表,并进行相应的处理。

  • cil-filehanding数据库中没有与Mysql8表同名情况。

sql_mode 系统变量设置中不得定义过时的 SQL 模式。

在MySQL中,sql_mode是一个设置SQL执行模式的系统变量,它决定了MySQL在执行SQL操作时的行为。MySQL 8.0 带来了一些新的SQL模式,同时废弃或预定了一些老的SQL模式。在查看sql_mode 系统变量设置中是否有定义过时的 SQL 模式时,需要了解MySQL当前版本所支持的SQL模式,以及哪些被废弃或预定。

在 MySQL 8 中,一些 SQL 模式已被标记为过时的模式,这些过时的模式包括:

  1. STRICT_TRANS_TABLES:严格模式,如果数据插入时存在类型不兼容或溢出,则返回警告或错误。

  2. STRICT_ALL_TABLES:与 STRICT_TRANS_TABLES 相同,但会在 UPDATE 和 DELETE 语句中检查数据。

  3. TRADITIONAL:启用了严格模式和其他一些检查规则,以确保更高的数据安全性和准确性。

  4. ANSI:启用了与 ANSI SQL 标准相对应的检查规则。

这些过时的模式在未来的 MySQL 版本中可能会被删除或废弃,建议尽可能使用更严格的 SQL 模式,以确保更高的数据安全性和准确性。如果旧的应用程序需要使用这些过时的模式,则可以使用兼容性选项,但是需要注意这些选项可能会降低数据库的安全性。

以下是一些查看sql_mode 系统变量设置中是否有定义过时的 SQL 模式的方法:

  1. 连接到MySQL服务器:可以使用以下命令连接到MySQL服务器(需要替换为实际的用户名和密码):
mysql -u <username> -p
  1. 执行以下命令查看全局sql_mode系统变量的值:
SHOW GLOBAL VARIABLES LIKE 'sql_mode';

该命令将返回全局sql_mode系统变量的设置值。

  1. 使用MySQL官方文档检查SQL模式: 需要使用MySQL官方文档中对应版本的文档来查看当前版本所支持的SQL模式,以及哪些被废弃或预定。通常来说,被废弃的SQL模式意味着MySQL将来可能会删除这些功能,因此建议尽早修改应用程序以避免使用这些功能。

  2. 删除过时的SQL模式:如果发现sql_mode 系统变量设置中使用了过时的SQL模式,建议删除这些模式,以避免过时的功能对应用程序造成影响。可以使用以下命令删除过时的SQL模式(例如,删除STRICT_TRANS_TABLES模式):

SET GLOBAL sql_mode='modes';

通过以上步骤,就可以查看sql_mode 系统变量设置中是否有定义过时的 SQL 模式,并进行相应的处理。需要注意的是,在删除和修改sql_mode 系统变量时,应该小心操作,并确保对应用程序没有负面影响。建议在修改sql_mode 系统变量之前进行备份和测试。

  • CIL中使用的是NO_ENGINE_SUBSTITUTION模式,表示MySQL当启用某个存储引擎失败(通常是InnoDB),它会继续处理而不崩溃,但将默认使用MyISAM或MEMORY表并生成一条警告。这里的 sql_mode 变量值意味着MySQL不会在存储引擎不可用时自动用另一个可用的存储引擎替换它,而只是返回一个错误或警告。

不得有包含超过 255 个字符或 1020 个字节的单个 ENUMSET 列元素的表或存储过程。

在MySQL中,一个ENUM或SET列元素最多包含255个字符或1020个字节,如果一个ENUM或SET列元素包含超过255个字符或1020个字节,那么将不能正确地对列进行排序和检索。在应用程序开发中,经常会遇到这个问题,因此需要在创建表或编写存储过程时避免这种情况。

  • springboot数据库表中未使用ENUM或SET类型。

在升级到 MySQL 8.0.13 或更高版本之前,不得有驻留在共享 InnoDB 表空间中的表分区。

在将MySQL 5.7升级到MySQL 8之前,可以执行以下操作来检查是否存在共享InnoDB表空间中的表分区:

  1. 在MySQL 5.7中运行以下查询以获取InnoDB表空间的信息:

    SELECT
    CONCAT(table_schema, '.', table_name) as `table`,
    COUNT(*) as `count`,
    round(sum(file_size) / 1024 / 1024, 2) as `size (MB)`
    FROM information_schema.innodb_sys_tables t1
    INNER JOIN information_schema.innodb_sys_tablespaces t2
    ON t1.space_id = t2.space_id
    WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema')
    GROUP BY table_schema, table_name;
    
  2. 确定上述查询是否包括InnoDB表分区。

  3. 如果存在InnoDB表分区,则需要手动重构表以将分区移出共享表空间。这可以通过将每个分区迁移到单独的表空间来完成。

  4. 完成此操作后,可以将MySQL 5.7升级到MySQL 8或将MySQL升级到MySQL 8.0.13或更高版本。

  • CIL中没有驻留在共享InnoDB表空间中的表分区。

MySQL 8.0.12 或更低版本中不得有对 ASC 子句使用 DESCGROUP BY 限定符的查询和存储程序定义。

  • 在springboot应用程序中并未使用ASCDESCGROUP BY函数。

    • 您的 MySQL 5.7 安装不得使用 MySQL 8.0 不支持的功能。

      有关更多信息,请参阅 MySQL 文档中的 MySQL 8.0 中删除的功能

数据库字符集utf8mb3升级为utf8mb4

要获得改进的 Unicode 支持,请考虑将使用 utf8mb3 字符集的对象转换为使用 utf8mb4 字符集。utf8mb3 字符集已弃用。此外,请考虑对字符集引用使用 utf8mb4 而不是 utf8,因为 utf8 当前是 utf8mb3 字符集的别名。

如果您升级MySQL 5.7数据库到MySQL 8之后,所有表的字符集都是utf8,那么在升级过程中,这些表的字符集会自动更改为utf8mb4。这是因为MySQL 8默认使用的是utf8mb4字符集,可以存储更多的Unicode字符。

在MySQL 8中,utf8mb4是默认字符集,与MySQL 5.7的utf8字符集不同。如果您的旧表仍在使用utf8字符集,那么在将这些表升级到MySQL 8之前,您需要执行以下两个步骤:

  1. 将表升级为utf8mb4字符集

    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

    table_name替换为表的实际名称。

  2. 修改MySQL服务器配置文件以允许更长的标识符

    在MySQL 8中,标识符的最大长度是64个字符。如果表或列名称超过这个长度,则需要修改MySQL配置文件以允许更长的标识符。

    打开MySQL配置文件(my.cnf或my.ini),添加以下内容:

    [mysqld]
    innodb_file_format=Barracuda
    innodb_file_per_table=ON
    innodb_large_prefix=ON
    

    然后保存文件并重启MySQL服务器,以应用更改。

一旦完成上述两个步骤,您的表就处于utf8mb4字符集和MySQL 8的标识符长度限制下。

有关更多信息,请参阅 MySQL 文档中的 utf8mb3 字符集(3 字节 UTF-8 Unicode 编码)

  • 在CIL中使用的是uft8字符集,在RDS中的mysql5.7升级到mysql8时,依旧保持utf8字符集,所以可以不进行修改操作。