在升级到最新的 MySQL 9.0 版本之前,请通过执行以下所述的初步检查来确保当前 MySQL 8.4 或 MySQL 8.4 服务器实例已准备好升级。否则,升级过程可能会失败。
请考虑使用 MySQL Shell 升级检查器实用程序,该实用程序使您能够验证 MySQL 服务器实例是否已准备好升级。您可以选择计划升级到的目标 MySQL 服务器版本,范围从 MySQL 服务器 8.0.11 到与当前 MySQL Shell 版本号匹配的 MySQL 服务器版本号。升级检查器实用程序会执行与指定目标版本相关的自动检查,并建议您手动进行其他相关检查。升级检查器适用于 MySQL 5.7、8.0 和 8.3 的所有 GA 版本。有关 MySQL Shell 的安装说明,请参见此处。
初步检查
以下问题不得存在
不得存在使用过时数据类型或函数的表。
不得存在孤立的
.frm
文件。触发器不得缺少或为空的定义者或无效的创建上下文(由
SHOW TRIGGERS
或INFORMATION_SCHEMA
TRIGGERS
表显示的character_set_client
、collation_connection
、数据库排序规则
属性指示)。必须转储并恢复任何此类触发器才能解决此问题。
要检查这些问题,请执行以下命令
mysqlcheck -u root -p --all-databases --check-upgrade
如果 mysqlcheck 报告任何错误,请更正这些问题。
不得存在使用没有原生分区支持的存储引擎的分区表。要识别此类表,请执行以下查询
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';
查询报告的任何表都必须更改为使用
InnoDB
或设为非分区。要将表存储引擎更改为InnoDB
,请执行以下语句ALTER TABLE table_name ENGINE = INNODB;
有关将
MyISAM
表转换为InnoDB
的信息,请参见 第 17.6.1.5 节“将表从 MyISAM 转换为 InnoDB”。要使分区表变为非分区表,请执行以下语句
ALTER TABLE table_name REMOVE PARTITIONING;
某些关键字在 MySQL 9.0 中可能是保留关键字,而在以前版本中不是。请参见 第 11.3 节“关键字和保留字”。这可能会导致以前用作标识符的字变为非法。要修复受影响的语句,请使用标识符引用。请参见 第 11.2 节“模式对象名称”。
MySQL 8.4
mysql
系统数据库中不得存在与 MySQL 9.0 数据字典使用的表同名的表。要识别具有这些名称的表,请执行以下查询SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE LOWER(TABLE_SCHEMA) = 'mysql' AND LOWER(TABLE_NAME) IN ( 'catalogs', 'character_sets', 'check_constraints', 'collations', 'column_statistics', 'column_type_elements', 'columns', 'dd_properties', 'events', 'foreign_key_column_usage', 'foreign_keys', 'index_column_usage', 'index_partitions', 'index_stats', 'indexes', 'parameter_type_elements', 'parameters', 'resource_groups', 'routines', 'schemata', 'st_spatial_reference_systems', 'table_partition_values', 'table_partitions', 'table_stats', 'tables', 'tablespace_files', 'tablespaces', 'triggers', 'view_routine_usage', 'view_table_usage' );
查询报告的任何表都必须删除或重命名(使用
RENAME TABLE
)。这也可能需要更改使用受影响表的应用程序。不得存在外键约束名称超过 64 个字符的表。使用以下查询来识别约束名称过长的表
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1), INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1) FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);
对于约束名称超过 64 个字符的表,请删除该约束,然后使用不超过 64 个字符的约束名称将其重新添加(使用
ALTER TABLE
)。sql_mode
系统变量定义的 SQL 模式不得已过时。尝试使用过时的 SQL 模式会阻止 MySQL 9.0 启动。应修改使用过时 SQL 模式的应用程序以避免使用它们。有关在 MySQL 9.0 中删除的 SQL 模式的更多信息,请参见 服务器更改。不得存在显式定义的列名超过 64 个字符的视图(MySQL 5.7 中允许列名最多包含 255 个字符的视图)。为避免升级错误,应在升级之前更改此类视图。目前,识别列名超过 64 个字符的视图的唯一方法是使用
SHOW CREATE VIEW
检查视图定义。您还可以通过查询信息模式VIEWS
表来检查视图定义。不得存在单个
ENUM
或SET
列元素的长度超过 255 个字符或 1020 个字节的表或存储过程。在 MySQL 9.0 之前,ENUM
或SET
列元素的最大组合长度为 64KB。在 MySQL 9.0 中,单个ENUM
或SET
列元素的最大字符长度为 255 个字符,最大字节长度为 1020 个字节。(1020 字节限制支持多字节字符集)。在升级到 MySQL 8.0 之前,请修改任何超过新限制的ENUM
或SET
列元素。否则会导致升级失败并出现错误。您的 MySQL 8.4 安装不得使用 MySQL 9.0 不支持的功能。这里的任何更改都必然是特定于安装的,但以下示例说明了要查找的内容
MySQL 9.0 中删除了一些服务器启动选项和系统变量。请参见 MySQL 9.0 中删除的功能,以及 第 1.5 节“自 MySQL 8.4 起在 MySQL 9.0 中添加、弃用或删除的服务器和状态变量和选项”。如果您使用其中任何一个,则升级需要进行配置更改。
如果您打算在升级时将
lower_case_table_names
设置更改为 1,请确保在升级之前模式和表名称为小写。否则,由于模式或表名称字母大小写不匹配,可能会发生故障。您可以使用以下查询来检查包含大写字符的模式和表名称mysql> select TABLE_NAME, if(sha(TABLE_NAME) !=sha(lower(TABLE_NAME)),'Yes','No') as UpperCase from information_schema.tables;
如果
lower_case_table_names=1
,则升级过程会检查表名和模式名,以确保所有字符均为小写。如果发现表名或模式名包含大写字符,则升级过程将失败并显示错误。注意不建议在升级时更改
lower_case_table_names
设置。
如果由于上述任何问题导致升级到 MySQL 9.0 失败,则服务器会将所有更改还原到数据目录。在这种情况下,请删除所有重做日志文件,然后在现有数据目录上重新启动 MySQL 8.4 服务器以解决错误。默认情况下,重做日志文件 (ib_logfile*
) 位于 MySQL 数据目录中。修复错误后,请在再次尝试升级之前执行慢速关闭(通过设置 innodb_fast_shutdown=0
)。