在升级到最新的 MySQL 8.4 版本之前,请通过执行以下说明的初步检查来确保当前的 MySQL 8.3 或 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
文件。触发器不能缺少或为空定义器,也不能有无效的创建上下文(由
character_set_client
、collation_connection
、Database Collation
属性指示,这些属性由SHOW TRIGGERS
或INFORMATION_SCHEMA
TRIGGERS
表显示)。任何此类触发器都必须被转储并恢复,以解决此问题。
要检查这些问题,请执行以下命令
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 8.4 中可能被保留,而之前并未被保留。请参阅 第 11.3 节,“关键字和保留字”。这会导致之前用作标识符的单词变得非法。要修复受影响的语句,请使用标识符引用。请参阅 第 11.2 节,“架构对象名称”。
MySQL 8.3
mysql
系统数据库中不能有任何表与 MySQL 8.4 数据字典使用的表同名。要识别具有这些名称的表,请执行以下查询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 8.4 启动。使用过时 SQL 模式的应用程序应修改以避免使用它们。有关 MySQL 8.4 中删除的 SQL 模式的详细信息,请参阅 服务器更改。不能有任何视图具有显式定义的列名称,这些列名称超过 64 个字符(在 MySQL 5.7 中,允许使用高达 255 个字符的列名称的视图)。为了避免升级错误,此类视图应在升级之前进行更改。目前,识别具有超过 64 个字符的列名称的视图的唯一方法是使用
SHOW CREATE VIEW
检查视图定义。您还可以通过查询 Information SchemaVIEWS
表来检查视图定义。不能有任何表或存储过程的单个
ENUM
或SET
列元素超过 255 个字符或 1020 字节。在 MySQL 8.4 之前,ENUM
或SET
列元素的总长度最大为 64K。在 MySQL 8.4 中,单个ENUM
或SET
列元素的最大字符长度为 255 个字符,最大字节长度为 1020 字节。(1020 字节的限制支持多字节字符集)。在升级到 MySQL 8.0 之前,请修改任何超过新限制的ENUM
或SET
列元素。如果未能这样做,会导致升级失败并出现错误。您的 MySQL 8.3 安装不能使用 MySQL 8.4 不支持的功能。任何此处的更改必然是特定于安装的,但以下示例说明了要查找的内容
某些服务器启动选项和系统变量已在 MySQL 8.4 中删除。请参阅 MySQL 8.4 中删除的功能 和 第 1.5 节,“自 8.0 以来在 MySQL 8.4 中添加、弃用或删除的服务器和状态变量和选项”。如果您使用任何这些功能,升级需要进行配置更改。
如果您打算在升级时将
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 8.4 失败,服务器会将对数据目录的所有更改还原。在这种情况下,请删除所有重做日志文件并重新启动现有数据目录上的 MySQL 8.3 服务器以解决错误。默认情况下,重做日志文件 (ib_logfile*
) 位于 MySQL 数据目录中。在修复错误后,在再次尝试升级之前,请执行缓慢关闭(通过设置 innodb_fast_shutdown=0
)。