MySQL升级到8.0前的检查

升级前检查

在升级到最新的MySQL 8.0版本之前,请通过执行以下所述的初步检查,确保当前MySQL 5.7或MySQL 8.0服务器实例的升级准备就绪。否则升级过程可能会失败。

可以使用MySQL Shell升级检查器实用程序执行相同的检查和其他检查。

初步检查:

  1. 不得出现以下问题:
  • 不得有使用过时数据类型或功能的表。
    如果表包含5.6.4之前的格式的旧时态列(TIME,DATETIME和TIMESTAMP列,但不支持小数秒精度),则不支持就地升级到MySQL 8.0。如果您的表仍然使用旧的时态列格式,请在尝试就地升级到MySQL 8.0之前,使用REPAIR TABLE对其进行升级。
  • 不得有孤立的.frm文件。
  • 触发器不得具有丢失或为空的定义器或无效的创建上下文(由SHOW TRIGGERS或INFORMATION_SCHEMA TRIGGERS表显示的character_set_client,collat​​ion_connection,Database Collat​​ion属性指示)。任何此类触发器都必须转储并还原以解决问题。
    要检查这些问题,请执行以下命令:
mysqlcheck -u root -p --all-databases --check-upgrade
  1. 不得有使用不具有本机分区支持的存储引擎的分区表。要标识此类表,请执行以下查询:
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;

要使分区表成为非分区表,请执行以下语句:

ALTER TABLE table_name REMOVE PARTITIONING;
  1. 在MySQL 8.0中可能保留了一些以前未保留的关键字。这可能导致以前用作标识符的单词变得非法。要修复受影响的语句,请使用标识符引号。
  2. MySQL 5.7 mysql系统数据库中不得存在与MySQL 8.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)。这也可能需要更改使用受影响表的应用程序。

  1. 不得有外键约束名称超过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)。

  1. 不得在sql_mode系统变量设置中定义过时的SQL模式。尝试使用过时的SQL模式将导致MySQL 8.0的启动失败。使用过时的SQL模式的应用程序也应该进行修改以避免它们。有关在MySQL 8.0中删除的SQL模式的信息
  2. 不得有明确定义的列名超过64个字符的视图(MySQL 5.7允许使用列名最大为255个字符的视图)。为避免升级错误,应在升级之前更改此类视图。当前,识别列名称超过64个字符的视图的唯一方法是使用SHOW CREATE VIEW检查视图定义。您还可以通过查询INFORMATION_SCHEMA.VIEWS表来检查视图定义。
  3. 不能有单个ENUM或SET列元素的表或存储过程超过255个字符或1020个字节的长度。在MySQL 8.0之前,ENUM或SET列元素的最大组合长度为64K。在MySQL 8.0中,单个ENUM或SET列元素的最大字符长度为255个字符,最大字节长度为1020个字节。(1020字节限制支持多字节字符集)。在升级到MySQL 8.0之前,请修改超出新限制的所有ENUM或SET列元素。否则,将导致升级失败并显示错误。
  4. 在升级到MySQL 8.0.13或更高版本之前,必须不存在驻留在共享InnoDB表空间中的表分区,这些表空间包括系统表空间和常规表空间。通过查询INFORMATION_SCHEMA来识别共享表空间中的表分区:
    如果从MySQL 5.7升级,请运行以下查询:
SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES 
  WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';

如果从早期的MySQL 8.0版本升级,请运行以下查询:

SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLES 
  WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';

使用ALTER TABLE ... REORGANIZE PARTITION将表分区从共享表空间移至每个表文件表空间:

ALTER TABLE table_name REORGANIZE PARTITION partition_name 
  INTO (partition_definition TABLESPACE=innodb_file_per_table);
  1. MySQL 8.0.12或更低版本中不得存在使用GROUP BY子句的ASC或DESC限定符的查询和存储程序定义。否则,升级到MySQL 8.0.13或更高版本可能会失败,可能会复制到MySQL 8.0.13或更高版本的从服务器。
  2. 您的MySQL 5.7安装不得使用MySQL 8.0不支持的功能。此处的任何更改都必须是特定于安装的,但以下示例说明了要查找的内容:一些服务器启动选项和系统变量已在MySQL 8.0中删除。如果使用其中任何一种,则升级需要更改配置。
  3. 如果打算在升级时将lower_case_table_names设置更改为1,请在升级之前确保方案和表名均为小写。否则,由于架构或表名字母大小写不匹配,可能会发生故障。可以使用以下查询来检查包含大写字符的架构和表名称:
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != LOWER(TABLE_NAME) AND TABLE_TYPE = 'BASE TABLE';
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME != LOWER(SCHEMA_NAME);

从MySQL 8.0.19开始,如果lower_case_table_names = 1,则升级过程将检查表和架构名称,以确保所有字符均为小写。如果发现表或架构名称包含大写字符,则升级过程将失败并显示错误。

如果由于上述任何问题升级到MySQL 8.0失败,则服务器会将所有更改都还原到数据目录。在这种情况下,请删除所有重做日志文件,然后在现有数据目录上重新启动MySQL 5.7服务器以解决错误。缺省情况下,重做日志文件(ib_logfile *)位于MySQL数据目录中。修复错误之后,请执行缓慢关机(通过设置innodb_fast_shutdown = 0),然后再次尝试升级。

你可能感兴趣的:(MySQL升级到8.0前的检查)