upgrade-prerequisites.md 10.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
### 2.11.5 准备升级安装

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

提示

考虑使用[MySQL Shell 升级检查器实用程序](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-upgrade.html)这使您能够验证 MySQL 服务器实例是否已准备好升级。您可以选择计划升级到的目标 MySQL Server 版本,范围从 MySQL Server 8.0.11 到与当前 MySQL Shell 版本号匹配的 MySQL Server 版本号。升级检查器实用程序执行与指定目标版本相关的自动检查,并建议您应该手动进行进一步的相关检查。升级检查器适用于 MySQL 5.7 和 8.0 的所有 GA 版本。可以找到 MySQL Shell 的安装说明[这里](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-install.html).

初步检查:

1.  不得存在以下问题:

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

        如果表包含 5.6.4 之前格式的旧时态列,则不支持就地升级到 MySQL 8.0 ([`时间`](time.html),[`约会时间`](datetime.html), 和[`时间戳`](datetime.html)不支持小数秒精度的列)。如果您的表仍使用旧的时间列格式,请使用[`维修台`](repair-table.html)在尝试就地升级到 MySQL 8.0 之前。有关详细信息,请参阅[服务器更改](https://dev.mysql.com/doc/refman/5.7/en/upgrading-from-previous-series.html#upgrade-server-changes), 在[MySQL 5.7 参考手册](https://dev.mysql.com/doc/refman/5.7/en/).

    -   不能有孤儿`.frm`文件。

    -   触发器不得缺少或为空的定义器或无效的创建上下文(由`character_set_client`,`collat​​ion_connection`,`数据库整理`显示的属性[`显示触发器`](show-triggers.html)或者`INFORMATION_SCHEMA` [`触发器`](information-schema-triggers-table.html)桌子)。必须转储并恢复任何此类触发器以解决问题。

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

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

    如果[**mysql检查**](mysqlcheck.html)报告任何错误,纠正问题。

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”](converting-tables-to-innodb.html).

    要使分区表不分区,请执行以下语句:

    ```
    ALTER TABLE table_name REMOVE PARTITIONING;
    ```

3.  MySQL 8.0 中可能保留了一些以前未保留的关键字。看[第 9.3 节,“关键字和保留字”](keywords.html).这可能导致以前用作标识符的单词变得非法。要修复受影响的语句,请使用标识符引用。看[第 9.2 节,“架构对象名称”](identifiers.html).

4.  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.html))。这也可能需要对使用受影响表的应用程序进行更改。

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.html))。

6.  必须没有过时的 SQL 模式定义[`sql_mode`](server-system-variables.html#sysvar_sql_mode)系统变量。尝试使用过时的 SQL 模式会阻止 MySQL 8.0 启动。应修改使用过时 SQL 模式的应用程序以避免它们。有关 MySQL 8.0 中删除的 SQL 模式的信息,请参阅[服务器更改](upgrading-from-previous-series.html#upgrade-server-changes).

7.  不允许有超过 64 个字符的显式定义的列名的视图(MySQL 5.7 中允许列名最多 255 个字符的视图)。为避免升级错误,应在升级前更改此类视图。目前,识别列名超过 64 个字符的视图的唯一方法是使用以下方法检查视图定义[`显示创建视图`](show-create-view.html).您还可以通过查询[`INFORMATION_SCHEMA.VIEWS`](information-schema-views-table.html)桌子。

8.  不能有单独的表或存储过程`枚举`要么`放`长度超过 255 个字符或 1020 个字节的列元素。在 MySQL 8.0 之前,最大组合长度为`枚举`要么`放`列元素为 64K。在 MySQL 8.0 中,个人的最大字符长度`枚举`要么`放`列元素为 255 个字符,最大字节长度为 1020 字节。(1020 字节限制支持多字节字符集)。在升级到 MySQL 8.0 之前,修改任何`枚举`要么`放`超出新限制的列元素。否则会导致升级失败并出现错误。

9.  在升级到 MySQL 8.0.13 或更高版本之前,必须没有表分区驻留在 shared`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 ...重新组织分区`](alter-table.html):

    ```
    ALTER TABLE table_name REORGANIZE PARTITION partition_name
      INTO (partition_definition TABLESPACE=innodb_file_per_table);
    ```

10. 不得有来自 MySQL 8.0.12 或更低版本的查询和存储的程序定义使用`ASC`要么`DESC`限定词`通过...分组`条款。否则,升级到 MySQL 8.0.13 或更高版本可能会失败,就像复制到 MySQL 8.0.13 或更高版本的副本服务器一样。有关其他详细信息,请参阅[SQL 更改](upgrading-from-previous-series.html#upgrade-sql-changes).

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

    MySQL 8.0 中删除了一些服务器启动选项和系统变量。看[MySQL 8.0 中删除的功能](mysql-nutshell.html#mysql-nutshell-removals), 和[第 1.4 节,“MySQL 8.0 中添加、弃用或删除的服务器和状态变量和选项”](added-deprecated-removed.html).如果您使用其中任何一种,升级需要更改配置。

    示例:因为数据字典提供有关数据库对象的信息,服务器不再检查数据目录中的目录名称来查找数据库。因此,`--ignore-db-dir`选项是无关的,已被删除。要处理此问题,请删除任何实例`--ignore-db-dir`从您的启动配置。此外,在升级到 MySQL 8.0 之前删除或移动命名的数据目录子目录。(或者,让 8.0 服务器将这些目录作为数据库添加到数据字典中,然后使用[`删除数据库`](drop-database.html).)

12. 如果您打算更改[`lower_case_table_names`](server-system-variables.html#sysvar_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;
    ```

    从 MySQL 8.0.19 开始,如果[`lower_case_table_names=1`](server-system-variables.html#sysvar_lower_case_table_names)、表和模式名称由升级过程检查以确保所有字符都是小写的。如果发现表或模式名称包含大写字符,则升级过程将失败并出现错误。

    笔记

    改变[`lower_case_table_names`](server-system-variables.html#sysvar_lower_case_table_names)不建议在升级时设置。

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