暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

2.11.5准备安装进行升级

原创 由迪 2020-11-02
313

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

可以使用MySQL Shell升级检查器实用程序执行相同的检查和其他检查。有关更多信息,请参见 Upgrade Checker Utility

初步检查:

  1. 不得存在以下问题:

    • 不得有使用过时数据类型或功能的表。

      不支持就地升级到MySQL 8.0,如果表包含在预5.6.4格式老时间列(TIMEDATETIME,和 TIMESTAMP列不为小数秒精度支持)。如果您的表仍然使用旧的时间列格式,请REPAIR TABLE在尝试就地升级到MySQL 8.0之前使用对其进行升级。欲了解更多信息,请参见 服务器的变化,在 MySQL的5.7参考手册

    • 不能有孤立.frm文件。

    • 触发器不能有遗漏或空定义者或无效的创作环境(由表示 character_set_clientcollation_connectionDatabase Collation属性显示的 SHOW TRIGGERSINFORMATION_SCHEMA TRIGGERS表)。任何此类触发器都必须转储并还原以解决该问题。

    要检查这些问题,请执行以下命令:

    mysqlcheck -u root -p --all-databases --check-upgrade
    

    如果mysqlcheck报告任何错误,请更正问题。

  2. 不得有使用不具有本机分区支持的存储引擎的分区表。要标识此类表,请执行以下查询:

    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,请参见 第15.6.1.5节“将表从MyISAM转换为InnoDB”

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

    ALTER TABLE table_name REMOVE PARTITIONING;
  3. 在MySQL 8.0中可能保留了一些以前未保留的关键字。请参见第9.3节“关键字和保留字”。这可能导致以前用作标识符的单词变得非法。要修复受影响的语句,请使用标识符引号。请参见第9.2节“模式对象名称”

  4. MySQL 5.7mysql系统数据库中的表不得 与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)。这也可能需要更改使用受影响表的应用程序。

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

  6. sql_mode系统变量 不得定义过时的SQL模式 。尝试使用过时的SQL模式会阻止MySQL 8.0的启动。使用过时的SQL模式的应用程序应该进行修改以避免它们。有关在MySQL 8.0中删除的SQL模式的信息,请参阅 服务器更改

  7. 不得有明确定义的列名超过64个字符的视图(MySQL 5.7中允许使用列名最大为255个字符的视图)。为避免升级错误,应在升级之前更改此类视图。当前,识别列名称超过64个字符的视图的唯一方法是使用来检查视图定义SHOW CREATE VIEW。您也可以通过查询INFORMATION_SCHEMA.VIEWS表来检查视图定义 。

  8. 表或存储过程中的单个 ENUMSET列元素的长度不得超过255个字符或1020个字节。在MySQL 8.0之前,ENUMSET列元素的最大组合长度为64K。在MySQL 8.0中,单个ENUMSET列元素的最大字符长度为255个字符,最大字节长度为1020个字节。(1020字节限制支持多字节字符集)。在升级到MySQL 8.0之前,请修改超出新限制的任何元素ENUMSET列元素。否则,将导致升级失败并显示错误。

  9. 升级到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);
  10. MySQL 8.0.12或更低版本中不得有使用子句ASCDESC限定符的查询和存储程序定义GROUP BY。否则,升级到MySQL 8.0.13或更高版本可能会失败,就像复制到MySQL 8.0.13或更高版本的副本服务器一样。有关更多详细信息,请参见 SQL更改

  11. 您的MySQL 5.7安装不得使用MySQL 8.0不支持的功能。此处的任何更改都必须是特定于安装的,但以下示例说明了要查找的内容:

    一些服务器启动选项和系统变量已在MySQL 8.0中删除。请参见 在MySQL 8.0中删除的功能第1.4节“在MySQL 8.0中添加,不建议使用或删除的服务器和状态变量和选项”。如果使用其中任何一种,则升级需要更改配置。

    示例:由于数据字典提供了有关数据库对象的信息,因此服务器不再检查数据目录中的目录名称以查找数据库。因此,该--ignore-db-dir选项是多余的,已被删除。要解决此问题,请--ignore-db-dir从启动配置中删除所有实例 。另外,在升级到MySQL 8.0之前,请删除或移动命名的数据目录子目录。(或者,让8.0服务器将这些目录作为数据库添加到数据字典中,然后使用删除每个数据库 DROP DATABASE。)

  12. 如果打算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,升级过程会检查表名和模式名,以确保所有字符均为小写。如果发现表或架构名称包含大写字符,则升级过程将失败并显示错误。

    注意

    lower_case_table_names 不建议在升级时 更改 设置。

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论