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_client、collation_connection、Database Collation属性显示的SHOW TRIGGERS或TRIGGERS表)中的任何触发器。任何这样的触发器必须被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. 不能存在表或存储过程,其中 ENUM 或 SET 列元素的长度超过 255 个字符或 1020 字节。在 MySQL 8.4 中,单个 ENUM 或 SET 列元素的最大长度为 255 个字符,最大字节长度为 1020 字节(支持多字节字符集)。在升级到 MySQL 8.0 前,需要修改任何超过新限制的 ENUM 或 SET 列元素。否则,升级将失败。

  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)然后再尝试升级。