第 22 章分区

目录

本章讨论 MySQL 的用户定义分区的实现。

Note

从 MySQL 5.7.17 开始,当预期用于给定 table 的存储引擎将提供其自己的(“本机”)分区处理程序时,将不建议使用 MySQL 服务器中的通用分区处理程序,并在 MySQL 8.0 中将其删除。当前,只有InnoDBNDB存储引擎可以执行此操作。

将 table 与 nonlocal 分区一起使用会产生ER_WARN_DEPRECATED_SYNTAX警告。在 MySQL 5.7.17 到 5.7.20 中,服务器会在启动时自动执行检查以识别使用 nonlocal 分区的 table。对于找到的任何内容,服务器将一条消息写入其错误日志。要禁用此检查,请使用--disable-partition-engine-check选项。在 MySQL 5.7.21 和更高版本中,执行此检查;在这些版本中,如果希望服务器使用通用分区处理程序检查 table(错误#85830,错误#25846957),则必须使用--disable-partition-engine-check=false启动服务器。

为了准备迁移到 MySQL 8.0,应将具有 nonlocal 分区的任何 table 更改为使用提供本地分区的引擎,或者使其变为非分区的。例如,要将 table 更改为InnoDB,请执行以下语句:

ALTER TABLE table_name ENGINE = INNODB;

您可以通过检查SHOW PLUGINS语句的输出来确定 MySQL Server 是否支持分区,如下所示:

mysql> SHOW PLUGINS;
+------------+----------+----------------+---------+---------+
| Name       | Status   | Type           | Library | License |
+------------+----------+----------------+---------+---------+
| binlog     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| partition  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| CSV        | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| FEDERATED  | DISABLED | STORAGE ENGINE | NULL    | GPL     |
| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| ndbcluster | DISABLED | STORAGE ENGINE | NULL    | GPL     |
+------------+----------+----------------+---------+---------+
11 rows in set (0.00 sec)

您还可以通过与此查询类似的查询来检查INFORMATION_SCHEMA.PLUGINStable:

mysql> SELECT
    ->     PLUGIN_NAME as Name,
    ->     PLUGIN_VERSION as Version,
    ->     PLUGIN_STATUS as Status
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_TYPE='STORAGE ENGINE';
+--------------------+---------+--------+
| Name               | Version | Status |
+--------------------+---------+--------+
| binlog             | 1.0     | ACTIVE |
| CSV                | 1.0     | ACTIVE |
| MEMORY             | 1.0     | ACTIVE |
| MRG_MYISAM         | 1.0     | ACTIVE |
| MyISAM             | 1.0     | ACTIVE |
| PERFORMANCE_SCHEMA | 0.1     | ACTIVE |
| BLACKHOLE          | 1.0     | ACTIVE |
| ARCHIVE            | 3.0     | ACTIVE |
| InnoDB             | 5.7     | ACTIVE |
| partition          | 1.0     | ACTIVE |
+--------------------+---------+--------+
10 rows in set (0.00 sec)

在任何一种情况下,如果在输出中的Status列中都看不到partition插件的值ACTIVE列出(在给出的每个示例中均以粗体显示),则说明您的 MySQL 版本没有分区支持。

Oracle 提供的 MySQL 5.7 社区二进制文件包括分区支持。有关 MySQL 企业版二进制文件中提供的分区支持的信息,请参见第 29 章,MySQL 企业版

如果要从源代码编译 MySQL 5.7,则要启用分区,必须使用-DWITH_PARTITION_STORAGE_ENGINE选项配置内部版本。有关更多信息,请参见第 2.9 节“从源代码安装 MySQL”

如果您的 MySQL 二进制文件是使用分区支持构建的,则无需进一步做任何事情来启用它(例如,在my.cnf文件中不需要特殊的条目)。

如果要禁用分区支持,则可以使用--skip-partition选项启动 MySQL Server。禁用分区支持后,您可以看到任何现有的分区 table 并将其删除(尽管不建议这样做),但是您不能通过其他方式操作它们或访问其数据。

有关分区和分区概念的介绍,请参见第 22.1 节“ MySQL 分区概述”

MySQL 支持多种类型的分区和子分区。参见第 22.2 节“分区类型”第 22.2.6 节“子分区”

第 22.3 节“分区 Management”涵盖了在现有分区 table 中添加,删除和更改分区的方法。

第 22.3.4 节“分区维护”讨论了用于分区 table 的 table 维护命令。

INFORMATION_SCHEMA数据库中的PARTITIONStable 提供有关分区和分区 table 的信息。有关更多信息,请参见第 24.16 节“ INFORMATION_SCHEMA PARTITIONStable”。有关针对该 table 的查询的一些示例,请参见第 22.2.7 节“ MySQL 分区如何处理 NULL”

有关 MySQL 5.7 中分区的已知问题,请参见第 22.6 节“分区的限制和限制”

当使用分区 table 时,您可能还会发现以下资源很有用。

其他资源. 关于 MySQL 中用户定义的分区的其他信息来源包括:

这是对 MySQL 分区技术感兴趣或正在尝试的人的正式讨论论坛。它具有 MySQL 开发人员和其他人员的公告和更新。它由分区开发和文档编制团队的成员进行监视。

MySQL 分区架构师和首席开发人员 MikaelRonström 经常在此处发布有关他在 MySQL 分区和 NDB 集群上的工作的文章。

一个以 MySQL 相关博客为特色的 MySQL 新闻网站,使用我的 MySQL 的任何人都应该对此感兴趣。我们鼓励您在此处查看由 MySQL 分区工作人员保留的博客链接,或者将您自己的博客添加到其中。

https://dev.mysql.com/downloads/mysql/5.7.html提供了 MySQL 5.7 二进制文件。但是,有关最新的分区错误修复和功能新增的信息,您可以从我们的 GitHub 存储库中获取源代码。要启用分区,必须使用-DWITH_PARTITION_STORAGE_ENGINE选项配置内部版本。有关构建 MySQL 的更多信息,请参见第 2.9 节“从源代码安装 MySQL”。如果您在编译支持分区的 MySQL 5.7 构建时遇到问题,请检查MySQL 分区论坛并在此处寻求帮助,如果找不到已发布的问题的解决方案。