Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

3.6 准备升级安装

在升级到最新的 MySQL 8.3 版本之前,请确保当前 MySQL 8.2 或 MySQL 8.0 服务器实例的升级就绪状态,通过执行以下预检查。如果不这样做,升级过程可能会失败。

Tip

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

预检查:

  1. 以下问题不得存在:

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

    • 不得有孤立的 .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 的信息,请参阅 第 17.6.1.5 节,“将表从 MyISAM 转换为 InnoDB”

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

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

  4. 不得有在 MySQL 8.2 mysql 系统数据库中具有相同名称的表,该名称与 MySQL 8.3 数据词典中使用的表名称相同。要标识具有这些名称的表,请执行以下查询:

    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 个字符的名称重新添加约束(使用 ALTER TABLE)。

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

  7. 必须没有视图具有明确定义的列名超过64个字符(在MySQL 5.7中,视图的列名最多允许255个字符)。为了避免升级错误,这些视图应该在升级之前被修改。目前,唯一识别视图的列名超过64个字符的方法是使用SHOW CREATE VIEW。您也可以通过查询信息模式VIEWS表来检查视图定义。

  8. 必须没有表或存储过程具有单个ENUMSET列元素超过255个字符或1020字节的长度。在MySQL 8.3之前,ENUMSET列元素的最大组合长度为64K。在MySQL 8.3中,单个ENUMSET列元素的最大字符长度为255个字符,最大字节长度为1020字节(支持多字节字符集)。在升级到MySQL 8.0之前,修改任何ENUMSET列元素,以免升级失败并出现错误。

  9. 您的MySQL 8.2安装不得使用不受MySQL 8.3支持的功能。任何更改都将是安装特定的,但以下示例说明了要查找的内容:

    一些服务器启动选项和系统变量在MySQL 8.3中已被删除。请参阅删除的功能,和第1.4节,“服务器和状态变量和选项添加、弃用或删除在MySQL 8.3”。如果您使用了这些选项,升级将需要配置更改。

  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.3失败由于上述任何问题,服务器将还原所有对数据目录的更改。在这种情况下,删除所有重做日志文件,并重新启动MySQL 8.2服务器以解决错误。重做日志文件(ib_logfile*)默认位于MySQL数据目录中。修复错误后,执行慢关闭(通过设置innodb_fast_shutdown=0)之前再次尝试升级。