3.6 准备升级安装
在升级到最新的 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
或TRIGGERS
表)中的任何触发器。任何这样的触发器必须被dump并恢复以解决问题。
要检查这些问题,请执行以下命令:
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
的信息,请见Section 17.6.1.5, “Converting Tables from MyISAM to InnoDB”。要将分区表设置为非分区表,请执行以下语句:
ALTER TABLE table_name REMOVE PARTITIONING;
-
MySQL 8.4 中可能有某些关键字之前没有的保留字。见Section 11.3, “Keywords and Reserved Words”。这可能会导致之前使用的单词变为非法。要修复受影响的语句,请使用标识符引号。见Section 11.2, “Schema Object Names”。
-
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 模式,定义在
sql_mode
系统变量中。尝试使用过时的 SQL 模式将阻止 MySQL 8.4 启动。使用过时 SQL 模式的应用程序应该被修改以避免它们。关于 MySQL 8.4 中删除的 SQL 模式,请见 Server Changes。 -
不能存在视图,其中列名超过 64 个字符(MySQL 5.7 中允许的最大列名长度为 255 个字符)。为了避免升级错误,需要在升级前修改这些视图。当前,唯一的方法是使用
SHOW CREATE VIEW
查看视图定义。您也可以通过查询信息_schemaVIEWS
表来查看视图定义。 -
不能存在表或存储过程,其中
ENUM
或SET
列元素的长度超过 255 个字符或 1020 字节。在 MySQL 8.4 中,单个ENUM
或SET
列元素的最大长度为 255 个字符,最大字节长度为 1020 字节(支持多字节字符集)。在升级到 MySQL 8.0 前,需要修改任何超过新限制的ENUM
或SET
列元素。否则,升级将失败。 -
您的 MySQL 8.3 安装不能使用 MySQL 8.4 不支持的功能。任何更改都是安装特定的,但以下示例illustrates the kind of thing to look for:
一些服务器启动选项和系统变量在 MySQL 8.4 中被删除。见 Features Removed in MySQL 8.4,和 Section 1.5, “Server and Status Variables and Options Added, Deprecated, or Removed in MySQL 8.4 since 8.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
,升级过程将检查表和架构名,以确保所有字符都是小写。如果发现表或架构名包含大写字符,升级过程将以错误结束。Note在升级时更改
lower_case_table_names
设置不推荐。
如果由于上述问题之一升级到MySQL 8.4失败,服务器将撤销对数据目录的所有更改。在这种情况下,删除所有redo日志文件,并在现有数据目录上重新启动MySQL 8.3服务器以解决错误。redo日志文件(ib_logfile*
)默认位于MySQL数据目录中。修复错误后,执行慢速关机(设置innodb_fast_shutdown=0
)然后再尝试升级。