备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 MySQL解决方案工程师 MySQL升级至8.0需要考虑哪些因素?
1 0

海报分享

MySQL升级至8.0需要考虑哪些因素?

MySQL8.0已经推出2年多了,是时候考虑将您的MySQL升级至8.0版本了。在升级之前需要考虑哪些因素呢?本文将为您解答。

看过之前文章升级吗?的朋友可能已经了解MySQL8.0推出了一款升级检查工具,使用它,可以对正在使用的MySQL5.7进行一个全方位的检查,主要内容包括以下十个方面:

一,MySQL8.0使用了新的数据字典,数据字典的内容以InnoDB表的形式保存在系统数据库mysql下面,因此,需要检查现有的数据库里面是否存在重名的表,如果存在,需要进行更改。表名包括 ‘catalogs’, ‘character_sets’, ‘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’ 。可以在5.7里面执行下面的语句来确认是否存在重名的表。

SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
     WHERE LOWER(TABLE_SCHEMA) = 'mysql'
     and LOWER(TABLE_NAME) IN
     'catalogs',
     'character_sets',
     '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'
     );

二,数据类型。如果表字段使用了过于“古老”的数据类型,升级8.0将会产生错误。可以在5.7版本里面执行CHECK TABLE…FOR UPGRADE或mysqlcheck来识别这些表。这些表无法升级,可以通过执行REPAIR TABLE进行修复。

三,MySQL8.0的分区表不支持非原生分区,如果有该类型的表,将无法升级。可以执行下面的SQL找出是否存在该类型的表。

SELECT 
    TABLE_SCHEMA, TABLE_NAME
    INFORMATION_SCHEMA.TABLES
WHERE
    ENGINE NOT IN ('innodb' , 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

可以将这类表的存储引擎转换为InnoDB或者是删除分区。

四,MySQL 5.0.17之前的CREATE TRIGGER不支持定义属性。这类触发器可以在5.7版本通过运行 mysqlcheck 使用 check-upgrade 选项或者运行 CHECK TABLE 识别。

五,在MySQL 8.0之前的版本中,当用户未明确指定表名时,InnoDB通过在表名后附加'_ibfk_X'(其中X是数字)来自动生成外键约束名。如果表名是多字节64个字符,自动生成的外键约束名称将超过64个字符,MySQL8.0将无法支持。可以通过下面的SQL别该类表:

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);

这类表可以通过删除约束并通过添加具有显式约束名称的约束来进行更改。

六,在MySQL 8.0之前,用户可以使用最多255个字符的显式列名称创建视图。MySQL 8.0不支持显式列名大于64个字符的视图。可以通过 在MySQL 5.7中执行SHOW CREATE VIEW来识别这些视图。

七,在MySQL 8.0之前,所有枚举元素以2字节存储在FRM文件中,总长度可能会达到约64k,因此,可以使用大于255个字符的枚举元素创建表和存储过程。但是在MySQL 8.0中,不支持包含于255个字符的表或存储过程。升级之前应该更改这些表或存储过程。

八,升级“ frm”文件和InnoDB字典中元数据信息不匹配的表会导致错误。原因可能是frm损坏。在升级之前,可以通过dump和restore此类表。