MySQL 8.4 Reference Manual  /  Upgrading MySQL  /  Preparing Your Installation for Upgrade

3.6 准备升级安装

在升级到最新的 MySQL 8.4 版本之前,确保您的当前 MySQL 8.3 或 MySQL 8.4 服务器实例的升级准备状态,通过以下预检查。否则,升级过程可能会失败。

Tip

考虑使用MySQL Shell 升级检查工具,该工具可以帮助您验证 MySQL 服务器实例是否准备好升级。您可以选择要升级到的 MySQL 服务器版本,范围从 MySQL 8.0.11 到当前 MySQL Shell 版本号对应的 MySQL 服务器版本号。升级检查工具将执行与指定目标版本相关的自动检查,并建议您手动执行其他检查。升级检查工具适用于 MySQL 5.7、8.0 和 8.3 的所有 GA 版本。MySQL Shell 安装说明可以在这里找到。

预检查:

  1. 以下问题不能存在:

    • 不能存在使用过时数据类型或函数的表。

    • 不能存在孤儿.frm文件。

    • 触发器不能缺少或为空的定义或无效的创建上下文(由character_set_clientcollation_connectionDatabase Collation属性显示的SHOW TRIGGERSTRIGGERS表)中的任何触发器。任何这样的触发器必须被dump并恢复以解决问题。

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

    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的信息,请见Section 17.6.1.5, “Converting Tables from MyISAM to InnoDB”

    要将分区表设置为非分区表,请执行以下语句:

    ALTER TABLE table_name REMOVE PARTITIONING;
  3. MySQL 8.4 中可能有某些关键字之前没有的保留字。见Section 11.3, “Keywords and Reserved Words”。这可能会导致之前使用的单词变为非法。要修复受影响的语句,请使用标识符引号。见Section 11.2, “Schema Object Names”

  4. 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)。这可能还需要修改使用受影响表的应用程序。

  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 模式,定义在 sql_mode 系统变量中。尝试使用过时的 SQL 模式将阻止 MySQL 8.4 启动。使用过时 SQL 模式的应用程序应该被修改以避免它们。关于 MySQL 8.4 中删除的 SQL 模式,请见 Server Changes

  7. 不能存在视图,其中列名超过 64 个字符(MySQL 5.7 中允许的最大列名长度为 255 个字符)。为了避免升级错误,需要在升级前修改这些视图。当前,唯一的方法是使用 SHOW CREATE VIEW 查看视图定义。您也可以通过查询信息_schema VIEWS 表来查看视图定义。

  8. 不能存在表或存储过程,其中 ENUMSET 列元素的长度超过 255 个字符或 1020 字节。在 MySQL 8.4 中,单个 ENUMSET 列元素的最大长度为 255 个字符,最大字节长度为 1020 字节(支持多字节字符集)。在升级到 MySQL 8.0 前,需要修改任何超过新限制的 ENUMSET 列元素。否则,升级将失败。

  9. 您的 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”。如果您使用这些选项或变量,升级需要配置更改。

  10. 如果您计划在升级时将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)然后再尝试升级。