在升级到最新的 MySQL 8.3 版本之前,请确保当前 MySQL 8.2 或 MySQL 8.0 服务器实例的升级就绪状态,通过执行以下预检查。如果不这样做,升级过程可能会失败。
考虑使用 MySQL Shell 升级检查工具,该工具可以验证 MySQL 服务器实例是否准备好升级。你可以选择要升级到的目标 MySQL 服务器版本,从 MySQL 服务器 8.0.11 到当前 MySQL Shell 版本号。升级检查工具将执行自动检查,以确保升级的相关性,并建议您手动执行其他相关检查。升级检查工具适用于所有 GA 版本的 MySQL 5.7、8.0 和 8.3。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.3 中被保留,而之前不被保留。这可以导致以前用作标识符的单词变得非法。要修复受影响的语句,请使用标识符引号。请参阅 第 11.2 节,“模式对象名称”。
-
不得有在 MySQL 8.2
mysql
系统数据库中具有相同名称的表,该名称与 MySQL 8.3 数据词典中使用的表名称相同。要标识具有这些名称的表,请执行以下查询: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 个字符的名称重新添加约束(使用
ALTER TABLE
)。 -
不得有使用过时的 SQL 模式定义的
sql_mode
系统变量。尝试使用过时的 SQL 模式将阻止 MySQL 8.3 启动。使用过时 SQL 模式的应用程序应该被修订以避免它们。有关 MySQL 8.3 中删除的 SQL 模式的信息,请参阅 服务器更改。 -
必须没有视图具有明确定义的列名超过64个字符(在MySQL 5.7中,视图的列名最多允许255个字符)。为了避免升级错误,这些视图应该在升级之前被修改。目前,唯一识别视图的列名超过64个字符的方法是使用
SHOW CREATE VIEW
。您也可以通过查询信息模式VIEWS
表来检查视图定义。 -
必须没有表或存储过程具有单个
ENUM
或SET
列元素超过255个字符或1020字节的长度。在MySQL 8.3之前,ENUM
或SET
列元素的最大组合长度为64K。在MySQL 8.3中,单个ENUM
或SET
列元素的最大字符长度为255个字符,最大字节长度为1020字节(支持多字节字符集)。在升级到MySQL 8.0之前,修改任何ENUM
或SET
列元素,以免升级失败并出现错误。 -
您的MySQL 8.2安装不得使用不受MySQL 8.3支持的功能。任何更改都将是安装特定的,但以下示例说明了要查找的内容:
一些服务器启动选项和系统变量在MySQL 8.3中已被删除。请参阅删除的功能,和第1.4节,“服务器和状态变量和选项添加、弃用或删除在MySQL 8.3”。如果您使用了这些选项,升级将需要配置更改。
-
如果您计划在升级时将
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
,升级过程将检查模式和表名,以确保所有字符都是小写的。如果发现表或模式名包含大写字符,升级过程将失败并出现错误。Note不建议在升级时更改
lower_case_table_names
设置。
如果升级到MySQL 8.3失败由于上述任何问题,服务器将还原所有对数据目录的更改。在这种情况下,删除所有重做日志文件,并重新启动MySQL 8.2服务器以解决错误。重做日志文件(ib_logfile*
)默认位于MySQL数据目录中。修复错误后,执行慢关闭(通过设置innodb_fast_shutdown=0
)之前再次尝试升级。