【MySQL5.7指南】第一章——概述

1.1 关于本手册
1.2 MySQL数据库管理系统概述
1.3 MySQL 5.7 的新特性
1.4 在 MySQL 5.7 中添加、弃用或删除的服务器和状态变量和选项
1.5 MySQL信息来源
1.6 如何报告错误或问题
1.7 MySQL 标准合规性
1.8 学分

MySQL 软件提供了一个非常快速、多线程、多用户和健壮的 SQL(结构化查询语言)数据库服务器。 MySQL Server 旨在用于任务关键型、重负载生产系统以及嵌入到大规模部署的软件中。 Oracle 是 Oracle Corporation 和/或其附属公司的注册商标。 MySQL 是 Oracle Corporation 和/或其附属公司的商标,未经 Oracle 明确书面授权,客户不得使用。 其他名称可能是其各自所有者的商标。

MySQL 软件是双重许可的。 用户可以选择根据 GNU 通用公共许可证 (http://www.fsf.org/licenses/) 的条款将 MySQL 软件用作开源产品,也可以从 Oracle 购买标准商业许可证。 有关我们的许可政策的更多信息,请参阅 http://www.mysql.com/company/legal/licensing/。

以下列表描述了本手册中特别感兴趣的一些部分:

  • 有关 MySQL 数据库服务器功能的讨论,请参阅第 1.2.2 节“MySQL 的主要功能”。

  • 有关 MySQL 新功能的概述,请参阅第 1.3 节“MySQL 5.7 中的新功能”。有关每个版本中的更改的信息,请参阅发行说明。

  • 有关安装说明,请参阅第 2 章,安装和升级 MySQL。有关升级 MySQL 的信息,请参阅第 2.11 节,“升级 MySQL”。

  • 有关 MySQL 数据库服务器的教程介绍,请参阅第 3 章教程。

  • 有关配置和管理 MySQL 服务器的信息,请参阅第 5 章,MySQL 服务器管理。

  • 有关 MySQL 安全性的信息,请参阅第 6 章,安全性。

  • 有关设置复制服务器的信息,请参见第 16 章,复制。

  • 有关 MySQL Enterprise(具有高级功能和管理工具的商业 MySQL 版本)的信息,请参阅第 28 章,MySQL 企业版。

  • 有关 MySQL 数据库服务器及其功能的许多常见问题的答案,请参阅附录 A,MySQL 5.7 常见问题解答。

  • 有关新功能和错误修复的历史记录,请参阅发行说明。

重要

要报告问题或错误,请使用第 1.6 节“如何报告错误或问题”中的说明。 如果您发现 MySQL Server 中存在安全漏洞,请立即通过发送电子邮件至 secalert_us@oracle.com 通知我们。 例外:支持客户应向 Oracle 支持报告所有问题,包括安全错误。

1.1 关于本手册

这是 MySQL 数据库系统 5.7 版到 5.7.36 版的参考手册。 MySQL 5.7 次要版本之间的差异在当前文本中参考版本号 (5.7.x) 进行了说明。 有关许可信息,请参阅法律声明。

由于 MySQL 5.7 和以前版本之间的许多功能和其他差异,本手册不适用于旧版本的 MySQL 软件。 如果您使用的是较早版本的 MySQL 软件,请参阅相应的手册。 例如,MySQL 5.6 参考手册涵盖了 5.6 系列的 MySQL 软件版本。

如果您使用的是 MySQL 8.0,请参阅 MySQL 8.0 参考手册。

由于本手册仅供参考,因此不提供有关 SQL 或关系数据库概念的一般说明。 它也不会教您如何使用操作系统或命令行解释器。

MySQL 数据库软件在不断开发中,参考手册也经常更新。 该手册的最新版本可在 https://dev.mysql.com/doc/ 以可搜索形式在线获得。 那里还提供其他格式,包括可下载的 HTML 和 PDF 版本。

如果您对使用 MySQL 有任何疑问,请加入 MySQL Community Slack,或在我们的论坛中提问; 请参阅 MySQL 论坛上的 MySQL 社区支持。 如果您对手册本身的添加或更正有任何建议,请将其发送至 http://www.mysql.com/company/contact/。

排版和语法约定

​ 略。

手工著作权

参考手册源文件以 DocBook XML 格式编写。 HTML 版本和其他格式是自动生成的,主要使用 DocBook XSL 样式表。 有关 DocBook 的信息,请参阅 http://docbook.org/

本手册最初由 David Axmark 和 Michael “Monty” Widenius 编写。 它由 MySQL 文档团队维护,团队成员包括 Chris Cole、Margaret Fisher、Edward Gilmore、Stefan Hinz、Philip Olson、Daniel Price、Daniel So 和 Jon Stephens。

1.2 MySQL数据库管理系统概述

1.2.1 What is MySQL?

1.2.2 The Main Features of MySQL

1.2.3 History of MySQL

1.2.1 What is MySQL?

MySQL 是最流行的开源 SQL 数据库管理系统,由 Oracle Corporation 开发、分发和支持。

MySQL 网站 (http://www.mysql.com/) 提供了有关 MySQL 软件的最新信息。

  • MySQL是一个数据库管理系统。

    数据库是结构化的数据集合。 它可以是任何东西,从简单的购物清单到图片库或公司网络中的大量信息。 要添加、访问和处理存储在计算机数据库中的数据,您需要一个数据库管理系统,例如 MySQL Server。 由于计算机非常擅长处理大量数据,因此数据库管理系统作为独立实用程序或其他应用程序的一部分在计算中发挥着核心作用。

  • MySQL 数据库是关系型的。

    将所有数据放在一个大库房中。数据库结构被组织成针对速度进行了优化的物理文件。具有数据库、表、视图、行和列等对象的逻辑模型提供了灵活的编程环境。您可以设置控制不同数据字段之间关系的规则,例如一对一、一对多、唯一、必需或可选以及不同表之间的“指针”。数据库强制执行这些规则,因此使用设计良好的数据库,您的应用程序永远不会看到不一致、重复、孤立、过时或丢失的数据。

    “MySQL”的 SQL 部分代表“结构化查询语言”。 SQL 是最常用的用于访问数据库的标准化语言。根据您的编程环境,您可以直接输入 SQL(例如,生成报告)、将 SQL 语句嵌入到以另一种语言编写的代码中,或者使用隐藏 SQL 语法的特定语言 API。

    SQL 由 ANSI/ISO SQL 标准定义。 SQL 标准自 1986 年以来一直在发展,并且存在多个版本。本手册中,“SQL-92”是指1992年发布的标准,“SQL:1999”是指1999年发布的标准,“SQL:2003”是指该标准的当前版本。我们使用短语“SQL 标准”来表示 SQL 标准的当前版本。

  • MySQL软件时开源的。

    开源意味着任何人都可以使用和修改软件。 任何人都可以从 Internet 下载 MySQL 软件并使用它,而无需支付任何费用。 如果您愿意,您可以研究源代码并对其进行更改以满足您的需要。 MySQL 软件使用 GPL(GNU 通用公共许可证),http://www.fsf.org/licenses/,来定义在不同情况下您可以和不可以使用该软件做什么。 如果您对 GPL 感到不舒服或需要将 MySQL 代码嵌入到商业应用程序中,您可以从我们这里购买商业许可版本。 有关更多信息,请参阅 MySQL 许可概述 (http://www.mysql.com/company/legal/licensing/)。

  • MySQL 数据库服务器非常快速、可靠、可扩展且易于使用。

    如果这就是您正在寻找的,那么您应该尝试一下。 MySQL Server 可以在台式机或笔记本电脑上轻松运行,与您的其他应用程序、Web 服务器等一起运行,几乎不需要关注。 如果您将整台机器专用于 MySQL,您可以调整设置以利用所有可用的内存、CPU 能力和 I/O 容量。 MySQL 还可以扩展到联网的机器集群。

    MySQL Server 最初是为了比现有解决方案更快地处理大型数据库而开发的,并已成功用于高要求的生产环境多年。 尽管不断发展,但今天的 MySQL Server 提供了一组丰富且有用的功能。 其连接性、速度和安全性使 MySQL Server 非常适合访问 Internet 上的数据库。

  • MySQL 服务器在客户端/服务器或嵌入式系统中工作。

    MySQL 数据库软件是一个客户端/服务器系统,它由支持不同后端的多线程 SQL 服务器、几个不同的客户端程序和库、管理工具以及广泛的应用程序编程接口 (API) 组成。

    我们还提供 MySQL Server 作为嵌入式多线程库,您可以将其链接到您的应用程序以获得更小、更快、更易于管理的独立产品。

  • 有大量贡献的 MySQL 软件可用。

    MySQL Server 具有一组与我们的用户密切合作开发的实用功能。 您最喜欢的应用程序或语言很可能支持 MySQL 数据库服务器。

“MySQL”的官方发音方式是“My Ess Que Ell”(不是“my sequel”),但我们不介意您将其发音为“my sequel”或其他本地化方式。

1.2.2 MySQL的主要特点

本节介绍 MySQL 数据库软件的一些重要特性。 在大多数方面,路线图适用于 MySQL 的所有版本。 有关在特定于系列的基础上引入 MySQL 的功能的信息,请参阅相应手册的“In a Nutshell”部分:

内部结构和便携性
  • 用 C 和 C++ 编写。

  • 使用各种不同的编译器进行了测试。

  • 适用于许多不同的平台。 请参阅 https://www.mysql.com/support/supportedplatforms/database.html。

  • 为了可移植性,使用 CMake 进行配置。

  • 使用 Purify(一种商业内存泄漏检测器)以及一种 GPL 工具 Valgrind(http://developer.kde.org/~sewardj/)进行了测试。

  • 采用多层服务器设计,独立模块。

  • 设计为使用内核线程实现完全多线程,以便在多个 CPU 可用时轻松使用。

  • 提供事务性和非事务性存储引擎。

  • 使用带有索引压缩的非常快的 B 树磁盘表 (MyISAM)。

  • 旨在使添加其他存储引擎相对容易。如果您想为内部数据库提供 SQL 接口,这将非常有用。

  • 使用非常快速的基于线程的内存分配系统。

  • 使用优化的嵌套循环连接执行非常快速的连接。

  • 实现内存中的哈希表,用作临时表。

  • 使用高度优化的类库实现 SQL 函数,该类库应该尽可能快。通常在查询初始化之后根本没有内存分配。

  • 将服务器作为在客户端/服务器网络环境中使用的单独程序提供,并作为可以嵌入(链接)到独立应用程序中的库。此类应用程序可以单独使用,也可以在没有网络可用的环境中使用。

数据类型
  • 许多数据类型:有符号/无符号整数 1、2、3、4 和 8 个字节长、FLOAT、DOUBLE、CHAR、VARCHAR、BINARY、VARBINARY、TEXT、BLOB、DATE、TIME、DATETIME、TIMESTAMP、YEAR、SET、ENUM 和 OpenGIS 空间类型。 请参见第 11 章,数据类型。

  • 固定长度和可变长度字符串类型。

语句和函数
  • SELECT 列表和查询的 WHERE 子句中的完整运算符和函数支持。 例如:

    mysql> SELECT CONCAT(first_name, ' ', last_name)
        -> FROM citizen
        -> WHERE income/dependents > 10000 AND age > 30;
    
  • 完全支持 SQL GROUP BYORDER BY 子句。 支持组函数(COUNT()AVG()STD()SUM()MAX()MIN()GROUP_CONCAT())。

  • 支持使用标准 SQL 和 ODBC 语法的 LEFT OUTER JOINRIGHT OUTER JOIN

  • 支持标准 SQL 要求的表和列的别名。

  • 支持 DELETEINSERTREPLACEUPDATE以返回更改(受影响)的行数,或者通过在连接到服务器时设置标志来返回匹配的行数。

  • 支持特定于 MySQL 的 SHOW 语句,用于检索有关数据库、存储引擎、表和索引的信息。 支持 INFORMATION_SCHEMA 数据库,根据标准 SQL 实现。

  • 用于显示优化器如何解析查询的 EXPLAIN 语句。

  • 函数名独立于表名或列名。 例如,ABS 是有效的列名。 唯一的限制是对于函数调用,函数名和它后面的“(”之间不允许有空格。请参见第 9.3 节,“关键字和保留字”。

  • 您可以在同一语句中引用来自不同数据库的表。

安全
  • 一种非常灵活和安全的特权和密码系统,可实现基于主机的验证。

  • 当您连接到服务器时,通过加密所有密码流量来确保密码安全。

可扩展性和限制
  • 支持大型数据库。 我们将 MySQL Server 与包含 5000 万条记录的数据库一起使用。 我们还知道使用 MySQL Server 的用户有 200,000 个表和大约 5,000,000,000 行。

  • 每个表最多支持 64 个索引。 每个索引可能由 1 到 16 列或部分列组成。 InnoDB 表的最大索引宽度为 767 字节或 3072 字节。 请参阅第 14.23 节,“InnoDB 限制”。 MyISAM 表的最大索引宽度为 1000 字节。 请参阅第 15.2 节,“MyISAM 存储引擎”。 索引可以将列的前缀用于 CHAR、VARCHAR、BLOB 或 TEXT 列类型。

连通性
  • 客户端可以使用多种协议连接到 MySQL 服务器:
    • 客户端可以在任何平台上使用 TCP/IP 套接字进行连接。
    • 在 Windows 系统上,如果服务器启动时启用了 named_pipe 系统变量,则客户端可以使用命名管道进行连接。 如果在启用 shared_memory 系统变量的情况下启动,Windows 服务器还支持共享内存连接。 客户端可以使用 –protocol=memory 选项通过共享内存进行连接。
    • 在 Unix 系统上,客户端可以使用 Unix 域套接字文件进行连接。
  • MySQL 客户端程序可以用多种语言编写。 用 C 编写的客户端库可用于用 C 或 C++ 编写的客户端,或用于提供 C 绑定的任何语言。
  • 可以使用 C、C++、Eiffel、Java、Perl、PHP、Python、Ruby 和 Tcl 的 API,使 MySQL 客户端能够以多种语言编写。 请参阅第 27 章,连接器和 API。
  • 连接器/ODBC (MyODBC) 接口为使用 ODBC(开放式数据库连接)连接的客户端程序提供 MySQL 支持。 例如,您可以使用 MS Access 连接到您的 MySQL 服务器。 客户端可以在 Windows 或 Unix 上运行。 连接器/ODBC 源可用。 支持所有 ODBC 2.5 函数,以及许多其他函数。 请参阅 MySQL 连接器/ODBC 开发人员指南
  • Connector/J 接口为使用 JDBC 连接的 Java 客户端程序提供 MySQL 支持。 客户端可以在 Windows 或 Unix 上运行。 连接器/J 源可用。 请参阅 MySQL 连接器/J 5.1 开发人员指南
  • MySQL Connector/NET 使开发人员能够轻松创建需要与 MySQL 进行安全、高性能数据连接的 .NET 应用程序。 它实现了所需的 ADO.NET 接口并集成到 ADO.NET 感知工具中。 开发人员可以使用他们选择的 .NET 语言构建应用程序。 MySQL Connector/NET 是一个完全托管的 ADO.NET 驱动程序,用 100% 纯 C# 编写。 请参阅 MySQL 连接器/NET 开发人员指南
本土化
  • 服务器可以用多种语言向客户端提供错误消息。 请参阅第 10.12 节,“设置错误消息语言”。

  • 完全支持多种不同的字符集,包括 latin1 (cp1252)、德语、big5、ujis、多种 Unicode 字符集等。 例如,表名和列名中允许使用斯堪的纳维亚字符“å”、“ä”和“ö”。

  • 所有数据都保存在所选字符集中。

  • 排序和比较是根据默认字符集和排序规则完成的。 可以在 MySQL 服务器启动时更改此设置(请参阅第 10.3.2 节,“服务器字符集和排序规则”)。 要查看非常高级的排序示例,请查看捷克语排序代码。 MySQL Server 支持许多不同的字符集,可以在编译时和运行时指定。

  • 服务器时区可以动态更改,各个客户端可以指定自己的时区。 请参阅第 5.1.13 节,“MySQL 服务器时区支持”。

客户端和工具
  • MySQL 包括几个客户端和实用程序。 其中包括命令行程序(如 mysqldumpmysqladmin)和图形程序(如 MySQL Workbench)。

  • MySQL Server 内置支持 SQL 语句来检查、优化和修复表。 这些语句可通过 mysqlcheck 客户端从命令行获得。 MySQL 还包括 myisamchk,这是一个非常快速的命令行实用程序,用于在 MyISAM 表上执行这些操作。 请参阅第 4 章,MySQL 程序。

  • MySQL 程序可以使用 --help-? 获取在线帮助的选项。

1.2.3 MySQL 的历史

我们开始的目的是使用 mSQL 数据库系统通过我们自己的快速低级 (ISAM) 例程连接到我们的表。但是,经过一些测试,我们得出结论,mSQL 不够快或不够灵活,无法满足我们的需求。这导致了我们数据库的新 SQL 接口,但具有与 mSQL 几乎相同的 API 接口。此 API 旨在使编写用于 mSQL 的第三方代码能够轻松移植以用于 MySQL。

MySQL 以联合创始人 Monty Widenius 的女儿 My 的名字命名。

MySQL Dolphin(我们的徽标)的名称是“Sakila”,它是从用户在我们的“Name the Dolphin”竞赛中建议的大量名称中选出的。获奖名称由来自非洲 Eswatini(前斯威士兰)的开源软件开发人员 Ambrose Twebaze 提交。根据安布罗斯的说法,女性名字 Sakila 起源于埃斯瓦蒂尼的当地语言 SiSwati。 Sakila 也是坦桑尼亚阿鲁沙镇的名称,靠近安布罗斯的原籍国乌干达。

1.3 MySQL 5.7 的新特性

本节总结了 MySQL 5.7 中添加、弃用和删除的内容。 配套部分列出了 MySQL 5.7 中添加、弃用或删除的 MySQL 服务器选项和变量; 请参阅第 1.4 节,“在 MySQL 5.7 中添加、弃用或删除的服务器和状态变量和选项”。

1.3.1 MySQL 5.7 新增功能

MySQL 5.7 添加了以下功能:

  • 安全改进。 添加了以下安全增强功能:

    • 在 MySQL 8.0 中, caching_sha2_password 是默认的身份验证插件。为了使 MySQL 5.7 客户端能够使用使用 caching_sha2_password 进行身份验证的帐户连接到 8.0 服务器,MySQL 5.7 客户端库和客户端程序从 MySQL 5.7.23 开始支持 caching_sha2_password 客户端身份验证插件。这提高了 MySQL 5.7 与 MySQL 8.0 和更高版本服务器的兼容性。请参见第 6.4.1.4 节,“缓存 SHA-2 可插入身份验证”。

    • 服务器现在要求 mysql.user 系统表中的帐户行具有非空插件列值并禁用具有空值的帐户。有关服务器升级说明,请参阅第 2.11.3 节,“MySQL 5.7 中的更改”。建议 DBA 也将使用 mysql_old_password 身份验证插件的帐户转换为使用 mysql_native_password,因为已删除对 mysql_old_password 的支持。有关帐户升级说明,请参阅第 6.4.1.3 节,“从 Pre-4.1 密码哈希和 mysql_old_password 插件迁移”。

    • MySQL 现在使数据库管理员能够建立自动密码过期策略:任何使用密码超过其允许生命周期的帐户连接到服务器的用户都必须更改密码。 有关更多信息,请参阅第 6.2.11 节,“密码管理”。

    • 管理员可以锁定和解锁帐户以更好地控制谁可以登录。有关更多信息,请参阅第 6.2.15 节 “帐户锁定”。

    • 为了更容易支持安全连接,使用 OpenSSL 编译的 MySQL 服务器可以在启动时自动生成丢失的 SSL 和 RSA 证书和密钥文件。 请参阅第 6.3.3.1 节,“使用 MySQL 创建 SSL 和 RSA 证书和密钥”。

      所有服务器,如果没有明确配置 SSL,如果在数据目录中找到必需的 SSL 文件,它们会尝试在启动时自动启用 SSL。 请参阅第 6.3.1 节,“配置 MySQL 以使用加密连接”。

      此外,MySQL 发行版包括一个 mysql_ssl_rsa_setup 实用程序,可以手动调用该实用程序来创建 SSL 和 RSA 密钥和证书文件。 有关更多信息,请参阅第 4.4.5 节,“mysql_ssl_rsa_setup — 创建 SSL/RSA 文件”。

    • 默认情况下,使用 mysqld --initialize 安装的 MySQL 部署是安全的。 以下更改已作为默认部署特性实施:

      • 安装过程只创建一个root账户,‘root’@‘localhost’,自动为这个账户生成一个随机密码,并将密码标记为过期。 MySQL 管理员必须使用随机密码以 root 身份连接并分配一个新密码。 (服务器将随机密码写入错误日志。)
      • 安装不会创建匿名用户帐户。
      • 安装不会创建测试数据库。

      有关更多信息,请参阅第 2.10.1 节,“初始化数据目录”。

    • MySQL 企业版现在提供数据屏蔽和去标识化功能。数据屏蔽通过用替代值替换真实值来隐藏敏感信息。 MySQL Enterprise Data Masking 和 De-Identification 功能可以使用多种方法来屏蔽现有数据,例如混淆(删除识别特征)、格式化随机数据的生成以及数据替换或替换。有关更多信息,请参阅第 6.5 节,“MySQL 企业数据屏蔽和去标识化”。

    • MySQL 现在将在命名管道上授予客户端的访问控制设置为在 Windows 上成功通信所需的最低限度。较新的 MySQL 客户端软件无需任何额外配置即可打开命名管道连接。如果旧客户端软件无法立即升级,则可以使用新的 named_pipe_full_access_group 系统变量为 Windows 组授予打开命名管道连接所需的权限。完全访问组中的成员资格应该是受限制的和临时的。

  • SQL 模式更改。 现在默认启用事务存储引擎的严格 SQL 模式 (STRICT_TRANS_TABLES)。

    ONLY_FULL_GROUP_BY SQL 模式的实现变得更加复杂,不再拒绝以前被拒绝的确定性查询。 因此,现在默认启用此模式,以仅禁止包含不能保证在组内唯一确定的表达式的非确定性查询。

    ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATE SQL 模式现已弃用,但默认启用。 长期计划是将它们包含在严格的 SQL 模式中,并在未来的 MySQL 版本中将它们作为显式模式删除。 请参阅 MySQL 5.7 中的 SQL 模式更改。

    对默认 SQL 模式的更改导致默认 sql_mode 系统变量值启用以下模式:ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERNO_ENGINE_SUBSTITU_ENGINE.

  • 在线更改表。 ALTER TABLE 现在支持重命名索引的 RENAME INDEX 子句。 更改是在没有表复制操作的情况下进行的。 它适用于所有存储引擎。 见第 13.1.8 节,“ALTER TABLE 语句”。

  • ngram 和 MeCab 全文解析器插件。 MySQL 提供了一个内置的支持中文、日文和韩文 (CJK) 的全文 ngram 解析器插件,以及一个可安装的日文 MeCab 全文解析器插件。

    有关更多信息,请参阅第 12.10.8 节“ngram 全文解析器”和第 12.10.9 节“MeCab 全文解析器插件”。

  • InnoDB 增强功能。 添加了这些 InnoDB 增强功能:

    • 可以使用 ALTER TABLE 增加 VARCHAR 列大小,如下例所示:

      ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);
      

      只要 VARCHAR 列所需的长度字节数保持不变,这就是正确的。 对于大小为 0 到 255 个字节的 VARCHAR 列,需要一个长度字节来对值进行编码。 对于大小为 256 字节或更多的 VARCHAR 列,需要两个长度字节。 因此,就地 ALTER TABLE 仅支持将 VARCHAR 列大小从 0 增加到 255 字节,或从 256 字节增加到更大的大小。 就地 ALTER TABLE 不支持将 VARCHAR 列的大小从小于 256 字节增加到等于或大于 256 字节的大小。 在这种情况下,所需的长度字节数从 1 变为 2,这仅由表副本支持(ALGORITHM=COPY)。

      不支持使用就地 ALTER TABLE 减小 VARCHAR 大小。 减小 VARCHAR 大小需要表副本 (ALGORITHM=COPY)。

      有关更多信息,请参阅第 14.13.1 节,“在线 DDL 操作”。

    • 通过优化 CREATE TABLE、DROP TABLE、TRUNCATE TABLE 和 ALTER TABLE 语句,提高了 InnoDB 临时表的 DDL 性能。

    • InnoDB 临时表元数据不再存储到 InnoDB 系统表。 相反,新表 INNODB_TEMP_TABLE_INFO 为用户提供活动临时表的快照。 该表包含所有用户和系统创建的临时表的元数据和报告,这些临时表在给定的 InnoDB 实例中处于活动状态。 该表是在对其运行第一个 SELECT 语句时创建的。

    • InnoDB 现在支持 MySQL 支持的空间数据类型。 在此版本之前,InnoDB 会将空间数据存储为二进制 BLOB 数据。 BLOB 仍然是基础数据类型,但空间数据类型现在映射到新的 InnoDB 内部数据类型 DATA_GEOMETRY。

    • 现在所有非压缩 InnoDB 临时表都有一个单独的表空间。 新表空间总是在服务器启动时重新创建,默认情况下位于 DATADIR 中。 新添加的配置文件选项 innodb_temp_data_file_path 允许用户定义临时数据文件路径。

    • innochecksum 功能通过几个新选项和扩展功能得到增强。 请参阅第 4.6.1 节,“innochecksum — 离线 InnoDB 文件校验和实用程序”。

    • 普通和压缩临时表和相关对象的新型非重做撤消日志现在驻留在临时表空间中。 有关更多信息,请参阅第 14.6.7 节,“撤消日志”。

    • InnoDB 缓冲池转储和加载操作得到增强。 一个新的系统变量 innodb_buffer_pool_dump_pct 允许您指定每个缓冲池中最近使用的页面的百分比以进行读取和转储。 当 InnoDB 后台任务正在执行其他 I/O 活动时,InnoDB 尝试使用 innodb_io_capacity 设置限制每秒缓冲池加载操作的数量。

    • 为 InnoDB 添加了对全文解析器插件的支持。 有关全文解析器插件的信息,请参阅全文解析器插件编写全文解析器插件

    • InnoDB 支持多个页面清理线程,用于从缓冲池实例中刷新脏页面。 新的系统变量 innodb_page_cleaners 用于指定页面清理器线程的数量。 默认值 1 保持以前的配置,其中只有一个页面清理器线程。 此增强建立在 MySQL 5.6 中完成的工作的基础上,它引入了一个单页清理线程来从 InnoDB 主线程卸载缓冲池刷新工作。

    • 在线 DDL 支持扩展到常规和分区 InnoDB 表的以下操作:

    • Linux 上的 Fusion-io Non-Volatile Memory (NVM) 文件系统提供了原子写能力,这使得 InnoDB 双写缓冲区变得多余。对于位于支持原子写入的 Fusion-io 设备上的系统表空间文件(ibdata 文件),将自动禁用 InnoDB 双写缓冲区。

    • InnoDB 支持分区 InnoDB 表和单个 InnoDB 表分区的可传输表空间功能。此增强功能简化了分区表的备份过程,并支持在 MySQL 实例之间复制分区表和单个表分区。有关更多信息,请参阅第 14.6.1.3 节,“导入 InnoDB 表”。

    • innodb_buffer_pool_size 参数是动态的,允许您在不重新启动服务器的情况下调整缓冲池的大小。调整大小操作(涉及将页面移动到内存中的新位置)是分块执行的。块大小可以使用新的 innodb_buffer_pool_chunk_size 配置选项进行配置。您可以使用新的 Innodb_buffer_pool_resize_status 状态变量来监控调整大小的进度。有关更多信息,请参阅在线配置 InnoDB 缓冲池大小

    • 多线程页面清理器支持 (innodb_page_cleaners) 扩展到关闭和恢复阶段。

    • InnoDB 支持使用 SPATIAL 索引对空间数据类型进行索引,包括使用 ALTER TABLE … ALGORITHM=INPLACE 进行在线操作(ADD SPATIAL INDEX)。

    • InnoDB 在创建或重建索引时执行批量加载。 这种创建索引的方法称为“排序索引构建”。 这种提高索引创建效率的增强也适用于全文索引。 一个新的全局配置选项 innodb_fill_factor 定义了在排序索引构建期间每个页面上填充数据的空间百分比,剩余空间保留用于未来的索引增长。 有关更多信息,请参阅第 14.6.2.3 节,“排序索引构建”。

    • 新的日志记录类型 (MLOG_FILE_NAME) 用于标识自上次检查点以来已修改的表空间。 此增强功能简化了崩溃恢复期间的表空间发现,并在重做日志应用程序之前消除了对文件系统的扫描。 有关此增强功能优势的更多信息,请参阅崩溃恢复期间的表空间发现

      此增强功能更改了重做日志格式,要求在升级到 MySQL 5.7.5 或从 MySQL 5.7.5 降级之前彻底关闭 MySQL。

    • 您可以截断驻留在撤消表空间中的撤消日志。 使用 innodb_undo_log_truncate 配置选项启用此功能。 有关更多信息,请参阅截断撤消表空间

    • InnoDB 支持本机分区。 以前,InnoDB 依赖于 ha_partition 处理程序,它为每个分区创建一个处理程序对象。 使用本机分区,分区的 InnoDB 表使用单个分区感知处理程序对象。 此增强功能减少了分区 InnoDB 表所需的内存量。

      从 MySQL 5.7.9 开始,mysql_upgrade 查找并尝试升级使用 ha_partition 处理程序创建的分区 InnoDB 表。 同样在 MySQL 5.7.9 及更高版本中,您可以使用 ALTER TABLE ... UPGRADE PARTITIONING 在 mysql 客户端中按名称升级此类表。

    • InnoDB 支持使用 CREATE TABLESPACE 语法创建通用表空间。

      CREATE TABLESPACE `tablespace_name`
        ADD DATAFILE 'file_name.ibd'
        [FILE_BLOCK_SIZE = n]
      

      通用表空间可以在 MySQL 数据目录之外创建,能够容纳多个表,并支持所有行格式的表。

      使用 CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_nameALTER TABLE tbl_name TABLESPACE [=] tablespace_name 语法将表添加到通用表空间。

      有关更多信息,请参阅第 14.6.3.3 节,“通用表空间”。

    • DYNAMIC 取代 COMPACT 作为 InnoDB 表的隐式默认行格式。 新的配置选项 innodb_default_row_format 指定默认的 InnoDB 行格式。 有关更多信息,请参阅定义表的行格式。

    • 从 MySQL 5.7.11 开始,InnoDB 支持 file-per-table 表空间的 data-at-rest 加密。 通过在创建或更改 InnoDB 表时指定 ENCRYPTION 选项来启用加密。 此功能依赖于用于加密密钥管理的密钥环插件。 有关更多信息,请参阅第 6.4.4 节“MySQL 密钥环”和第 14.14 节“InnoDB 静态数据加密”。

    • 从 MySQL 5.7.24 开始,与 MySQL 捆绑的 zlib 库版本从版本 1.2.3 提升到版本 1.2.11。 MySQL 在 zlib 库的帮助下实现了压缩。

      如果您使用 InnoDB 压缩表,请参阅第 2.11.3 节“MySQL 5.7 中的更改”以了解相关升级含义。

  • JSON 支持。 从 MySQL 5.7.8 开始,MySQL 支持原生 JSON 类型。 JSON 值不存储为字符串,而是使用允许快速读取文档元素的内部二进制格式。 存储在 JSON 列中的 JSON 文档在插入或更新时会自动验证,无效文档会产生错误。 JSON 文档在创建时被标准化,并且可以使用大多数比较运算符进行比较,例如 =、<、<=、>、>=、<>、!= 和 <=>; 有关支持的运算符以及 MySQL 在比较 JSON 值时遵循的优先级和其他规则的信息,请参阅 JSON 值的比较和排序

    MySQL 5.7.8 还引入了许多用于处理 JSON 值的函数。 这些功能包括此处列出的功能:

    在 MySQL 5.7.9 及更高版本中,您可以使用 column->path 作为 JSON_EXTRACT(column, path) 的简写。 在 SQL 语句(包括 WHERE、ORDER BY 和 GROUP BY 子句)中可以出现列标识符的任何位置,这都用作列的别名。 这包括 SELECT、UPDATE、DELETE、CREATE TABLE 和其他 SQL 语句。 左侧必须是 JSON 列标识符(而不是别名)。 右侧是引用的 JSON 路径表达式,它根据作为列值返回的 JSON 文档进行评估。

    MySQL 5.7.22 添加了以下 JSON 函数:

    • 两个 JSON 聚合函数 JSON_ARRAYAGG()JSON_OBJECTAGG()。 JSON_ARRAYAGG() 将列或表达式作为其参数,并将结果聚合为单个 JSON 数组。 该表达式可以计算为任何 MySQL 数据类型; 这不必是 JSON 值。 JSON_OBJECTAGG() 接受两列或表达式,将其解释为键和值; 它将结果作为单个 JSON 对象返回。 有关更多信息和示例,请参阅第 12.20 节,“聚合函数”。

    • JSON 实用程序函数 JSON_PRETTY(),它以易于阅读的格式输出现有的 JSON 值; 每个 JSON 对象成员或数组值都打印在单独的行上,并且子对象或数组相对于其父对象有 2 个空格。

      此函数也适用于可解析为 JSON 值的字符串。

      另请参阅第 12.18.6 节,“JSON 实用程序函数”。

    • JSON 实用程序函数 JSON_STORAGE_SIZE(),它返回在任何部分更新之前用于 JSON 文档的二进制表示的以字节为单位的存储空间(请参阅上一项)。

      此函数还接受 JSON 文档的有效字符串表示形式。 对于这样的值,JSON_STORAGE_SIZE() 在转换为 JSON 文档后返回其二进制表示所使用的空间。 对于包含 JSON 文档的字符串表示形式的变量,JSON_STORAGE_FREE() 返回零。 如果其(非空)参数无法解析为有效的 JSON 文档,则任一函数都会产生错误,如果参数为 NULL,则为 NULL。

      有关更多信息和示例,请参阅第 12.18.6 节,“JSON 实用程序函数”。

    • 旨在符合 RFC 7396 的 JSON 合并函数。 JSON_MERGE_PATCH(),当在 2 个 JSON 对象上使用时,将它们合并为一个 JSON 对象,该对象具有以下集合的联合作为成员:

      • 第一个对象的每个成员在第二个对象中没有具有相同键的成员。
      • 第二个对象的每个成员在第一个对象中没有具有相同键的成员,并且其值不是 JSON null 文字。
      • 每个成员都有一个存在于两个对象中的键,并且其在第二个对象中的值不是 JSON null 文字。

      作为这项工作的一部分,JSON_MERGE() 函数已重命名为 JSON_MERGE_PRESERVE()JSON_MERGE() 在 MySQL 5.7 中继续被认为是 JSON_MERGE_PRESERVE() 的别名,但现在已被弃用,并且在未来的 MySQL 版本中可能会被删除。

      有关更多信息和示例,请参阅第 12.18.4 节,“修改 JSON 值的函数”。

    有关 -> 和 JSON_EXTRACT() 的更多信息,请参阅第 12.18.3 节,“搜索 JSON 值的函数”。 有关 MySQL 5.7 中 JSON 路径支持的信息,请参阅搜索和修改 JSON 值。 另请参阅索引生成的列以提供 JSON 列索引

  • 系统和状态变量。 系统和状态变量信息现在在 Performance Schema 表中可用,优先使用 INFORMATION_SCHEMA 表来获取这些变量。 这也会影响 SHOW VARIABLESSHOW STATUS 语句的操作。 show_compatibility_56 系统变量的值影响系统和状态变量语句和表产生的输出和所需的权限。 有关详细信息,请参阅第 5.1.7 节“服务器系统变量”中对该变量的描述。

    注意

    show_compatibility_56 的默认值为 OFF。 需要 5.6 行为的应用程序应将此变量设置为 ON,直到它们迁移到系统变量和状态变量的新行为为止。 请参阅第 25.20 节,“迁移到性能模式系统和状态变量表”

  • sys schema。 MySQL 发行版现在包括 sys 模式,这是一组对象,可帮助 DBA 和开发人员解释 Performance Schema 收集的数据。 sys 模式对象可用于典型的调优和诊断用例。 有关更多信息,请参阅第 26 章,MySQL sys Schema

  • 条件处理。 MySQL 现在支持堆叠诊断区域。 推送诊断区域堆栈时,第一个(当前)诊断区域成为第二个(堆栈)诊断区域,并创建一个新的当前诊断区域作为它的副本。 在条件处理程序中,执行的语句会修改新的当前诊断区域,但 GET STACKED DIAGNOSTICS 可用于检查堆栈诊断区域,以获取有关导致处理程序激活的条件的信息,而与处理程序本身的当前条件无关。 (以前,只有一个诊断区域。要检查处理程序中的处理程序激活条件,有必要在执行任何可能更改它的语句之前检查此诊断区域。)参见第 13.6.7.3 节,“GET DIAGNOSTICS 语句”, 和第 13.6.7.7 节,“MySQL 诊断区域”。

  • 优化器。 添加了这些优化器增强功能:

    • EXPLAIN 可用于获取在命名连接中执行的可解释语句的执行计划:

      EXPLAIN [options] FOR CONNECTION connection_id;
      

      有关更多信息,请参阅第 8.8.4 节,“获取命名连接的执行计划信息”。

    • 可以在单个 SQL 语句中向优化器提供提示,与使用 optimizer_switch 系统变量相比,这可以更好地控制语句执行计划。 与 EXPLAIN 一起使用的语句中也允许使用提示,使您能够查看提示如何影响执行计划。 有关更多信息,请参阅第 8.9.3 节,“优化器提示”。

    • prefer_ordering_index 标志。 默认情况下,只要优化器确定这会导致更快的执行,MySQL 就会尝试对任何具有 LIMIT 子句的 ORDER BYGROUP BY 查询使用有序索引。 因为在某些情况下为此类查询选择不同的优化实际上可能会更好,所以从 MySQL 5.7.33 开始,可以通过将 prefer_ordering_index 标志设置为 off 来禁用此优化。

      此标志的默认值是打开的。

      有关更多信息和示例,请参阅第 8.9.2 节“可切换优化”和第 8.2.1.17 节“限制查询优化”。

  • 触发器。 以前,对于触发器事件(INSERT、UPDATE、DELETE)和操作时间(BEFORE、AFTER)的每个组合,一个表最多可以有一个触发器。 此限制已被取消,并且允许多个触发器。 有关更多信息,请参阅第 23.3 节 “使用触发器”。

  • 日志。 添加了以下日志记录增强功能:

    • 以前,在 Unix 和类 Unix 系统上,MySQL 支持将服务器错误日志发送到 syslog 是通过让 mysqld_safe 捕获服务器错误输出并将其传递给 syslog 来实现的。 服务器现在包括本机系统日志支持,该支持已扩展为包括 Windows。 有关将服务器错误输出发送到 syslog 的更多信息,请参阅第 5.4.2 节,“错误日志”。
    • mysql 客户端现在有一个 --syslog 选项,可以将交互式语句发送到系统 syslog 工具。 对于匹配默认“忽略”模式列表 (“IDENTIFIED:PASSWORD”) 的语句,以及匹配使用 --histignore 选项指定的任何模式的语句,日志将被抑制。 请参阅第 4.5.1.3 节,“mysql 客户端日志记录”。
  • 生成的列。 MySQL 现在支持 CREATE TABLEALTER TABLE 语句中生成列的规范。 生成的列的值是根据列创建时指定的表达式计算的。 生成的列可以是虚拟的(在读取行时“即时”计算)或存储(在插入或更新行时计算)。 有关更多信息,请参阅第 13.1.18.7 节,“创建表和生成的列”。

  • mysql客户端。 以前mysql中的Control+C如果有就中断当前语句,如果没有则退出mysql。 现在 Control+C 中断当前语句(如果有),否则取消任何部分输入行,但不退出。

  • 使用 mysqlbinlog 重写数据库名称。 现在使用 MySQL 5.7.1 中添加的 --rewrite-db 选项支持在读取使用基于行格式编写的二进制日志时通过 mysqlbinlog 重命名数据库。

    此选项使用格式 --rewrite-db='dboldname->dbnewname'。 您可以通过多次指定选项来实现多个重写规则。

  • 带有分区表的处理程序。 HANDLER 语句现在可以与用户分区表一起使用。 此类表可以使用任何可用的分区类型(请参阅第 22.2 节,“分区类型”)。

  • 对分区表的索引条件下推支持。 使用 InnoDB 或 MyISAM 存储引擎对分区表的查询可能会采用 MySQL 5.6 中引入的索引条件下推优化。 有关更多信息,请参见第 8.2.1.5 节,“索引条件下推优化”。

  • 没有对 ALTER TABLE … EXCHANGE PARTITION 的验证支持。 从 MySQL 5.7.5 开始,ALTER TABLE ... EXCHANGE PARTITION 语法包括一个可选的 {WITH|WITHOUT} VALIDATION 子句。 当指定 WITHOUT VALIDATION 时,ALTER TABLE ... EXCHANGE PARTITION 在与分区交换填充表时不执行逐行验证,允许数据库管理员承担确保行在分区定义边界内的责任。 WITH VALIDATION 是默认行为,不需要明确指定。 有关更多信息,请参阅第 22.3.3 节,“用表交换分区和子分区”。

  • 源转储线程改进。 重构源转储线程以减少锁争用并提高源吞吐量。 在 MySQL 5.7.2 之前,每次读取事件时,转储线程都会锁定二进制日志; 在 MySQL 5.7.2 及更高版本中,仅在读取上次成功写入事件末尾的位置时才会持有此锁。 这意味着多个转储线程现在能够同时从二进制日志文件中读取,并且转储线程现在能够在客户端写入二进制日志时读取。

  • 字符集支持。 MySQL 5.7.4 包含一个支持中国国家标准 GB18030 字符集的 gb18030 字符集。 有关 MySQL 字符集支持的更多信息,请参阅第 10 章,字符集、排序规则、Unicode。

  • 在没有 STOP SLAVE 的情况下更改复制源。 在 MySQL 5.7.4 及更高版本中,删除了在发出任何 CHANGE MASTER TO 语句之前执行 STOP SLAVE 的严格要求。 CHANGE MASTER TO 现在的行为不再依赖于副本是否停止,而是依赖于副本 SQL 线程和副本 I/O 线程的状态; 现在停止或运行这些线程中的哪一个决定了在给定时间点可以或不能与 CHANGE MASTER TO 语句一起使用的选项。 此处列出了进行此确定的规则:

    • 如果 SQL 线程停止,您可以使用 RELAY_LOG_FILERELAY_LOG_POSMASTER_DELAY 选项的任意组合执行 CHANGE MASTER TO,即使副本 I/O 线程正在运行。 当 I/O 线程正在运行时,此语句不能使用其他选项。
    • 如果 I/O 线程停止,即使 SQL 线程正在运行,您也可以使用此语句的任何选项(以任何允许的组合)执行 CHANGE MASTER TO,但 RELAY_LOG_FILERELAY_LOG_POSMASTER_DELAY 除外。 这三个选项在 I/O 线程运行时可能不会使用。
    • 在发出 CHANGE MASTER TO ... MASTER_AUTO_POSITION = 1 之前,必须停止 SQL 线程和 I/O 线程。

    您可以使用 SHOW SLAVE STATUS 检查副本 SQL 和 I/O 线程的当前状态。

    如果您使用基于语句的复制和临时表,则在 STOP SLAVE 语句之后的 CHANGE MASTER TO 语句可能会在副本上留下临时表。 作为这组改进的一部分,当使用基于语句的复制并且 Slave_open_temp_tables 保持大于 0 时,只要在 STOP SLAVE 之后发出 CHANGE MASTER TO,就会发出警告。

    有关更多信息,请参阅第 13.4.2.1 节“CHANGE MASTER TO 语句”和第 16.3.7 节“在故障转移期间切换源”。

  • 测试套件。 MySQL 测试套件现在使用 InnoDB 作为默认存储引擎。

  • 现在可以进行多源复制。 MySQL 多源复制添加了从多个源复制到副本的能力。 MySQL 多源复制拓扑可用于将多个服务器备份到单个服务器、合并表分片以及将多个服务器的数据合并到单个服务器。 请参阅第 16.1.5 节,“MySQL 多源复制”。

    作为 MySQL 多源复制的一部分,添加了复制通道。 复制通道使副本能够打开多个连接进行复制,每个通道都是一个到源的连接。 请参见第 16.2.2 节,“复制通道”。

  • 组复制性能模式表。 MySQL 5.7 向 Performance Schema 添加了许多新表,以提供有关复制组和通道的信息。 其中包括以下表格:

    除了在 MySQL 5.7.6 中添加的 replication_group_members 和 replication_group_member_stats 之外,所有这些表都是在 MySQL 5.7.2 中添加的。 有关更多信息,请参阅第 25.12.11 节,“性能模式复制表”。

  • 组复制 SQL。 MySQL 5.7.6 中添加了以下语句用于控制组复制:

    有关更多信息,请参阅第 13.4.3 节,“用于控制组复制的 SQL 语句”。

1.3.2 MySQL 5.7 中已弃用的功能

以下功能在 MySQL 5.7 中已弃用,可能会在以后的系列中删除。 在显示替代方案的地方,应更新应用程序以使用它们。

对于使用 MySQL 5.7 中已弃用的功能已在更高版本的 MySQL 系列中删除的应用程序,从 MySQL 5.7 源复制到更高系列的副本时,语句可能会失败,或者可能对源和副本产生不同的影响。 为避免此类问题,应修改使用 5.7 中已弃用功能的应用程序以避免它们并在可能的情况下使用替代方案。

  • ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATE SQL 模式现已弃用,但默认启用。 长期计划是将它们包含在严格的 SQL 模式中,并在未来的 MySQL 版本中将它们作为显式模式删除。

    已弃用的 ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATE SQL 模式仍可识别,因此命名它们的语句不会产生错误,但预计将在未来版本的 MySQL 中删除。 为了提前准备不存在这些模式名称的 MySQL 版本,应用程序应该修改为不引用它们。 请参阅 MySQL 5.7 中的 SQL 模式更改

  • 这些 SQL 模式现已弃用; 希望它们在 MySQL 的未来版本中被删除:DB2、MAXDB、MSSQL、MYSQL323、MYSQL40、ORACLE、POSTGRESQL、NO_FIELD_OPTIONS、NO_KEY_OPTIONS、NO_TABLE_OPTIONS。 这些弃用有两个含义:

    • 将不推荐使用的模式分配给 sql_mode 系统变量会产生警告。
    • 启用 MAXDB SQL 模式后,使用 CREATE TABLE 或 ALTER TABLE 将 TIMESTAMP 列添加到表会产生警告。
  • 对帐户管理报表的更改使以下功能过时。 它们现在已被弃用

    • 使用 GRANT 创建用户。 作为替代,使用 CREATE USER。 遵循这种做法会使 NO_AUTO_CREATE_USER SQL 模式对于 GRANT 语句变得无关紧要,因此它也已被弃用。
    • 使用 GRANT 修改权限分配以外的帐户属性。 这包括身份验证、SSL 和资源限制属性。 相反,在创建帐户时使用 CREATE USER 建立此类属性,或在之后使用 ALTER USER 修改它们。
    • IDENTIFIED BY PASSWORD ‘auth_string’ 语法用于 CREATE USER 和 GRANT。 作为替代,对 CREATE USER 和 ALTER USER 使用 IDENTIFIED WITH auth_plugin AS ‘auth_string’,其中 ‘auth_string’ 值的格式与命名插件兼容。
    • PASSWORD() 函数已被弃用,在任何情况下都应避免使用。 因此,不推荐使用 SET PASSWORD … = PASSWORD(‘auth_string’) 语法。 SET PASSWORD … = ‘auth_string’ 语法不被弃用; 尽管如此,ALTER USER 现在是分配密码的首选语句。
    • old_passwords 系统变量。 帐户身份验证插件不能再在 mysql.user 系统表中未指定,因此任何从明文字符串分配密码的语句都可以在将字符串存储到 mysql.user 表之前明确确定要在字符串上使用的散列方法。 这使得 old_passwords 显得多余。
  • 不推荐使用查询缓存。 弃用包括以下项目:

    • FLUSH QUERY CACHERESET QUERY CACHE 语句。
    • SQL_CACHESQL_NO_CACHE SELECT 修饰符。
    • 这些系统变量:have_query_cache、ndb_cache_check_time、query_cache_limit、query_cache_min_res_unit、query_cache_size、query_cache_type、query_cache_wlock_invalidate。
    • 这些状态变量:Qcache_free_blocks、Qcache_free_memory、Qcache_hits、Qcache_inserts、Qcache_lowmem_prunes、Qcache_not_cached、Qcache_queries_in_cache、Qcache_total_blocks。
  • 以前,–transaction-isolation 和–transaction-read-only 服务器启动选项对应于 tx_isolation 和 tx_read_only 系统变量。 为了更好地对应启动选项和系统变量名,transaction_isolation 和 transaction_read_only 被创建为 tx_isolation 和 tx_read_only 的别名。 tx_isolation 和 tx_read_only 变量现在已弃用;预计它们将在 MySQL 8.0 中删除。 应调整应用程序以改用 transaction_isolation 和 transaction_read_only。

  • –skip-innodb 选项及其同义词(–innodb=OFF、–disable-innodb 等)已弃用。 这些选项从 MySQL 5.7 开始不起作用。 因为 InnoDB 不能被禁用。

  • 客户端 --ssl 和 --ssl-verify-server-cert 选项已弃用。 使用 --ssl-mode=REQUIRED 而不是 --ssl=1 或 --enable-ssl。 使用–ssl-mode=DISABLED 而不是–ssl=0、–skip-ssl 或–disable-ssl。 使用 --ssl-mode=VERIFY_IDENTITY 而不是 --ssl-verify-server-cert 选项。 (不推荐使用服务器端 --ssl 选项。)

    对于 C API,mysql_options() 的 MYSQL_OPT_SSL_ENFORCE 和 MYSQL_OPT_SSL_VERIFY_SERVER_CERT 选项对应于客户端 --ssl 和 --ssl-verify-server-cert 选项,已弃用。 使用带有 SSL_MODE_REQUIRED 或 SSL_MODE_VERIFY_IDENTITY 选项值的 MYSQL_OPT_SSL_MODE。

  • log_warnings 系统变量和 --log-warnings 服务器选项已弃用。 请改用 log_error_verbosity 系统变量。

  • –temp-pool 服务器选项已弃用。

  • binlog_max_flush_queue_time 系统变量在 MySQL 5.7 中什么都不做,从 MySQL 5.7.9 开始不推荐使用。

  • 从 MySQL 5.7.10 开始,不推荐使用 innodb_support_xa 系统变量,它为 XA 事务中的两阶段提交启用 InnoDB 支持。 从 MySQL 5.7.10 开始,始终启用 InnoDB 对 XA 事务中两阶段提交的支持。

  • 不推荐使用 metadata_locks_cache_size 和 metadata_locks_hash_instances 系统变量。 从 MySQL 5.7.4 开始,这些没有任何作用。

  • 不推荐使用 sync_frm 系统变量。

  • 不推荐使用全局 character_set_database 和 collation_database 系统变量; 期望在未来版本的 MySQL 中删除它们。

    不推荐为会话 character_set_database 和 collation_database 系统变量赋值,并且赋值会产生警告。 预计会话变量在未来版本的 MySQL 中将变为只读,并且分配给它们会产生错误,同时仍然可以读取会话变量以确定默认数据库的数据库字符集和排序规则。

  • sql_log_bin 系统变量的全局范围已被弃用,现在只能使用会话范围设置此变量。语句 SET GLOBAL SQL_LOG_BIN 现在产生错误。仍然可以读取 sql_log_bin 的全局值,但这样做会产生警告。您现在应该采取行动,从您的应用程序中删除对读取此值的任何依赖; MySQL 8.0 中删除了全局范围 sql_log_bin。

  • 随着 MySQL 8.0 中数据字典的引入,–ignore-db-dir 选项和 ignore_db_dirs 系统变量变得多余并在该版本中被删除。因此,它们在 MySQL 5.7 中已被弃用。

  • 默认情况下 GROUP BY 隐式排序(即,在没有 ASC 或 DESC 指示符的情况下),但不推荐依赖 MySQL 5.7 中的隐式 GROUP BY 排序。要实现分组结果的特定排序顺序,最好使用 生成给定排序顺序,对 GROUP BY 列使用显式 ASC 或 DESC 指示符或提供 ORDER BY 子句。 GROUP BY 排序是一个 MySQL 扩展,在未来的版本中可能会改变;例如,使优化器能够以它认为最有效的任何方式对分组进行排序并避免排序开销。

  • 不推荐使用 EXPLAIN 语句的 EXTENDED 和 PARTITIONS 关键字。 这些关键字仍可识别,但现在不再需要,因为它们的效果始终处于启用状态。

  • ENCRYPT()、ENCODE()、DECODE()、DES_ENCRYPT() 和 DES_DECRYPT() 加密函数已弃用。 对于 ENCRYPT(),请考虑使用 SHA2() 代替单向散列。 对于其他人,请考虑使用 AES_ENCRYPT() 和 AES_DECRYPT() 代替。 --des-key-file 选项、have_crypt 系统变量、FLUSH 语句的 DES_KEY_FILE 选项和 HAVE_CRYPT CMake 选项也已弃用。

  • MBREqual() 空间函数已弃用。 请改用 MBREquals()。

  • 第 12.17.4 节“从 WKB 值创建几何值的函数”中描述的函数以前接受 WKB 字符串或几何参数。 不推荐使用几何参数。 有关从使用几何参数迁移查询的指南,请参阅该部分。

  • INFORMATION_SCHEMA PROFILING 表已弃用。 改用性能模式; 参见第 25 章,MySQL 性能模式。

  • INFORMATION_SCHEMA INNODB_LOCKS 和 INNODB_LOCK_WAITS 表已弃用,将在 MySQL 8.0 中删除,它提供了替代性能模式表。

  • Performance Schema setup_timers 表已被弃用并在 MySQL 8.0 中被删除,就像 performance_timers 表中的 TICK 行一样。

  • 不推荐使用 sys 架构 sys.version 视图; 希望在未来版本的 MySQL 中删除它。 应调整受影响的应用程序以使用替代方案。 例如,使用 VERSION() 函数来检索 MySQL 服务器版本。

  • 不推荐将 \N 视为 SQL 语句中 NULL 的同义词,并在 MySQL 8.0 中删除; 请改用 NULL。

    此更改不会影响使用 LOAD DATA 或 SELECT … INTO OUTFILE 执行的文本文件导入或导出操作,对于这些操作,NULL 继续由 \N 表示。 见第 13.2.6 节,“LOAD DATA 语句”。

  • 不推荐使用 PROCEDURE ANALYSE() 语法。

  • mysql 客户端的注释剥离和控制它的选项(–skip-comments、–comments)已弃用。

  • 不推荐使用 mysqld_safe 对 syslog 输出的支持。 请改用本机服务器系统日志支持。 请参阅第 5.4.2 节,“错误日志”。

  • 不推荐将包含特殊字符的 MySQL 5.1 之前的数据库名称转换为 5.1 格式并添加 #mysql50# 前缀。 因此,mysqlcheck 的 --fix-db-names--fix-table-names 选项以及 ALTER DATABASE 语句的 UPGRADE DATA DIRECTORY NAME 子句也已弃用。

    仅支持从一个版本系列升级到另一个版本(例如,5.0 到 5.1,或 5.1 到 5.5),因此应该几乎不需要将旧的 5.0 数据库名称转换为当前版本的 MySQL。 解决方法是,将 MySQL 5.0 安装升级到 MySQL 5.1,然后再升级到更新的版本。

  • mysql_install_db 功能已集成到 MySQL 服务器 mysqld 中。 要使用此功能来初始化 MySQL 安装,如果您之前手动调用了 mysql_install_db,请使用 --initialize 或 --initialize-insecure 选项调用 mysqld,具体取决于您是否希望服务器为初始“root”生成随机密码 @‘localhost’ 帐户。

    mysql_install_db 现在已被弃用,mysql_install_db 传递给 mysqld 的特殊 --bootstrap 选项也是如此。

  • 不推荐使用 mysql_plugin 实用程序。 替代方法包括在服务器启动时使用 --plugin-load 或 --plugin-load-add 选项加载插件,或在运行时使用 INSTALL PLUGIN 语句加载插件。

  • 不推荐使用 resolveip 实用程序。 可以改用 nslookup、host 或 dig。

  • 不推荐使用 resolve_stack_dump 实用程序。 来自官方 MySQL 构建的堆栈跟踪始终是符号化的,因此无需使用 resolve_stack_dump。

  • 不推荐使用 mysql_kill()、mysql_list_fields()、mysql_list_processes() 和 mysql_refresh() C API 函数。 相应的 COM_PROCESS_KILL、COM_FIELD_LIST、COM_PROCESS_INFO 和 COM_REFRESH 客户端/服务器协议命令也是如此。 相反,使用 mysql_query() 分别执行 KILL、SHOW COLUMNS、SHOW PROCESSLIST 或 FLUSH 语句。

  • 不推荐使用 mysql_shutdown() C API 函数。 相反,使用 mysql_query() 来执行 SHUTDOWN 语句。

  • 自 MySQL 5.7.19 起,不推荐使用 libmysqld 嵌入式服务器库。 这些也已弃用:

    • mysql_config --libmysqld-libs、–embedded-libs 和 --embedded 选项
    • CMake WITH_EMBEDDED_SERVER、WITH_EMBEDDED_SHARED_LIBRARY 和 INSTALL_SECURE_FILE_PRIV_EMBEDDEDIR 选项
    • (未记录的)mysql --server-arg 选项
    • mysqltest --embedded-server、–server-arg 和 --server-file 选项
    • mysqltest_embedded 和 mysql_client_test_embedded 测试程序

    因为 libmysqld 使用的 API 与 libmysqlclient 相当,所以从 libmysqld 迁移的路径很简单:

    1. ​ 启动一个独立的 MySQL 服务器 (mysqld)。
    2. 修改应用程序代码以删除特定于 libmysqld 的 API 调用。
    3. 修改应用程序代码以连接到独立的 MySQL 服务器。
    4. 修改构建脚本以使用 libmysqlclient 而不是 libmysqld。 例如,如果您使用 mysql_config,请使用 --libs 选项而不是 --libmysqld-libs 调用它。
  • 不推荐使用替换实用程序。

  • 不推荐使用对 DTrace 的支持。

  • 从 MySQL 5.7.22 开始,不推荐使用 JSON_MERGE() 函数。 请改用 JSON_MERGE_PRESERVE()。

  • 从 MySQL 5.7.24 开始,不推荐在共享 InnoDB 表空间中放置表分区的支持。 共享表空间包括 InnoDB 系统表空间和通用表空间。 有关识别共享表空间中的分区并将它们移动到每个表文件的表空间的信息,请参阅准备安装以进行升级。

  • 从 MySQL 5.7.24 开始,不推荐使用 CREATE TEMPORARY TABLE 支持 TABLESPACE = innodb_file_per_table 和 TABLESPACE = innodb_temporary 子句。

  • –ndb perror 选项已弃用。 请改用 ndb_perror 实用程序。

1.3.3 MySQL 5.7 中删除的功能

以下项目已过时并已在 MySQL 5.7 中删除。 在显示替代方案的地方,应更新应用程序以使用它们。

对于使用 MySQL 5.7 中删除的功能的 MySQL 5.6 应用程序,语句在从 MySQL 5.6 源复制到 MySQL 5.7 副本时可能会失败,或者可能对源和副本产生不同的影响。 为避免此类问题,应修改使用 MySQL 5.7 中删除功能的应用程序以避免它们并在可能的情况下使用替代方案。

  • 删除了对使用 4.1 之前的旧密码散列格式的密码的支持,这涉及以下更改。 必须修改使用不再受支持的任何功能的应用程序。

    • mysql_old_password 身份验证插件已删除。 使用此插件的帐户在启动时被禁用,服务器将“未知插件”消息写入错误日志。 有关升级使用此插件的帐户的说明,请参阅第 6.4.1.3 节,“从 Pre-4.1 密码哈希和 mysql_old_password 插件迁移”。
    • 服务器和客户端程序的 --secure-auth 选项是默认选项,但现在是空操作。 它已被弃用; 希望在未来的 MySQL 版本中将其删除。
    • 不再支持服务器和客户端程序的 --skip-secure-auth 选项,使用它会产生错误。
    • secure_auth 系统变量只允许值为 1; 不再允许值为 0。
    • 对于 old_passwords 系统变量,不再允许值为 1(生成 4.1 之前的哈希值)。
    • OLD_PASSWORD() 函数被删除。
  • 在 MySQL 5.6.6 中,不推荐使用 2 位 YEAR(2) 数据类型。 现在删除了对 YEAR(2) 的支持。 升级到 MySQL 5.7.5 或更高版本后,任何剩余的 2 位 YEAR(2) 列必须转换为 4 位 YEAR 列才能再次可用。 有关转换策略,请参阅第 11.2.5 节,“2-Digit YEAR(2) 限制和迁移到 4-Digit YEAR”。 例如,升级后运行mysql_upgrade。

  • innodb_mirrored_log_groups 系统变量。 唯一支持的值是 1,所以它没有意义。

  • storage_engine 系统变量。 请改用 default_storage_engine。

  • thread_concurrency 系统变量。

  • timed_mutexes 系统变量。 它什么也不做,也没有效果。

  • ALTER TABLE 的 IGNORE 子句。

  • 不再支持插入延迟。 服务器识别但忽略 DELAYED 关键字,将插入处理为非延迟插入,并生成 ER_WARN_LEGACY_SYNTAX_CONVERTED 警告。 (“不再支持 INSERT DELAYED。该语句已转换为 INSERT。”)同样,REPLACE DELAYED 作为非延迟替换处理。 您应该期望在将来的版本中删除 DELAYED 关键字。

    此外,还删除了几个与 DELAYED 相关的选项或功能:

    • mysqldump 的 --delayed-insert 选项。
    • Performance Schema table_lock_waits_summary_by_table 表的 COUNT_WRITE_DELAYED、SUM_TIMER_WRITE_DELAYED、MIN_TIMER_WRITE_DELAYED、AVG_TIMER_WRITE_DELAYED 和 MAX_TIMER_WRITE_DELAYED 列。
    • mysqlbinlog 不再写提及插入延迟的评论。
  • Windows 上使用 .sym 文件的数据库符号链接已被删除,因为它与使用 mklink 的本机符号链接支持是多余的。 任何 .sym 文件符号链接现在都将被忽略,应替换为使用 mklink 创建的符号链接。 请参阅第 8.12.3.3 节,“在 Windows 上为数据库使用符号链接”。

  • mysql_upgrade 未使用的–basedir、–datadir 和–tmpdir 选项被删除。

  • 以前,程序选项可以完整指定,也可以指定为任何明确的前缀。 例如,可以将 --compress 选项作为 --compr 提供给 mysqldump,但不能作为 --comp,因为后者是不明确的。 不再支持选项前缀; 只接受完整选项。 这是因为当为程序实现新选项时,前缀可能会导致问题,并且当前明确的前缀将来可能会变得不明确。 此更改的一些含义:

    • –key-buffer 选项现在必须指定为 --key-buffer-size。
    • –skip-grant 选项现在必须指定为 --skip-grant-tables。
  • SHOW ENGINE INNODB MUTEX 输出被删除。 可以通过在 Performance Schema 表上创建视图来生成可比较的信息。

    InnoDB 表空间监视器和 InnoDB 表监视器被删除。 对于表监视器,可以从 InnoDB INFORMATION_SCHEMA 表中获取等效信息。

    用于启用和禁用标准 InnoDB Monitor 和 InnoDB Lock Monitor(innodb_monitor 和 innodb_lock_monitor)的特殊命名表被删除并替换为两个动态系统变量:innodb_status_output 和 innodb_status_output_locks。 有关其他信息,请参阅第 14.18 节,“InnoDB 监视器”。

  • 在 MySQL 5.6.3 中不推荐使用的 innodb_use_sys_malloc 和 innodb_additional_mem_pool_size 系统变量已被删除。

  • msql2mysql、mysql_convert_table_format、mysql_find_rows、mysql_fix_extensions、mysql_setpermission、mysql_waitpid、mysql_zap、mysqlaccess 和 mysqlbug 实用程序。

  • mysqlhotcopy 实用程序。 替代方案包括 mysqldump 和 MySQL Enterprise Backup。

  • binary-configure.sh 脚本。

  • 删除了 INNODB_PAGE_ATOMIC_REF_COUNT CMake 选项。

  • innodb_create_intrinsic 选项被删除。

  • innodb_optimize_point_storage 选项和相关的内部数据类型(DATA_POINT 和 DATA_VAR_POINT)被删除。

  • innodb_log_checksum_algorithm 选项被删除。

1.4 在 MySQL 5.7 中添加、弃用或删除的服务器和状态变量和选项

本节列出了 MySQL 5.7 中首次添加、已弃用或已删除的服务器变量、状态变量和选项。

1.4.1 MySQL 5.7 中引入的选项和变量

MySQL 5.7 中添加了以下系统变量、状态变量和服务器选项。

  • Audit_log_current_size:审计日志文件当前大小。在 MySQL 5.7.9 中添加。

  • Audit_log_event_max_drop_size:最大丢弃的审计事件的大小。在 MySQL 5.7.9 中添加。

  • Audit_log_events:已处理的审计事件数。在 MySQL 5.7.9 中添加。

  • Audit_log_events_filtered:过滤的审计事件数。在 MySQL 5.7.9 中添加。

  • Audit_log_events_lost:丢弃的审计事件数。在 MySQL 5.7.9 中添加。

  • Audit_log_events_written:已写入审计事件的数量。在 MySQL 5.7.9 中添加。

  • Audit_log_total_size:已写入审计事件的组合大小。在 MySQL 5.7.9 中添加。

  • Audit_log_write_waits:写入延迟的审计事件数。在 MySQL 5.7.9 中添加。

  • Com_change_repl_filter:CHANGE REPLICATION FILTER 语句的计数。在 MySQL 5.7.3 中添加。

  • Com_explain_other:EXPLAIN FOR CONNECTION 语句的计数。在 MySQL 5.7.2 中添加。

  • Com_group_replication_start:START GROUP_REPLICATION 语句的计数。在 MySQL 5.7.6 中添加。

  • Com_group_replication_stop:STOP GROUP_REPLICATION 语句的计数。在 MySQL 5.7.6 中添加。

  • Com_show_create_user:SHOW CREATE USER 语句的计数。在 MySQL 5.7.6 中添加。

  • Com_show_slave_status_nonblocking:SHOW REPLICA 计数 | SLAVE STATUS NONBLOCKING 语句。在 MySQL 5.7.0 中添加。

  • Com_shutdown:SHUTDOWN 语句的计数。在 MySQL 5.7.9 中添加。

  • Connection_control_delay_generated:服务器延迟连接请求的次数。在 MySQL 5.7.17 中添加。

  • Firewall_access_denied:MySQL 企业防火墙拒绝的语句数。在 MySQL 5.7.9 中添加。

  • Firewall_access_granted:MySQL 企业防火墙接受的语句数。在 MySQL 5.7.9 中添加。

  • Firewall_cached_entries:MySQL 企业防火墙记录的语句数。在 MySQL 5.7.9 中添加。

  • Innodb_buffer_pool_resize_status:动态缓冲池大小调整操作的状态。在 MySQL 5.7.5 中添加。

  • Locked_connects:尝试连接到锁定帐户的次数。在 MySQL 5.7.6 中添加。

  • Max_execution_time_exceeded:超过执行超时值的语句数。在 MySQL 5.7.8 中添加。

  • Max_execution_time_set:设置了执行超时的语句数。在 MySQL 5.7.8 中添加。

  • Max_execution_time_set_failed:执行超时设置失败的语句数。在 MySQL 5.7.8 中添加。

  • Max_statement_time_exceeded:超过执行超时值的语句数。在 MySQL 5.7.4 中添加。

  • Max_statement_time_set:设置了执行超时的语句数。在 MySQL 5.7.4 中添加。

  • Max_statement_time_set_failed:执行超时设置失败的语句数。在 MySQL 5.7.4 中添加。

  • Max_used_connections_time:Max_used_connections 达到其当前值的时间。在 MySQL 5.7.5 中添加。

  • Performance_schema_index_stat_lost:丢失统计信息的索引数。在 MySQL 5.7.6 中添加。

  • Performance_schema_memory_classes_lost:有多少内存仪器无法加载。在 MySQL 5.7.2 中添加。

  • Performance_schema_metadata_lock_lost:无法记录的元数据锁的数量。在 MySQL 5.7.3 中添加。

  • Performance_schema_nested_statement_lost:丢失统计信息的存储程序语句的数量。在 MySQL 5.7.2 中添加。

  • Performance_schema_prepared_statements_lost:无法检测的准备好的语句数。在 MySQL 5.7.4 中添加。

  • Performance_schema_program_lost:丢失统计信息的存储程序数。在 MySQL 5.7.2 中添加。

  • Performance_schema_table_lock_stat_lost:丢失锁统计信息的表数。在 MySQL 5.7.6 中添加。

  • Rewriter_number_loaded_rules:成功加载到内存中的重写规则的数量。在 MySQL 5.7.6 中添加。

  • Rewriter_number_reloads:规则表重新加载到内存中的次数。在 MySQL 5.7.6 中添加。

  • Rewriter_number_rewritten_queries:自加载插件以来重写的查询数量。在 MySQL 5.7.6 中添加。

  • Rewriter_reload_error:上次加载重写规则到内存时是否出错。在 MySQL 5.7.6 中添加。

  • audit-log:是否激活审计日志插件。在 MySQL 5.7.9 中添加。

  • audit_log_buffer_size:审计日志缓冲区的大小。在 MySQL 5.7.9 中添加。

  • audit_log_compression:审计日志文件压缩方式。在 MySQL 5.7.21 中添加。

  • audit_log_connection_policy:审核连接相关事件的日志记录策略。在 MySQL 5.7.9 中添加。

  • audit_log_current_session:是否审计当前会话。在 MySQL 5.7.9 中添加。

  • audit_log_encryption:审计日志文件加密方式。在 MySQL 5.7.21 中添加。

  • audit_log_exclude_accounts:不审计的帐户。在 MySQL 5.7.9 中添加。

  • audit_log_file:审计日志文件的名称。在 MySQL 5.7.9 中添加。

  • audit_log_filter_id:当前审计日志过滤器的ID。在 MySQL 5.7.13 中添加。

  • audit_log_flush:关闭并重新打开审计日志文件。在 MySQL 5.7.9 中添加。

  • audit_log_format:审计日志文件格式。在 MySQL 5.7.9 中添加。

  • audit_log_format_unix_timestamp:JSON 格式的审计日志中是否包含 Unix 时间戳。在 MySQL 5.7.35 中添加。

  • audit_log_include_accounts:要审计的帐户。在 MySQL 5.7.9 中添加。

  • audit_log_policy:审计日志策略。在 MySQL 5.7.9 中添加。

  • audit_log_read_buffer_size:审计日志文件读取缓冲区大小。在 MySQL 5.7.21 中添加。

  • audit_log_rotate_on_size:关闭并重新打开此大小的审计日志文件。在 MySQL 5.7.9 中添加。

  • audit_log_statement_policy:审核语句相关事件的日志记录策略。在 MySQL 5.7.9 中添加。

  • audit_log_strategy:审计日志策略。在 MySQL 5.7.9 中添加。

  • authentication_ldap_sasl_auth_method_name:身份验证方法名称。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_bind_base_dn:LDAP 服务器基本专有名称。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_bind_root_dn:LDAP 服务器根识别名。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_bind_root_pwd:LDAP 服务器根绑定密码。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_ca_path:LDAP 服务器证书颁发机构文件名。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_group_search_attr:LDAP 服务器组搜索属性。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_group_search_filter:LDAP 自定义组搜索过滤器。在 MySQL 5.7.21 中添加。

  • authentication_ldap_sasl_init_pool_size:LDAP 服务器初始连接池大小。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_log_status:LDAP 服务器日志级别。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_max_pool_size:LDAP 服务器最大连接池大小。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_server_host:LDAP 服务器主机名或 IP 地址。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_server_port:LDAP 服务器端口号。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_tls:是否使用加密连接到 LDAP 服务器。在 MySQL 5.7.19 中添加。

  • authentication_ldap_sasl_user_search_attr:LDAP 服务器用户搜索属性。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_auth_method_name:身份验证方法名称。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_bind_base_dn:LDAP 服务器基本专有名称。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_bind_root_dn:LDAP 服务器根识别名。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_bind_root_pwd:LDAP 服务器根绑定密码。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_ca_path:LDAP 服务器证书颁发机构文件名。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_group_search_attr:LDAP 服务器组搜索属性。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_group_search_filter:LDAP 自定义组搜索过滤器。在 MySQL 5.7.21 中添加。

  • authentication_ldap_simple_init_pool_size:LDAP 服务器初始连接池大小。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_log_status:LDAP 服务器日志级别。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_max_pool_size:LDAP 服务器最大连接池大小。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_server_host:LDAP 服务器主机名或 IP 地址。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_server_port:LDAP 服务器端口号。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_tls:是否使用加密连接到 LDAP 服务器。在 MySQL 5.7.19 中添加。

  • authentication_ldap_simple_user_search_attr:LDAP 服务器用户搜索属性。在 MySQL 5.7.19 中添加。

  • authentication_windows_log_level:Windows 身份验证插件日志记录级别。在 MySQL 5.7.9 中添加。

  • authentication_windows_use_principal_name:是否使用 Windows 身份验证插件主体名称。在 MySQL 5.7.9 中添加。

  • auto_generate_certs:是否自动生成 SSL 密钥和证书文件。在 MySQL 5.7.5 中添加。

  • avoid_temporal_upgrade:ALTER TABLE 是否应该升级 5.6.4 之前的时间列。在 MySQL 5.7.6 中添加。

  • binlog_error_action:控制服务器无法写入二进制日志时发生的情况。在 MySQL 5.7.6 中添加。

  • binlog_group_commit_sync_delay:设置在将事务同步到磁盘之前要等待的微秒数。在 MySQL 5.7.5 中添加。

  • binlog_group_commit_sync_no_delay_count:设置在中止 binlog_group_commit_sync_delay 指定的当前延迟之前要等待的最大事务数。在 MySQL 5.7.5 中添加。

  • binlog_gtid_simple_recovery:控制在 GTID 恢复期间如何迭代二进制日志。在 MySQL 5.7.6 中添加。

  • binlog_transaction_dependency_history_size:为查找上次更新某行的事务而保留的行哈希数。在 MySQL 5.7.22 中添加。

  • binlog_transaction_dependency_tracking:依赖信息的来源(提交时间戳或事务写入集),从中评估副本的多线程应用程序可以并行执行哪些事务。在 MySQL 5.7.22 中添加。

  • binlogging_impossible_mode:已弃用,后来被删除。使用 binlog_error_action 代替。在 MySQL 5.7.5 中添加。

  • block_encryption_mode:基于块的加密算法的模式。在 MySQL 5.7.4 中添加。

  • check_proxy_users:内置身份验证插件是否进行代理。在 MySQL 5.7.7 中添加。

  • connection_control_failed_connections_threshold:延迟发生前连续失败的连接尝试。在 MySQL 5.7.17 中添加。

  • connection_control_max_connection_delay:服务器响应失败连接尝试的最大延迟(毫秒)。在 MySQL 5.7.17 中添加。

  • connection_control_min_connection_delay:服务器响应失败连接尝试的最小延迟(毫秒)。在 MySQL 5.7.17 中添加。

  • daemonize:作为 System V 守护进程运行。在 MySQL 5.7.6 中添加。

  • default_authentication_plugin:默认身份验证插件。在 MySQL 5.7.2 中添加。

  • default_password_lifetime:密码有效过期的天数。在 MySQL 5.7.4 中添加。

  • disable-partition-engine-check:是否对没有本地分区的表禁用启动检查。在 MySQL 5.7.17 中添加。

  • disabled_storage_engines:不能用于创建表的存储引擎。在 MySQL 5.7.8 中添加。

  • disconnect_on_expired_password:如果客户端无法处理此类帐户,服务器是否断开具有过期密码的客户端。在 MySQL 5.7.1 中添加。

  • early-plugin-load:在加载强制内置插件之前和存储引擎初始化之前指定要加载的插件。在 MySQL 5.7.11 中添加。

  • execution_gtids_compression_period:重命名为 gtid_executed_compression_period。在 MySQL 5.7.5 中添加。

  • group_replication_allow_local_disjoint_gtids_join:允许当前服务器加入组,即使组中没有事务。在 MySQL 5.7.17 中添加。

  • group_replication_allow_local_lower_version_join:允许当前服务器加入组,即使它的插件版本低于组。在 MySQL 5.7.17 中添加。

  • group_replication_auto_increment_increment:确定在此服务器上执行的事务的连续列值之间的间隔。在 MySQL 5.7.17 中添加。

  • group_replication_bootstrap_group:将此服务器配置为引导组。在 MySQL 5.7.17 中添加。

  • group_replication_components_stop_timeout:超时,以秒为单位,该插件在关闭时等待每个组件。在 MySQL 5.7.17 中添加。

  • group_replication_compression_threshold:以字节为单位的值,高于该值(LZ4)将被强制执行;当设置为零时,停用压缩。在 MySQL 5.7.17 中添加。

  • group_replication_enforce_update_everywhere_checks:启用或禁用多源更新的严格一致性检查。在 MySQL 5.7.17 中添加。

  • group_replication_exit_state_action:实例在不自觉地离开组时的行为。在 MySQL 5.7.24 中添加。

  • group_replication_flow_control_applier_threshold:应用程序队列中触发流量控制的等待事务数。在 MySQL 5.7.17 中添加。

  • group_replication_flow_control_certifier_threshold:验证者队列中触发流控制的等待事务数。在 MySQL 5.7.17 中添加。

  • group_replication_flow_control_mode:用于流量控制的模式。在 MySQL 5.7.17 中添加。

  • group_replication_force_members:逗号分隔的对等地址列表,例如host1:port1,host2:port2。在 MySQL 5.7.17 中添加。

  • group_replication_group_name:组名。在 MySQL 5.7.17 中添加。

  • group_replication_group_seeds:peer地址列表,逗号分隔的列表如host1:port1,host2:port2。在 MySQL 5.7.17 中添加。

  • group_replication_gtid_assignment_block_size:为每个成员保留的连续GTID的数量;每个成员在需要时消耗其块并保留更多。在 MySQL 5.7.17 中添加。

  • group_replication_ip_whitelist:允许连接到组的主机列表。在 MySQL 5.7.17 中添加。

  • group_replication_local_address:主机:端口格式的本地地址。在 MySQL 5.7.17 中添加。

  • group_replication_member_weight:该成员被选为主要成员的机会。在 MySQL 5.7.20 中添加。

  • group_replication_poll_spin_loops:组通信线程等待的次数。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_complete_at:状态转移后处理缓存事务时的恢复策略。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_reconnect_interval:休眠时间,以秒为单位,当在组中没有找到供体时,重新连接尝试之间的时间。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_retry_count:加入成员在放弃之前尝试连接到可用捐助者的次数。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_ssl_ca:包含受信任的 SSL 证书颁发机构列表的文件。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_ssl_capath:包含受信任的 SSL 证书颁发机构证书文件的目录。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_ssl_cert:用于建立加密连接的 SSL 证书文件的名称。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_ssl_cipher:SSL 加密允许的密码。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_ssl_crl:包含证书吊销列表的文件。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_ssl_crlpath:包含证书撤销列表文件的目录。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_ssl_key:用于建立加密连接的 SSL 密钥文件的名称。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_ssl_verify_server_cert:使恢复过程检查捐赠者发送的证书中的服务器通用名称值。在 MySQL 5.7.17 中添加。

  • group_replication_recovery_use_ssl:组复制恢复连接是否应使用 SSL。在 MySQL 5.7.17 中添加。

  • group_replication_single_primary_mode:指示组使用单个服务器进行读/写工作负载。在 MySQL 5.7.17 中添加。

  • group_replication_ssl_mode:组复制成员之间的连接所需的安全状态。在 MySQL 5.7.17 中添加。

  • group_replication_start_on_boot:服务器是否应该在服务器启动期间启动组复制。在 MySQL 5.7.17 中添加。

  • group_replication_transaction_size_limit:设置组接受的最大事务大小(以字节为单位)。在 MySQL 5.7.19 中添加。

  • group_replication_unreachable_majority_timeout:等待导致少数离开组的网络分区的时间。在 MySQL 5.7.19 中添加。

  • gtid_executed_compression_period:每次发生这么多事务时压缩 gtid_executed 表。 0 表示从不压缩此表。仅在禁用二进制日志记录时适用。在 MySQL 5.7.6 中添加。

  • have_statement_timeout:语句执行超时是否可用。在 MySQL 5.7.4 中添加。

  • 初始化:是否在初始化模式(安全)下运行。在 MySQL 5.7.6 中添加。

  • initialize-insecure:是否以初始化模式运行(不安全)。在 MySQL 5.7.6 中添加。

  • innodb_adaptive_hash_index_parts:将自适应哈希索引搜索系统划分为 n 个分区,每个分区由单独的闩锁保护。每个索引根据空间 ID 和索引 ID 属性绑定到特定的分区。在 MySQL 5.7.8 中添加。

  • innodb_background_drop_list_empty:延迟表创建,直到后台下拉列表为空(调试)。在 MySQL 5.7.10 中添加。

  • innodb_buffer_pool_chunk_size:调整缓冲池大小时使用的块大小。在 MySQL 5.7.5 中添加。

  • innodb_buffer_pool_dump_pct:每个缓冲池要读出和转储的最近使用的页面的百分比。在 MySQL 5.7.2 中添加。

  • innodb_compress_debug:使用指定的压缩算法压缩所有表。在 MySQL 5.7.8 中添加。

  • innodb_deadlock_detect:启用或禁用死锁检测。在 MySQL 5.7.15 中添加。

  • innodb_default_row_format:InnoDB 表的默认行格式。在 MySQL 5.7.9 中添加。

  • innodb_disable_resize_buffer_pool_debug:禁用 InnoDB 缓冲池的大小调整。在 MySQL 5.7.6 中添加。

  • innodb_fill_factor:要填充数据的 B 树叶子和非叶子页面空间的百分比。剩余空间用于未来增长。在 MySQL 5.7.5 中添加。

  • innodb_flush_sync:启用 innodb_flush_sync 以忽略检查点发生的 I/O 活动突发的 innodb_io_capacity 设置。禁用 innodb_flush_sync 以遵守由 innodb_io_capacity 设置定义的 I/O 活动的限制。在 MySQL 5.7.8 中添加。

  • innodb_ft_result_cache_limit:InnoDB FULLTEXT 搜索查询结果缓存限制。在 MySQL 5.7.2 中添加。

  • innodb_ft_total_cache_size:为 InnoDB FULLTEXT 搜索索引缓存分配的总内存。在 MySQL 5.7.2 中添加。

  • innodb_log_checkpoint_now:强制 InnoDB 写入检查点的调试选项。在 MySQL 5.7.2 中添加。

  • innodb_log_checksum_algorithm:指定如何生成和验证存储在每个重做日志磁盘块中的校验和。在 MySQL 5.7.8 中添加。

  • innodb_log_checksums:启用或禁用重做日志页面的校验和。在 MySQL 5.7.9 中添加。

  • innodb_log_write_ahead_size:重做日志预写块大小。在 MySQL 5.7.4 中添加。

  • innodb_max_undo_log_size:设置截断 InnoDB 撤消日志的阈值。在 MySQL 5.7.5 中添加。

  • innodb_merge_threshold_set_all_debug:使用当前在字典缓存中的所有索引的指定值覆盖当前的 MERGE_THRESHOLD 设置。在 MySQL 5.7.6 中添加。

  • innodb_numa_interleave:为 InnoDB 缓冲池的分配启用 NUMA MPOL_INTERLEAVE 内存策略。在 MySQL 5.7.9 中添加。

  • innodb_optimize_point_storage:启用此选项可将 POINT 数据存储为固定长度数据而不是可变长度数据。在 MySQL 5.7.5 中添加。

  • innodb_page_cleaners:页面清理线程的数量。在 MySQL 5.7.4 中添加。

  • innodb_purge_rseg_truncate_frequency:作为清除操作的一部分,应调用撤消日志清除的速率。 Value = n 在每次清除调用的第 n 次迭代时调用撤消日志清除。在 MySQL 5.7.5 中添加。

  • innodb_stats_include_delete_marked:在计算持久 InnoDB 统计信息时包括删除标记的记录。在 MySQL 5.7.17 中添加。

  • innodb_status_output:用于启用或禁用标准 InnoDB Monitor 的定期输出。还与 innodb_status_output_locks 结合使用以启用和禁用 InnoDB 锁定监视器的定期输出。在 MySQL 5.7.4 中添加。

  • innodb_status_output_locks:用于启用或禁用标准 InnoDB 锁监视器的定期输出。还必须启用 innodb_status_output 以生成 InnoDB Lock Monitor 的定期输出。在 MySQL 5.7.4 中添加。

  • innodb_sync_debug:启用 InnoDB 同步调试检查。在 MySQL 5.7.8 中添加。

  • innodb_temp_data_file_path:临时表空间数据文件的路径及其大小。在 MySQL 5.7.1 中添加。

  • innodb_tmpdir:在线 ALTER TABLE 操作期间创建的临时表文件的目录位置。在 MySQL 5.7.11 中添加。

  • innodb_undo_log_truncate:启用此选项以将 InnoDB 撤消表空间标记为截断。在 MySQL 5.7.5 中添加。

  • internal_tmp_disk_storage_engine:内部临时表的存储引擎。在 MySQL 5.7.5 中添加。

  • keyring-migration-destination:密钥迁移目的地密钥环插件。在 MySQL 5.7.21 中添加。

  • keyring-migration-host:连接到运行服务器进行密钥迁移的主机名。在 MySQL 5.7.21 中添加。

  • keyring-migration-password:连接到正在运行的服务器进行密钥迁移的密码。在 MySQL 5.7.21 中添加。

  • keyring-migration-port:TCP/IP 端口号,用于连接到正在运行的服务器进行密钥迁移。在 MySQL 5.7.21 中添加。

  • keyring-migration-socket:用于连接到正在运行的服务器以进行密钥迁移的 Unix 套接字文件或 Windows 命名管道。在 MySQL 5.7.21 中添加。

  • keyring-migration-source:密钥迁移源密钥环插件。在 MySQL 5.7.21 中添加。

  • keyring-migration-user:连接运行服务器进行密钥迁移的用户名。在 MySQL 5.7.21 中添加。

  • keyring_aws_cmk_id:AWS 密钥环插件客户主密钥 ID 值。在 MySQL 5.7.19 中添加。

  • keyring_aws_conf_file:AWS 密钥环插件配置文件位置。在 MySQL 5.7.19 中添加。

  • keyring_aws_data_file:AWS 密钥环插件存储文件位置。在 MySQL 5.7.19 中添加。

  • keyring_aws_region:AWS 密钥环插件区域。在 MySQL 5.7.19 中添加。

  • keyring_encrypted_file_data:keyring_encrypted_file 插件数据文件。在 MySQL 5.7.21 中添加。

  • keyring_encrypted_file_password:keyring_encrypted_file 插件密码。在 MySQL 5.7.21 中添加。

  • keyring_file_data:keyring_file 插件数据文件。在 MySQL 5.7.11 中添加。

  • keyring_okv_conf_dir:Oracle Key Vault 密钥环插件配置目录。在 MySQL 5.7.12 中添加。

  • keyring_operations:是否启用密钥环操作。在 MySQL 5.7.21 中添加。

  • log_backward_compatible_user_definitions:是否以向后兼容的方式记录 CREATE/ALTER USER、GRANT。在 MySQL 5.7.6 中添加。

  • log_builtin_as_identified_by_password:是否以向后兼容的方式记录 CREATE/ALTER USER、GRANT。在 MySQL 5.7.9 中添加。

  • log_error_verbosity:错误记录详细级别。在 MySQL 5.7.2 中添加。

  • log_slow_admin_statements:记录慢速的 OPTIMIZE、ANALYZE、ALTER 和其他管理语句以在打开时减慢查询日志。在 MySQL 5.7.1 中添加。

  • log_slow_slave_statements:导致副本执行的慢语句写入慢查询日志。在 MySQL 5.7.1 中添加。

  • log_statements_unsafe_for_binlog:禁用写入错误日志的错误 1592 警告。在 MySQL 5.7.11 中添加。

  • log_syslog:是否将错误日志写入系统日志。在 MySQL 5.7.5 中添加。

  • log_syslog_facility:系统日志消息的工具。在 MySQL 5.7.5 中添加。

  • log_syslog_include_pid:是否在系统日志消息中包含服务器 PID。在 MySQL 5.7.5 中添加。

  • log_syslog_tag:系统日志消息中服务器标识符的标记。在 MySQL 5.7.5 中添加。

  • log_timestamps:日志时间戳格式。在 MySQL 5.7.2 中添加。

  • max_digest_length:最大摘要大小(以字节为单位)。在 MySQL 5.7.6 中添加。

  • max_execution_time:语句执行超时值。在 MySQL 5.7.8 中添加。

  • max_points_in_geometry:ST_Buffer_Strategy() 几何值中的最大点数。在 MySQL 5.7.8 中添加。

  • max_statement_time:语句执行超时值。在 MySQL 5.7.4 中添加。

  • mecab_charset:MeCab 全文解析器插件当前使用的字符集。在 MySQL 5.7.6 中添加。

  • mecab_rc_file:用于全文搜索的 MeCab 解析器的 mecabrc 配置文件的路径。在 MySQL 5.7.6 中添加。

  • mysql_firewall_mode:MySQL 企业防火墙是否可运行。在 MySQL 5.7.9 中添加。

  • mysql_firewall_trace:是否启用防火墙跟踪。在 MySQL 5.7.9 中添加。

  • mysql_native_password_proxy_users:mysql_native_password 身份验证插件是否进行代理。在 MySQL 5.7.7 中添加。

  • mysqlx:X Plugin 是否初始化。在 MySQL 5.7.12 中添加。

  • mysqlx_bind_address:X 插件用于连接的网络地址。在 MySQL 5.7.17 中添加。

  • mysqlx_connect_timeout:连接建立会话的最大允许等待时间(以秒为单位)。在 MySQL 5.7.12 中添加。

  • mysqlx_idle_worker_thread_timeout:空闲工作线程终止后的时间(以秒为单位)。在 MySQL 5.7.12 中添加。

  • mysqlx_max_allowed_packet:X Plugin 可以接收的网络数据包的最大大小。在 MySQL 5.7.12 中添加。

  • mysqlx_max_connections:X 插件可以接受的最大并发客户端连接数。在 MySQL 5.7.12 中添加。

  • mysqlx_min_worker_threads:用于处理客户端请求的最小工作线程数。在 MySQL 5.7.12 中添加。

  • mysqlx_port:X 插件接受 TCP/IP 连接的端口号。在 MySQL 5.7.12 中添加。

  • mysqlx_port_open_timeout:X 插件在接受连接时等待的时间。在 MySQL 5.7.17 中添加。

  • mysqlx_socket:X 插件监听连接的套接字路径。在 MySQL 5.7.15 中添加。

  • mysqlx_ssl_ca:包含受信任的 SSL 证书颁发机构列表的文件。在 MySQL 5.7.12 中添加。

  • mysqlx_ssl_capath:包含受信任的 SSL 证书颁发机构证书文件的目录。在 MySQL 5.7.12 中添加。

  • mysqlx_ssl_cert:包含 X.509 证书的文件。在 MySQL 5.7.12 中添加。

  • mysqlx_ssl_cipher:连接加密的允许密码。在 MySQL 5.7.12 中添加。

  • mysqlx_ssl_crl:包含证书吊销列表的文件。在 MySQL 5.7.12 中添加。

  • mysqlx_ssl_crlpath:包含证书吊销列表文件的目录。在 MySQL 5.7.12 中添加。

  • mysqlx_ssl_key:包含 X.509 密钥的文件。在 MySQL 5.7.12 中添加。

  • named_pipe_full_access_group:授予对命名管道的完全访问权限的 Windows 组的名称。在 MySQL 5.7.25 中添加。

  • ngram_token_size:定义全文搜索 ngram 解析器的 n-gram 标记大小。在 MySQL 5.7.6 中添加。

  • offline_mode:服务器是否离线。在 MySQL 5.7.5 中添加。

  • parser_max_mem_size:解析器可用的最大内存量。在 MySQL 5.7.12 中添加。

  • performance-schema-consumer-events-transactions-current:配置 events-transactions-current 消费者。在 MySQL 5.7.3 中添加。

  • performance-schema-consumer-events-transactions-history:配置 events-transactions-history 消费者。在 MySQL 5.7.3 中添加。

  • performance-schema-consumer-events-transactions-history-long:配置 events-transactions-history-long 消费者。在 MySQL 5.7.3 中添加。

  • performance_schema_events_transactions_history_long_size:events_transactions_history_long 表中的行数。在 MySQL 5.7.3 中添加。

  • performance_schema_events_transactions_history_size:events_transactions_history 表中每个线程的行数。在 MySQL 5.7.3 中添加。

  • performance_schema_max_digest_length:最大性能架构摘要大小(以字节为单位)。在 MySQL 5.7.8 中添加。

  • performance_schema_max_index_stat:要保留统计信息的最大索引数。在 MySQL 5.7.6 中添加。

  • performance_schema_max_memory_classes:内存仪器的最大数量。在 MySQL 5.7.2 中添加。

  • performance_schema_max_metadata_locks:要跟踪的最大元数据锁数。在 MySQL 5.7.3 中添加。

  • performance_schema_max_prepared_statements_instances:prepared_statements_instances 表中的行数。在 MySQL 5.7.4 中添加。

  • performance_schema_max_program_instances:用于统计的最大存储程序数。在 MySQL 5.7.2 中添加。

  • performance_schema_max_sql_text_length:从 SQL 语句存储的最大字节数。在 MySQL 5.7.6 中添加。

  • performance_schema_max_statement_stack:用于统计的最大存储程序嵌套。在 MySQL 5.7.2 中添加。

  • performance_schema_max_table_lock_stat:要保留锁统计信息的最大表数。在 MySQL 5.7.6 中添加。

  • range_optimizer_max_mem_size:限制范围优化器内存消耗。在 MySQL 5.7.9 中添加。

  • rbr_exec_mode:允许在 IDEMPOTENT 模式(抑制密钥和其他一些错误)和 STRICT 模式之间切换服务器;严格模式是默认的。在 MySQL 5.7.1 中添加。

  • replication_optimize_for_static_plugin_config:半同步复制的共享锁。在 MySQL 5.7.33 中添加。

  • replication_sender_observe_commit_only:半同步复制的有限回调。在 MySQL 5.7.33 中添加。

  • require_secure_transport:客户端连接是否必须使用安全传输。在 MySQL 5.7.8 中添加。

  • rewriter_enabled:是否启用示例查询重写插件。在 MySQL 5.7.6 中添加。

  • rewriter_verbose:供内部使用。在 MySQL 5.7.6 中添加。

  • rpl_semi_sync_master_wait_for_slave_count:在继续之前,每个事务源必须接收的副本确认数。在 MySQL 5.7.3 中添加。

  • rpl_semi_sync_master_wait_point:副本交易接收确认的等待点。在 MySQL 5.7.2 中添加。

  • rpl_stop_slave_timeout:STOP REPLICA 或 STOP SLAVE 在超时之前等待的秒数。在 MySQL 5.7.2 中添加。

  • session_track_gtids:启用跟踪器,可以设置跟踪不同的 GTID。在 MySQL 5.7.6 中添加。

  • session_track_schema:是否跟踪架构变化。在 MySQL 5.7.4 中添加。

  • session_track_state_change:是否跟踪会话状态变化。在 MySQL 5.7.4 中添加。

  • session_track_system_variables:要跟踪更改的会话变量。在 MySQL 5.7.4 中添加。

  • session_track_transaction_info:如何执行事务跟踪。在 MySQL 5.7.8 中添加。

  • sha256_password_auto_generate_rsa_keys:是否自动生成RSA密钥对文件。在 MySQL 5.7.5 中添加。

  • sha256_password_proxy_users:sha256_password 认证插件是否进行代理。在 MySQL 5.7.7 中添加。

  • show_compatibility_56:显示状态/变量的兼容性。在 MySQL 5.7.6 中添加。

  • show_create_table_verbosity:是否在 SHOW CREATE TABLE 中显示 ROW_FORMAT 即使它有默认值。在 MySQL 5.7.22 中添加。

  • show_old_temporals:SHOW CREATE TABLE 是否应指示 5.6.4 之前的时间列。在 MySQL 5.7.6 中添加。

  • simple_binlog_gtid_recovery:重命名为 binlog_gtid_simple_recovery。在 MySQL 5.7.5 中添加。

  • slave_parallel_type:告诉副本使用时间戳信息(LOGICAL_CLOCK)或数据库分区(DATABASE)来并行化事务。在 MySQL 5.7.2 中添加。

  • slave_preserve_commit_order:确保副本工作者的所有提交以与源相同的顺序发生,以在使用并行应用程序线程时保持一致性。在 MySQL 5.7.5 中添加。

  • super_read_only: 是否忽略只读模式的 SUPER 异常。在 MySQL 5.7.8 中添加。

  • thread_pool_algorithm:线程池算法。在 MySQL 5.7.9 中添加。

  • thread_pool_high_priority_connection:当前会话是否为高优先级。在 MySQL 5.7.9 中添加。

  • thread_pool_max_unused_threads:允许的最大未使用线程数。在 MySQL 5.7.9 中添加。

  • thread_pool_prio_kickup_timer:语句移至高优先级执行前的时间。在 MySQL 5.7.9 中添加。

  • thread_pool_size:线程池中的线程组数。在 MySQL 5.7.9 中添加。

  • thread_pool_stall_limit:语句被定义为停顿前多长时间。在 MySQL 5.7.9 中添加。

  • tls_version:加密连接允许的 TLS 协议。在 MySQL 5.7.10 中添加。

  • transaction_write_set_extraction:定义用于散列在事务期间提取的写入的算法。在 MySQL 5.7.6 中添加。

  • validate_password_check_user_name:是否根据用户名检查密码。在 MySQL 5.7.15 中添加。

  • validate_password_dictionary_file_last_parsed:上次解析字典文件的时间。在 MySQL 5.7.8 中添加。

  • validate_password_dictionary_file_words_count:字典文件中的单词数。在 MySQL 5.7.8 中添加。

  • version_tokens_session:版本令牌的客户端令牌列表。在 MySQL 5.7.8 中添加。

  • version_tokens_session_number:供内部使用。在 MySQL 5.7.8 中添加。

1.4.2 MySQL 5.7 中弃用的选项和变量

MySQL 5.7 中已弃用以下系统变量、状态变量和选项。

  • Innodb_available_undo_logs:InnoDB 回滚段总数;与 innodb_rollback_segments 不同,后者显示活动回滚段的数量。在 MySQL 5.7.19 中已弃用。

  • Qcache_free_blocks:查询缓存中的空闲内存块数。在 MySQL 5.7.20 中已弃用。

  • Qcache_free_memory:查询缓存的可用内存量。在 MySQL 5.7.20 中已弃用。

  • Qcache_hits:查询缓存命中数。在 MySQL 5.7.20 中已弃用。

  • Qcache_inserts:查询缓存插入次数。在 MySQL 5.7.20 中已弃用。

  • Qcache_lowmem_prunes:由于缓存中缺少可用内存而从查询缓存中删除的查询数。在 MySQL 5.7.20 中已弃用。

  • Qcache_not_cached:非缓存查询的数量(不可缓存,或由于 query_cache_type 设置而未缓存)。在 MySQL 5.7.20 中已弃用。

  • Qcache_queries_in_cache:查询缓存中注册的查询数。在 MySQL 5.7.20 中已弃用。

  • Qcache_total_blocks:查询缓存中的块总数。在 MySQL 5.7.20 中已弃用。

  • Slave_heartbeat_period:Replica 的复制心跳间隔,单位为秒。在 MySQL 5.7.6 中已弃用。

  • Slave_last_heartbeat:显示接收到最新心跳信号的时间,采用 TIMESTAMP 格式。在 MySQL 5.7.6 中已弃用。

  • Slave_received_heartbeats:自上次重置以来副本收到的心跳数。在 MySQL 5.7.6 中已弃用。

  • Slave_retried_transactions:自启动以来复制 SQL 线程重试事务的总次数。在 MySQL 5.7.6 中已弃用。

  • Slave_running:此服务器作为副本的状态(复制 I/O 线程状态)。在 MySQL 5.7.6 中已弃用。

  • avoid_temporal_upgrade:ALTER TABLE 是否应该升级 5.6.4 之前的时间列。在 MySQL 5.7.6 中已弃用。

  • binlog_max_flush_queue_time:在刷新到二进制日志之前读取事务的时间。在 MySQL 5.7.9 中已弃用。

  • bootstrap:由mysql安装脚本使用。在 MySQL 5.7.6 中已弃用。

  • des-key-file:从给定文件加载 des_encrypt() 和 des_encrypt 的密钥。在 MySQL 5.7.6 中已弃用。

  • disable-partition-engine-check:是否对没有本地分区的表禁用启动检查。在 MySQL 5.7.17 中已弃用。

  • group_replication_allow_local_disjoint_gtids_join:允许当前服务器加入组,即使组中没有事务。在 MySQL 5.7.21 中已弃用。

  • have_crypt:crypt() 系统调用的可用性。在 MySQL 5.7.6 中已弃用。

  • have_query_cache:mysqld 是否支持查询缓存。在 MySQL 5.7.20 中已弃用。

  • ignore-db-dir:将目录视为非数据库目录。在 MySQL 5.7.16 中已弃用。

  • ignore_db_dirs:将目录视为非数据库目录。在 MySQL 5.7.16 中已弃用。

  • innodb:启用 InnoDB(如果此版本的 MySQL 支持)。在 MySQL 5.7.5 中已弃用。

  • innodb_file_format:新 InnoDB 表的格式。在 MySQL 5.7.7 中已弃用。

  • innodb_file_format_check:InnoDB 是否进行文件格式兼容性检查。在 MySQL 5.7.7 中已弃用。

  • innodb_file_format_max:共享表空间中的文件格式标签。在 MySQL 5.7.7 中已弃用。

  • innodb_large_prefix:为列前缀索引启用更长的键。在 MySQL 5.7.7 中已弃用。

  • innodb_support_xa:为 XA 两阶段提交启用 InnoDB 支持。在 MySQL 5.7.10 中已弃用。

  • innodb_undo_logs:InnoDB 使用的撤销日志(回滚段)数量; innodb_rollback_segments 的别名。在 MySQL 5.7.19 中已弃用。

  • innodb_undo_tablespaces:回滚段划分的表空间文件数。在 MySQL 5.7.21 中已弃用。

  • 日志警告:将一些非关键警告写入日志文件。在 MySQL 5.7.2 中已弃用。

  • metadata_locks_cache_size:元数据锁缓存的大小。在 MySQL 5.7.4 中已弃用。

  • metadata_locks_hash_instances:元数据锁哈希数。在 MySQL 5.7.4 中已弃用。

  • old_passwords:为 PASSWORD() 选择密码散列方法。在 MySQL 5.7.6 中已弃用。

  • partition:启用(或禁用)分区支持。在 MySQL 5.7.16 中已弃用。

  • query_cache_limit:不要缓存大于这个的结果。在 MySQL 5.7.20 中已弃用。

  • query_cache_min_res_unit:分配结果空间的最小单元大小(在写入所有结果数据后修剪最后一个单元)。在 MySQL 5.7.20 中已弃用。

  • query_cache_size:分配给存储旧查询结果的内存。在 MySQL 5.7.20 中已弃用。

  • query_cache_type:查询缓存类型。在 MySQL 5.7.20 中已弃用。

  • query_cache_wlock_invalidate:在 LOCK 写入时使查询缓存中的查询无效。在 MySQL 5.7.20 中已弃用。

  • secure_auth:禁止对具有旧(4.1 之前)密码的帐户进行身份验证。在 MySQL 5.7.5 中已弃用。

  • show_compatibility_56:显示状态/变量的兼容性。在 MySQL 5.7.6 中已弃用。

  • show_old_temporals:SHOW CREATE TABLE 是否应指示 5.6.4 之前的时间列。在 MySQL 5.7.6 中已弃用。

  • skip-partition:不启用用户定义的分区。在 MySQL 5.7.16 中已弃用。

  • sync_frm:在创建时将 .frm 同步到磁盘。默认启用。在 MySQL 5.7.6 中已弃用。

  • temp-pool:使用此选项会导致创建的大多数临时文件使用一小组名称,而不是每个新文件的唯一名称。在 MySQL 5.7.18 中已弃用。

  • tx_isolation:默认事务隔离级别。在 MySQL 5.7.20 中已弃用。

  • tx_read_only:默认事务访问模式。在 MySQL 5.7.20 中已弃用。

1.4.3 MySQL 5.7 中删除的选项和变量

MySQL 5.7 中删除了以下系统变量、状态变量和选项。

  • Com_show_slave_status_nonblocking:SHOW REPLICA 计数 | SLAVE STATUS NONBLOCKING 语句。在 MySQL 5.7.6 中删除。

  • Max_statement_time_exceeded:超过执行超时值的语句数。在 MySQL 5.7.8 中删除。

  • Max_statement_time_set:设置了执行超时的语句数。在 MySQL 5.7.8 中删除。

  • Max_statement_time_set_failed:执行超时设置失败的语句数。在 MySQL 5.7.8 中删除。

  • binlogging_impossible_mode:已弃用,后来被删除。使用 binlog_error_action 代替。在 MySQL 5.7.6 中删除。

  • 默认身份验证插件:默认身份验证插件。在 MySQL 5.7.2 中删除。

  • execution_gtids_compression_period:重命名为 gtid_executed_compression_period。在 MySQL 5.7.6 中删除。

  • innodb_additional_mem_pool_size:InnoDB 用于存储数据字典信息和其他内部数据结构的内存池大小。在 MySQL 5.7.4 中删除。

  • innodb_log_checksum_algorithm:指定如何生成和验证存储在每个重做日志磁盘块中的校验和。在 MySQL 5.7.9 中删除。

  • innodb_optimize_point_storage:启用此选项可将 POINT 数据存储为固定长度数据而不是可变长度数据。在 MySQL 5.7.6 中删除。

  • innodb_use_sys_malloc:InnoDB 是使用操作系统还是自己的内存分配器。在 MySQL 5.7.4 中删除。

  • log-slow-admin-statements:记录慢速 OPTIMIZE、ANALYZE、ALTER 和其他管理语句以在打开时减慢查询日志。在 MySQL 5.7.1 中删除。

  • log-slow-slave-statements:将副本执行的慢语句写入慢查询日志。在 MySQL 5.7.1 中删除。

  • log_backward_compatible_user_definitions:是否以向后兼容的方式记录 CREATE/ALTER USER、GRANT。在 MySQL 5.7.9 中删除。

  • max_statement_time:语句执行超时值。在 MySQL 5.7.8 中删除。

  • simple_binlog_gtid_recovery:重命名为 binlog_gtid_simple_recovery。在 MySQL 5.7.6 中删除。

  • storage_engine:默认存储引擎。在 MySQL 5.7.5 中删除。

  • thread_concurrency:允许应用程序向线程系统提供提示,以获取应一次运行的所需线程数。在 MySQL 5.7.2 中删除。

  • timed_mutexes:指定是否定时互斥(目前仅支持 InnoDB 互斥)。在 MySQL 5.7.5 中删除。

1.5 MySQL信息来源

本节列出了您可能会觉得有帮助的其他信息的来源,例如 MySQL 网站、邮件列表、用户论坛和 Internet 中继聊天。

1.5.1 MySQL 网站

MySQL 文档的主要网站是 https://dev.mysql.com/doc/。 在线和可下载的文档格式可用于 MySQL 参考手册、MySQL 连接器等。

MySQL 开发人员在 MySQL 服务器博客上提供有关新功能和即将推出的功能的信息。

1.5.2 MySQL 论坛上的 MySQL 社区支持

http://forums.mysql.com 上的论坛是重要的社区资源。 许多论坛可用,分为以下一般类别:

  • 移民

  • MySQL 用法

  • MySQL 连接器

  • 编程语言

  • 工具

  • 第三方应用

  • 存储引擎

  • MySQL 技术

  • SQL标准

  • 商业

1.5.3 MySQL 企业版

Oracle 以 MySQL Enterprise 的形式提供技术支持。 对于依赖 MySQL DBMS 进行业务关键生产应用程序的组织,MySQL Enterprise 是一种商业订阅产品,其中包括:

  • MySQL 企业服务器

  • MySQL 企业监控器

  • 每月快速更新和每季度服务包

  • MySQL知识库

  • 24x7 技术和咨询支持

MySQL Enterprise 提供多个层级,让您可以灵活地选择最符合您需求的服务级别。 有关更多信息,请参阅 MySQL 企业版

1.6 如何报告错误或问题

在发布有关问题的错误报告之前,请尝试验证它是错误并且尚未报告:

  • 首先在 https://dev.mysql.com/doc/ 搜索 MySQL 在线手册。 我们尝试通过经常更新手册来解决新发现的问题,从而使手册保持最新状态。 此外,手册随附的发行说明可能特别有用,因为较新的版本很可能包含您问题的解决方案。 发行说明可在刚刚为手册提供的位置找到。

  • 如果您收到 SQL 语句的解析错误,请仔细检查您的语法。 如果您找不到它的问题,很可能您当前版本的 MySQL 服务器不支持您正在使用的语法。 如果您使用的是当前版本并且手册未涵盖您使用的语法,则 MySQL Server 不支持您的语句。

    如果手册涵盖了你正在使用的语法,但你有一个旧版本的 MySQL 服务器,你应该检查 MySQL 更改历史以查看语法何时实施。 在这种情况下,您可以选择升级到更新版本的 MySQL 服务器。

  • 有关一些常见问题的解决方案,请参见第 B.3 节“问题和常见错误”。

  • 在 http://bugs.mysql.com/ 上搜索错误数据库以查看错误是否已报告和修复。

  • 您还可以使用 http://www.mysql.com/search/ 搜索位于 MySQL 网站的所有网页(包括手册)。

如果您在手册、错误数据库或邮件列表档案中找不到答案,请咨询您当地的 MySQL 专家。 如果您仍然找不到问题的答案,请使用以下指南来报告错误。

报告错误的正常方法是访问 http://bugs.mysql.com/,这是我们错误数据库的地址。 该数据库是公开的,任何人都可以浏览和搜索。 如果您登录系统,则可以输入新报告。

在 http://bugs.mysql.com/ 上的错误数据库中发布的已针对给定版本更正的错误在发行说明中注明。

如果您发现 MySQL Server 中存在安全漏洞,请立即通过发送电子邮件至 secalert_us@oracle.com 通知我们。 例外:支持客户应通过 http://support.oracle.com/ 向 Oracle 支持报告所有问题,包括安全错误。

要与其他用户讨论问题,您可以使用 MySQL Community Slack。

编写一个好的错误报告需要耐心,但第一次做对可以为我们和你自己节省时间。一个好的错误报告,包含一个完整的错误测试用例,使我们很有可能在下一个版本中修复这个错误。此部分可帮助您正确编写报告,以免您浪费时间做可能对我们没有太大帮助或根本没有帮助的事情。请仔细阅读本节并确保此处描述的所有信息都包含在您的报告中。

最好在发布之前使用 MySQL Server 的最新生产或开发版本测试问题。任何人都应该能够通过在测试用例上使用 mysql test < script_file 或通过运行包含在错误报告中的 shell 或 Perl 脚本来重复错误。我们能够重复的任何错误都有很大的机会在下一个 MySQL 版本中修复。

当错误报告中包含对问题的良好描述时,这是最有帮助的。也就是说,举出一个很好的例子,说明你所做的导致问题的一切,并准确详细地描述了问题本身。最好的报告是包含完整示例的报告,该示例展示了如何重现错误或问题。见第 5.8 节,“调试 MySQL”。

请记住,我们可能会对一份包含过多信息的报告做出回应,但不能对一份包含过少信息的报告做出回应。人们经常忽略事实,因为他们认为他们知道问题的原因,并认为某些细节无关紧要。要遵循的一个好原则是,如果您对陈述某事有疑问,请陈述它。如果我们必须要求您提供初始报告中遗漏的信息,在您的报告中多写几行比等待更长时间才能更快、更省事。

错误报告中最常见的错误是 (a) 不包括您使用的 MySQL 发行版的版本号,以及 (b) 未完整描述安装 MySQL 服务器的平台(包括平台类型和版本号)。这些是高度相关的信息,在 100 个案例中有 99 个案例中,如果没有它们,错误报告将毫无用处。我们经常会收到诸如“为什么这对我不起作用?”之类的问题。然后我们发现请求的功能没有在那个 MySQL 版本中实现,或者报告中描述的错误已在新的 MySQL 版本中修复。错误通常与平台有关。在这种情况下,我们几乎不可能在不知道操作系统和平台版本号的情况下修复任何东西。

如果您从源代码编译 MySQL,请记住还提供有关您的编译器的信息(如果它与问题有关)。通常人们会在编译器中发现错误并认为问题与 MySQL 相关。大多数编译器一直在开发中,并逐个版本地变得更好。要确定您的问题是否取决于您的编译器,我们需要知道您使用的是什么编译器。请注意,每个编译问题都应视为错误并相应报告。

如果程序产生错误消息,在报告中包含该消息非常重要。如果我们尝试从档案中搜索某些内容,报告的错误消息最好与程序生成的错误消息完全匹配。 (甚至应该注意字母大小写。)最好将整个错误消息复制并粘贴到您的报告中。你永远不应该试图从记忆中重现消息。

如果您对连接器/ODBC (MyODBC) 有问题,请尝试生成跟踪文件并将其与您的报告一起发送。请参阅如何报告连接器/ODBC 问题或错误。

如果您的报告包含您使用 mysql 命令行工具运行的测试用例的长查询输出行,您可以使用 --vertical 选项或 \G 语句终止符使输出更具可读性。 本节后面的 EXPLAIN SELECT 示例演示了 \G 的使用。

请在您的报告中包含以下信息:

  • 您正在使用的 MySQL 发行版的版本号(例如,MySQL 5.7.10)。您可以通过执行 mysqladmin version 找出您正在运行的版本。 mysqladmin 程序可以在你的 MySQL 安装目录下的 bin 目录中找到。

  • 您遇到问题的机器的制造商和型号。

  • 操作系统名称和版本。如果您使用 Windows,通常可以通过双击“我的电脑”图标并下拉“帮助/关于 Windows”菜单来获取名称和版本号。对于大多数类 Unix 操作系统,您可以通过执行命令 uname -a 来获取此信息。

  • 有时内存量(真实的和虚拟的)是相关的。如果有疑问,请包括这些值。

  • MySQL 安装中的 docs/INFO_BIN 文件的内容。此文件包含有关如何配置和编译 MySQL 的信息。

  • 如果您使用的是 MySQL 软件的源代码分发版,请包含您使用的编译器的名称和版本号。如果您有二进制分发版,请包含分发版名称。

  • 如果在编译期间出现问题,请在发生错误的文件中包含准确的错误消息以及围绕违规代码的几行上下文。

  • 如果mysqld死了,还应该报告导致mysqld意外退出的语句。您通常可以通过在启用查询日志记录的情况下运行 mysqld,然后在 mysqld 退出后查看日志来获取此信息。见第 5.8 节,“调试 MySQL”。

  • 如果数据库表与问题相关,请在错误报告中包含 SHOW CREATE TABLE db_name.tbl_name 语句的输出。这是获取数据库中任何表的定义的一种非常简单的方法。这些信息有助于我们创造一种与您所经历的情况相匹配的情况。

  • 问题发生时生效的 SQL 模式可能很重要,因此请报告 sql_mode 系统变量的值。对于存储过程、存储函数和触发器对象,相关的 sql_mode 值是创建对象时生效的值。对于存储过程或函数, SHOW CREATE PROCEDURE 或 SHOW CREATE FUNCTION 语句显示了相关的 SQL 模式,或者您可以查询 INFORMATION_SCHEMA 的信息:

    SELECT ROUTINE_SCHEMA, ROUTINE_NAME, SQL_MODE
    FROM INFORMATION_SCHEMA.ROUTINES;
    

    对于触发器,您可以使用以下语句:

    SELECT EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE, TRIGGER_NAME, SQL_MODE
    FROM INFORMATION_SCHEMA.TRIGGERS;
    
  • 对于与性能相关的错误或 SELECT 语句的问题,您应该始终包括 EXPLAIN SELECT … 的输出,并且至少包括 SELECT 语句产生的行数。 您还应该为涉及的每个表包含 SHOW CREATE TABLE tbl_name 的输出。 你提供的关于你的情况的信息越多,就越有可能有人可以帮助你。

    以下是一个非常好的错误报告示例。 这些语句是使用 mysql 命令行工具运行的。 请注意 \G 语句终止符用于语句,否则会提供难以阅读的非常长的输出行。

    mysql> SHOW VARIABLES;
    mysql> SHOW COLUMNS FROM ...\G
           <output from SHOW COLUMNS>
    mysql> EXPLAIN SELECT ...\G
           <output from EXPLAIN>
    mysql> FLUSH STATUS;
    mysql> SELECT ...;
           <A short version of the output from SELECT,
           including the time taken to run the query>
    mysql> SHOW STATUS;
           <output from SHOW STATUS>
    
  • 如果在运行 mysqld 时出现错误或问题,请尝试提供重现异常的输入脚本。 此脚本应包含任何必要的源文件。 脚本越能重现您的情况越好。 如果您可以制作可重现的测试用例,您应该上传它以附加到错误报告中。

    如果您不能提供脚本,您至少应该在您的报告中包含 mysqladmin variables extended-status processlist 的输出,以提供有关您的系统如何执行的一些信息。

  • 如果您无法生成只有几行的测试用例,或者如果测试表太大而无法包含在错误报告中(超过 10 行),您应该使用 mysqldump 转储您的表并创建一个 README 文件来描述您的 问题。 使用 tar 和 gzip 或 zip 创建文件的压缩存档。 在 http://bugs.mysql.com/ 为我们的错误数据库启动错误报告后,单击错误报告中的文件选项卡以获取有关将存档上传到错误数据库的说明。

  • 如果您认为 MySQL 服务器从语句中产生了一个奇怪的结果,不仅要包括结果,还要包括您对结果应该是什么的意见,以及描述您意见基础的解释。

  • 当您提供问题的示例时,最好使用您实际情况中存在的表名、变量名等,而不是提出新名称。 问题可能与表或变量的名称有关。 这些情况可能很少见,但安全总比后悔好。 毕竟,您提供一个使用您的实际情况的示例应该更容易,这对我们来说绝对更好。 如果您有不想让其他人在错误报告中看到的数据,您可以使用前面描述的“文件”选项卡上传它。 如果该信息确实是绝密并且您甚至不想向我们展示,请继续提供使用其他名称的示例,但请将此作为最后的选择。

  • 如果可能,包括提供给相关程序的所有选项。 例如,指示您在启动 mysqld 服务器时使用的选项,以及用于运行任何 MySQL 客户端程序的选项。 mysqld 和 mysql 等程序的选项以及配置脚本的选项通常是解决问题的关键并且非常相关。 包含它们从来都不是一个坏主意。 如果您的问题涉及用 Perl 或 PHP 等语言编写的程序,请提供语言处理器的版本号,以及该程序使用的任何模块的版本。 例如,如果您有一个使用 DBI 和 DBD::mysql 模块的 Perl 脚本,请包括 Perl、DBI 和 DBD::mysql 的版本号。

  • 如果您的问题与权限系统有关,请包括 mysqladmin reload 的输出,以及尝试连接时收到的所有错误消息。 当您测试您的权限时,您应该执行mysqladmin reload version 并尝试连接给您带来麻烦的程序。

  • 如果您有针对错误的补丁,请务必包含它。 但是不要假设补丁就是我们所需要的,或者我们可以使用它,如果您没有提供一些必要的信息,例如显示您的补丁修复的错误的测试用例。 我们可能会发现您的补丁存在问题,或者我们可能根本不了解它。 如果是这样,我们就不能使用它。

    如果我们无法验证补丁的确切用途,我们将不会使用它。 测试用例在这里帮助我们。 表明补丁可以处理所有可能发生的情况。 如果我们发现补丁不起作用的边缘情况(即使是罕见的情况),它可能没有用。

  • 对错误是什么、它为什么发生或它依赖于什么的猜测通常是错误的。 如果不首先使用调试器确定错误的真正原因,即使是 MySQL 团队也无法猜测这些事情。

  • 在您的错误报告中指出您已检查参考手册和邮件存档,以便其他人知道您已尝试自己解决问题。

  • 如果您的数据看起来已损坏或在访问特定表时出现错误,请首先使用 CHECK TABLE 检查您的表。 如果该语句报告任何错误:

    • InnoDB 崩溃恢复机制在服务器被杀死后重新启动时处理清理,因此在典型操作中不需要“修复”表。 如果遇到 InnoDB 表错误,请重新启动服务器并查看问题是否仍然存在,或者错误是否仅影响内存中的缓存数据。 如果磁盘上的数据损坏,请考虑在启用 innodb_force_recovery 选项的情况下重新启动,以便您可以转储受影响的表。
    • 对于非事务表,尝试使用 REPAIR TABLE 或 myisamchk 修复它们。 请参阅第 5 章,MySQL 服务器管理。

    如果您运行的是 Windows,请使用 SHOW VARIABLES LIKE ‘lower_case_table_names’ 语句验证 lower_case_table_names 的值。 此变量影响服务器处理数据库和表名称的字母大小写的方式。 它对给定值的影响应如第 9.2.3 节“标识符区分大小写”中所述。

  • 如果您经常看到损坏的表,您应该尝试找出发生这种情况的时间和原因。在这种情况下,MySQL 数据目录中的错误日志可能包含一些关于发生了什么的信息。 (这是名称中带有 .err 后缀的文件。)请参阅第 5.4.2 节,“错误日志”。请在您的错误报告中包含此文件中的任何相关信息。通常,如果在更新过程中没有任何东西杀死它,mysqld 永远不应该破坏它。如果您能找到导致 mysqld 死机的原因,那么我们为您提供解决问题的方法就容易多了。请参见第 B.3.1 节“如何确定导致问题的原因”。

  • 如果可能,请下载并安装最新版本的 MySQL Server 并检查它是否能解决您的问题。 MySQL 软件的所有版本都经过彻底测试,应该可以正常工作。我们相信让一切尽可能向后兼容,您应该能够毫无困难地切换 MySQL 版本。请参阅第 2.1.2 节,“要安装的 MySQL 版本和发行版”。

1.7 MySQL 标准合规性

1.7.1 MySQL 对标准 SQL 的扩展

1.7.2 MySQL 与标准 SQL 的差异

1.7.3 MySQL 如何处理约束

本节描述 MySQL 如何与 ANSI/ISO SQL 标准相关联。 MySQL Server 有许多 SQL 标准的扩展,在这里您可以了解它们是什么以及如何使用它们。您还可以找到有关 MySQL 服务器缺少的功能以及如何解决某些差异的信息。

SQL 标准自 1986 年以来一直在发展,并且存在多个版本。在本手册中,“SQL-92”是指 1992 年发布的标准。“SQL:1999”、“SQL:2003”、“SQL:2008”和“SQL:2011”是指 1992 年发布的标准版本。相应的年份,最后一个是最新版本。我们使用短语“SQL 标准”或“标准 SQL”来表示 SQL 标准的当前版本。

我们对该产品的主要目标之一是继续努力遵守 SQL 标准,但不牺牲速度或可靠性。如果这极大地增加了 MySQL Server 对我们大部分用户群的可用性,我们不害怕向 SQL 添加扩展或对非 SQL 功能的支持。 HANDLER 接口就是这种策略的一个例子。见第 13.2.4 节,“处理程序语句”。

我们继续支持事务性和非事务性数据库,以满足关键任务的 24/7 全天候使用和大量 Web 或日志记录使用。

MySQL Server 最初设计用于处理小型计算机系统上的中型数据库(10-1 亿行,或每表约 100MB)。今天,MySQL Server 可以处理 TB 大小的数据库,但代码也可以编译成适合手持和嵌入式设备的简化版本。 MySQL 服务器的紧凑设计使得双向开发成为可能,而不会在源代码树中产生任何冲突。

我们的目标不是实时支持,尽管 MySQL 复制功能提供了重要的功能。

MySQL 支持 ODBC 级别 0 到 3.51。

MySQL 支持使用 NDBCLUSTER 存储引擎的高可用性数据库集群。 请参阅第 21 章,MySQL NDB Cluster 7.5 和 NDB Cluster 7.6。

我们实现了支持大部分 W3C XPath 标准的 XML 功能。 请参阅第 12.12 节,“XML 函数”。

MySQL(5.7.8 及更高版本)支持由 RFC 7159 定义并基于 ECMAScript 标准 (ECMA-262) 的原生 JSON 数据类型。 请参阅第 11.5 节,“JSON 数据类型”。 MySQL 还实现了 SQL:2016 标准的预发布草案指定的 SQL/JSON 函数的子集; 有关更多信息,请参阅第 12.18 节,“JSON 函数”。

选择 SQL 模式

MySQL 服务器可以在不同的 SQL 模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于 sql_mode 系统变量的值。 DBA 可以设置全局 SQL 模式以匹配站点服务器操作要求,每个应用程序可以将其会话 SQL 模式设置为自己的要求。

模式会影响 MySQL 支持的 SQL 语法以及它执行的数据验证检查。 这使得在不同环境中使用 MySQL 以及与其他数据库服务器一起使用 MySQL 变得更加容易。

有关设置 SQL 模式的更多信息,请参阅第 5.1.10 节,“服务器 SQL 模式”。

在 ANSI 模式下运行 MySQL

要在 ANSI 模式下运行 MySQL 服务器,请使用 --ansi 选项启动 mysqld。 以 ANSI 模式运行服务器与使用以下选项启动服务器相同:

--transaction-isolation=SERIALIZABLE --sql-mode=ANSI

要在运行时达到同样的效果,请执行以下两条语句:

SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET GLOBAL sql_mode = 'ANSI';

您可以看到将 sql_mode 系统变量设置为 ‘ANSI’ 会启用与 ANSI 模式相关的所有 SQL 模式选项,如下所示:

mysql> SET GLOBAL sql_mode='ANSI';
mysql> SELECT @@GLOBAL.sql_mode;
        -> 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI'

使用 --ansi 以 ANSI 模式运行服务器与将 SQL 模式设置为 ‘ANSI’ 并不完全相同,因为 --ansi 选项还设置了事务隔离级别。

请参见第 5.1.6 节,“服务器命令选项”。

1.7.1 MySQL 对标准 SQL 的扩展

MySQL Server 支持一些在其他 SQL DBMS 中可能找不到的扩展。 请注意,如果您使用它们,您的代码将无法移植到其他 SQL 服务器。 在某些情况下,您可以使用以下形式的注释编写包含 MySQL 扩展但仍可移植的代码:

/*! MySQL-specific code */

在这种情况下,MySQL 服务器会像处理任何其他 SQL 语句一样解析和执行注释中的代码,但其他 SQL 服务器会忽略这些扩展。 例如,MySQL Server 识别以下语句中的 STRAIGHT_JOIN 关键字,但其他服务器不识别:

SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...

如果在 ! 后添加版本号! 字符,注释中的语法仅在 MySQL 版本大于或等于指定的版本号时执行。 以下注释中的 KEY_BLOCK_SIZE 子句仅由 MySQL 5.1.10 或更高版本的服务器执行:

CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;

以下描述列出了按类别组织的 MySQL 扩展。

  • 磁盘上的数据组织

    MySQL Server 将每个数据库映射到 MySQL 数据目录下的一个目录,并将数据库中的表映射到数据库目录中的文件名。 这有几个含义:

    • 在具有区分大小写文件名的操作系统(例如大多数 Unix 系统)上的 MySQL 服务器中,数据库和表名称区分大小写。 请参见第 9.2.3 节,“标识符区分大小写”。
    • 您可以使用标准系统命令来备份、重命名、移动、删除和复制由 MyISAM 存储引擎管理的表。 例如,可以通过重命名表对应的 .MYD、.MYI 和 .frm 文件来重命名 MyISAM 表。 (尽管如此,最好使用 RENAME TABLE 或 ALTER TABLE … RENAME 并让服务器重命名文件。)
  • 通用语言语法

    • 默认情况下,字符串可以用 " 和 ’ 括起来。如果启用了 ANSI_QUOTES SQL 模式,则字符串只能用 ’ 括起来,服务器将用 " 括起来的字符串解释为标识符。
    • \ 是字符串中的转义字符。
    • 在 SQL 语句中,您可以使用 db_name.tbl_name 语法访问来自不同数据库的表。 一些 SQL 服务器提供相同的功能,但称之为用户空间。 MySQL Server 不支持诸如以下语句中使用的表空间:CREATE TABLE ralph.my_table … IN my_tablespace。
  • SQL语句语法

    • ANALYZE TABLE、CHECK TABLE、OPTIMIZE TABLE 和 REPAIR TABLE 语句。
    • CREATE DATABASE、DROP DATABASE 和 ALTER DATABASE 语句。 请参见第 13.1.11 节“CREATE DATABASE 语句”、第 13.1.22 节“DROP DATABASE 语句”和第 13.1.1 节“ALTER DATABASE 语句”。
    • DO 语句。
    • EXPLAIN SELECT 获取查询优化器如何处理表的描述。
    • FLUSH 和 RESET 语句。
    • SET 语句。 见第 13.7.4.1 节,“变量赋值的 SET 语法”。
    • SHOW 语句。 见第 13.7.5 节,“SHOW 语句”。 许多 MySQL 特定的 SHOW 语句产生的信息可以通过使用 SELECT 查询 INFORMATION_SCHEMA 以更标准的方式获得。 请参阅第 24 章 INFORMATION_SCHEMA 表。
    • 使用负载数据。 在许多情况下,此语法与 Oracle LOAD DATA 兼容。 见第 13.2.6 节,“LOAD DATA 语句”。
    • 重命名表的使用。 请参阅第 13.1.33 节,“RENAME TABLE 语句”。
    • 使用 REPLACE 而不是 DELETE 加 INSERT。 见第 13.2.8 节,“REPLACE 语句”。
    • 在 ALTER TABLE 语句中使用 CHANGE col_name、DROP col_name 或 DROP INDEX、IGNORE 或 RENAME。 在 ALTER TABLE 语句中使用多个 ADD、ALTER、DROP 或 CHANGE 子句。 见第 13.1.8 节,“ALTER TABLE 语句”。
    • 索引名称的使用、列前缀上的索引以及在 CREATE TABLE 语句中使用 INDEX 或 KEY。见第 13.1.18 节,“CREATE TABLE 语句”。
    • TEMPORARY 或 IF NOT EXISTS 与 CREATE TABLE 一起使用。
    • 将 IF EXISTS 与 DROP TABLE 和 DROP DATABASE 一起使用。
    • 使用单个 DROP TABLE 语句删除多个表的能力。
    • UPDATE 和 DELETE 语句的 ORDER BY 和 LIMIT 子句。
    • INSERT INTO tbl_name SET col_name = … 语法。
    • INSERT 和 REPLACE 语句的 DELAYED 子句。
    • INSERT、REPLACE、DELETE 和 UPDATE 语句的 LOW_PRIORITY 子句。
    • 在 SELECT 语句中使用 INTO OUTFILE 或 INTO DUMPFILE。见第 13.2.9 节,“SELECT 语句”。
    • SELECT 语句中的 STRAIGHT_JOIN 或 SQL_SMALL_RESULT 等选项。
    • 您不需要在 GROUP BY 子句中命名所有选定的列。这为一些非常具体但非常正常的查询提供了更好的性能。见第 12.20 节,“聚合函数”。
    • 您可以使用 GROUP BY 指定 ASC 和 DESC,而不仅仅是使用 ORDER BY。
    • 使用 := 赋值运算符在语句中设置变量的能力。请参见第 9.4 节,“用户定义的变量”。
  • 数据类型

    • MEDIUMINT、SET 和 ENUM 数据类型,以及各种 BLOB 和 TEXT 数据类型。

      AUTO_INCREMENT、BINARY、NULL、UNSIGNED 和 ZEROFILL 数据类型属性。

  • 函数和运算符

    • 为了方便从其他 SQL 环境迁移的用户,MySQL Server 支持许多功能的别名。例如,所有字符串函数都支持标准 SQL 语法和 ODBC 语法。

    • MySQL 服务器理解 ||和 && 运算符表示逻辑 OR 和 AND,就像在 C 编程语言中一样。在 MySQL 服务器中,||和 OR 是同义词, && 和 AND 也是同义词。由于这种漂亮的语法,MySQL Server 不支持标准的 SQL ||字符串连接运算符;使用 CONCAT() 代替。因为 CONCAT() 接受任意数量的参数,所以很容易转换使用 ||操作员到 MySQL 服务器。

    • 使用 COUNT(DISTINCT value_list) 其中 value_list 有多个元素。

    • 默认情况下,字符串比较不区分大小写,排序顺序由当前字符集的排序规则确定,默认情况下为 latin1(cp1252 西欧)。要执行区分大小写的比较,您应该使用 BINARY 属性声明您的列或使用 BINARY 强制转换,这会导致使用基础字符代码值而不是词法排序来完成比较。

    • % 运算符是 MOD() 的同义词。 也就是说,N % M 等价于 MOD(N,M)。 C 程序员支持 % 并与 PostgreSQL 兼容。

    • =、<>、<=、<、>=、>、<<、>>、<=>、AND、OR 或 LIKE 运算符可用于输出列列表中的表达式中(在 FROM 的左侧) ) 在 SELECT 语句中。 例如:

      mysql> SELECT col1=1 AND col2=2 FROM my_table;
      
    • LAST_INSERT_ID() 函数返回最近的 AUTO_INCREMENT 值。 见第 12.16 节,“信息函数”。

    • 数值上允许使用 LIKE。

    • REGEXP 和 NOT REGEXP 扩展了正则表达式运算符。

    • CONCAT() 或 CHAR() 带有一个或两个以上的参数。 (在 MySQL 服务器中,这些函数可以采用可变数量的参数。)

    • BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), MD5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF() 、TO_DAYS() 和 WEEKDAY() 函数。

    • 使用 TRIM() 修剪子字符串。 标准 SQL 仅支持删除单个字符。

    • GROUP BY 函数 STD()、BIT_OR()、BIT_AND()、BIT_XOR() 和 GROUP_CONCAT()。 见第 12.20 节,“聚合函数”。

1.7.2 MySQL 与标准 SQL 的区别

1.7.2.1 SELECT INTO TABLE 差异
1.7.2.2 更新差异
1.7.2.3 外键约束差异
1.7.2.4 ‘–’ 作为注释的开始

我们尝试让 MySQL Server 遵循 ANSI SQL 标准和 ODBC SQL 标准,但 MySQL Server 在某些情况下执行的操作不同:

  • MySQL 和标准 SQL 特权系统之间存在一些差异。 例如,在 MySQL 中,删除表时不会自动撤销表的权限。 您必须显式发出 REVOKE 语句以撤销表的权限。 有关更多信息,请参阅第 13.7.1.6 节,“REVOKE 语句”。
  • CAST() 函数不支持转换为 REAL 或 BIGINT。 请参见第 12.11 节,“转换函数和运算符”。
1.7.2.1 SELECT INTO TABLE 差异

MySQL Server 不支持 SELECT … INTO TABLE Sybase SQL 扩展。 相反,MySQL Server 支持 INSERT INTO … SELECT 标准 SQL 语法,这基本上是相同的。 见第 13.2.5.1 节,“INSERT … SELECT 语句”。 例如:

INSERT INTO tbl_temp2 (fld_id)
    SELECT tbl_temp1.fld_order_id
    FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

或者,您可以使用 SELECT … INTO OUTFILECREATE TABLE … SELECT

您可以将 SELECT … INTO 与用户定义的变量一起使用。 在使用游标和局部变量的存储例程中也可以使用相同的语法。 见第 13.2.9.1 节,“SELECT … INTO 语句”。

1.7.2.2 更新差异

如果在表达式中访问要更新的表中的列,UPDATE 将使用该列的当前值。 以下语句中的第二个赋值将 col2 设置为当前(更新后的) col1 值,而不是原始 col1 值。 结果是 col1 和 col2 具有相同的值。 此行为不同于标准 SQL。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;
1.7.2.3 外键约束差异

外键约束的 MySQL 实现与 SQL 标准的不同之处在于以下几个关键方面:

  • 如果父表中有几行具有相同的引用键值,InnoDB 会执行外键检查,就好像其他具有相同键值的父行不存在一样。例如,如果您定义了 RESTRICT 类型约束,并且存在具有多个父行的子行,则 InnoDB 不允许删除任何父行。

  • 如果 ON UPDATE CASCADE 或 ON UPDATE SET NULL 递归更新它之前在同一个级联期间更新的同一个表,它的作用类似于 RESTRICT。这意味着您不能使用自引用 ON UPDATE CASCADE 或 ON UPDATE SET NULL 操作。这是为了防止级联更新导致无限循环。另一方面,自引用 ON DELETE SET NULL 是可能的,就像自引用 ON DELETE CASCADE 一样。级联操作的嵌套深度不得超过 15 级。

  • 在插入、删除或更新多行的 SQL 语句中,逐行检查外键约束(如唯一约束)。在执行外键检查时,InnoDB 在它必须检查的子或父记录上设置共享行级锁。 MySQL立即检查外键约束;检查不会推迟到事务提交。根据 SQL 标准,默认行为应该是延迟检查。也就是说,只有在处理完整个 SQL 语句后才会检查约束。这意味着无法删除使用外键引用自身的行。

  • 没有存储引擎(包括 InnoDB)识别或强制执行引用完整性约束定义中使用的 MATCH 子句。 使用显式 MATCH 子句不会产生指定的效果,并且会导致 ON DELETE 和 ON UPDATE 子句被忽略。 应避免指定 MATCH。

    SQL 标准中的 MATCH 子句控制在与引用表中的主键进行比较时如何处理复合(多列)外键中的 NULL 值。 MySQL 本质上实现了 MATCH SIMPLE 定义的语义,它允许外键全部或部分为 NULL。 在这种情况下,可以插入包含此类外键的(子表)行,即使它与引用(父)表中的任何行都不匹配。 (可以使用触发器实现其他语义。)

  • 出于性能原因,MySQL 要求对引用的列进行索引。 但是,MySQL 不强制要求引用的列是 UNIQUE 或声明为 NOT NULL。

    引用非 UNIQUE 键的 FOREIGN KEY 约束不是标准 SQL,而是 InnoDB 扩展。 另一方面,导航台存储引擎需要在作为外键引用的任何列上的显式唯一键(或主键)。

    对于 UPDATE 或 DELETE CASCADE 等操作,对非唯一键或包含 NULL 值的键的外键引用的处理没有明确定义。 建议您使用仅引用 UNIQUE(包括 PRIMARY)和 NOT NULL 键的外键。

  • 对于不支持外键的存储引擎(如 MyISAM),MySQL Server 解析并忽略外键规范。

  • MySQL 解析但忽略“内联 REFERENCES 规范”(在 SQL 标准中定义),其中引用被定义为列规范的一部分。 仅当指定为单独的 FOREIGN KEY 规范的一部分时,MySQL 才接受 REFERENCES 子句。

    定义列以使用 REFERENCES tbl_name(col_name) 子句没有实际效果,仅用作备忘录或注释,提醒您当前定义的列旨在引用另一个表中的列。 使用此语法时,重要的是要意识到:

    • MySQL 不会执行任何类型的检查来确保 col_name 确实存在于 tbl_name 中(甚至 tbl_name 本身存在)。
    • MySQL 不会对 tbl_name 执行任何类型的操作,例如删除行以响应对您定义的表中的行采取的操作; 换句话说,此语法不会导致任何 ON DELETE 或 ON UPDATE 行为。 (虽然您可以编写 ON DELETE 或 ON UPDATE 子句作为 REFERENCES 子句的一部分,但它也会被忽略。)
    • 此语法创建一列; 它不会创建任何类型的索引或键。

    您可以使用这样创建的列作为连接列,如下所示:

    CREATE TABLE person (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
        name CHAR(60) NOT NULL,
        PRIMARY KEY (id)
    );
    
    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
        style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
        PRIMARY KEY (id)
    );
    
    INSERT INTO person VALUES (NULL, 'Antonio Paz');
    
    SELECT @last := LAST_INSERT_ID();
    
    INSERT INTO shirt VALUES
    (NULL, 'polo', 'blue', @last),
    (NULL, 'dress', 'white', @last),
    (NULL, 't-shirt', 'blue', @last);
    
    INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
    
    SELECT @last := LAST_INSERT_ID();
    
    INSERT INTO shirt VALUES
    (NULL, 'dress', 'orange', @last),
    (NULL, 'polo', 'red', @last),
    (NULL, 'dress', 'blue', @last),
    (NULL, 't-shirt', 'white', @last);
    
    SELECT * FROM person;
    +----+---------------------+
    | id | name                |
    +----+---------------------+
    |  1 | Antonio Paz         |
    |  2 | Lilliana Angelovska |
    +----+---------------------+
    
    SELECT * FROM shirt;
    +----+---------+--------+-------+
    | id | style   | color  | owner |
    +----+---------+--------+-------+
    |  1 | polo    | blue   |     1 |
    |  2 | dress   | white  |     1 |
    |  3 | t-shirt | blue   |     1 |
    |  4 | dress   | orange |     2 |
    |  5 | polo    | red    |     2 |
    |  6 | dress   | blue   |     2 |
    |  7 | t-shirt | white  |     2 |
    +----+---------+--------+-------+
    
    
    SELECT s.* FROM person p INNER JOIN shirt s
       ON s.owner = p.id
     WHERE p.name LIKE 'Lilliana%'
       AND s.color <> 'white';
    
    +----+-------+--------+-------+
    | id | style | color  | owner |
    +----+-------+--------+-------+
    |  4 | dress | orange |     2 |
    |  5 | polo  | red    |     2 |
    |  6 | dress | blue   |     2 |
    +----+-------+--------+-------+
    

    以这种方式使用时,REFERENCES 子句不会显示在 SHOW CREATE TABLE 或 DESCRIBE 的输出中:

    SHOW CREATE TABLE shirt\G
    *************************** 1. row ***************************
    Table: shirt
    Create Table: CREATE TABLE `shirt` (
    `id` smallint(5) unsigned NOT NULL auto_increment,
    `style` enum('t-shirt','polo','dress') NOT NULL,
    `color` enum('red','blue','orange','white','black') NOT NULL,
    `owner` smallint(5) unsigned NOT NULL,
    PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    

有关外键约束的信息,请参阅第 13.1.18.5 节,“外键约束”。

1.7.2.4 ‘–’ 作为注释的开始

标准 SQL 使用 C 语法 /* this is a comment */ 进行注释,MySQL Server 也支持这种语法。 MySQL 还支持此语法的扩展,允许将特定于 MySQL 的 SQL 嵌入到注释中,如第 9.6 节“注释”中所述。

标准 SQL 使用“–”作为开始注释序列。 MySQL Server 使用 # 作为开始注释字符。 MySQL Server 还支持 – 注释样式的变体。 也就是说,–start-comment 序列后面必须跟一个空格(或一个控制字符,例如换行符)。 需要该空间来防止自动生成的 SQL 查询出现问题,这些查询使用如下结构,其中我们自动插入支付的支付值:

UPDATE account SET credit=credit-payment

考虑如果付款具有负值(例如 -1)会发生什么:

UPDATE account SET credit=credit--1

credit–1 在 SQL 中是一个有效的表达式,但是 – 被解释为注释的开始,表达式的一部分被丢弃。 结果是一个与预期含义完全不同的语句:

UPDATE account SET credit=credit

该语句根本不会产生任何值变化。 这说明允许以 – 开头的评论可能会产生严重的后果。

使用我们的实现需要在 – 后面有一个空格,以便在 MySQL 服务器中将其识别为开始-注释序列。 因此,credit–1 可以安全使用。

另一个安全功能是 mysql 命令行客户端忽略以 – 开头的行。

1.7.3 MySQL 如何处理约束

1.7.3.1 PRIMARY KEY 和 UNIQUE 索引约束
1.7.3.2 外键约束
1.7.3.3 对无效数据的约束
1.7.3.4 ENUM 和 SET 约束

MySQL 使您能够处理允许回滚的事务表和不允许回滚的非事务表。因此,MySQL 中的约束处理与其他 DBMS 略有不同。当您在非事务性表中插入或更新大量行时,我们必须处理这种情况,这些行的更改在发生错误时无法回滚。

基本原理是 MySQL 服务器尝试在解析要执行的语句时为它可以检测到的任何内容生成错误,并尝试从执行语句时发生的任何错误中恢复。我们在大多数情况下都这样做,但还不是全部。

MySQL 在发生错误时的选项是在中间停止语句或尽可能从问题中恢复并继续。默认情况下,服务器遵循后一课程。这意味着,例如,服务器可能会将无效值强制为最接近的有效值。

多个 SQL 模式选项可用于更好地控制错误数据值的处理以及在发生错误时是继续执行语句还是中止。使用这些选项,您可以将 MySQL 服务器配置为以更传统的方式运行,就像其他拒绝不正确输入的 DBMS 一样。可以在服务器启动时全局设置 SQL 模式以影响所有客户端。单个客户端可以在运行时设置 SQL 模式,这使每个客户端能够选择最适合其需求的行为。请参阅第 5.1.10 节,“服务器 SQL 模式”。

以下部分描述 MySQL Server 如何处理不同类型的约束。

1.7.3.1 PRIMARY KEY 和 UNIQUE 索引约束

通常,违反主键、唯一键或外键约束的数据更改语句(例如 INSERTUPDATE)会发生错误。如果您使用的是事务存储引擎,例如 InnoDB,MySQL 会自动回滚语句。如果您使用的是非事务性存储引擎,MySQL 将停止处理发生错误的行处的语句,并保留任何未处理的剩余行。

MySQL 支持 INSERT、UPDATE 等的 IGNORE 关键字。如果使用它,MySQL 会忽略主键或唯一键违规并继续处理下一行。请参阅您正在使用的语句部分(第 13.2.5 节,“INSERT 语句”,第 13.2.11 节,“UPDATE 语句”等)。

您可以使用 mysql_info() C API 函数获取有关实际插入或更新的行数的信息。您还可以使用 SHOW WARNINGS 语句。请参阅 mysql_info()第 13.7.5.40 节,“显示警告语句”

InnoDB 和 NDB 表支持外键。请参见第 1.7.3.2 节,“外键约束”

1.7.3.2 外键约束

外键让您可以跨表交叉引用相关数据,外键约束有助于保持分散的数据一致。

MySQL 在 CREATE TABLEALTER TABLE 语句中支持 ON UPDATEON DELETE 外键引用。 可用的引用操作是 RESTRICT(默认)、CASCADESET NULLNO ACTION

MySQL 服务器也支持 SET DEFAULT,但目前被 InnoDB 拒绝为无效。 由于 MySQL 不支持延迟约束检查,因此 NO ACTION 被视为 RESTRICT。 有关 MySQL 支持的外键的确切语法,请参阅第 13.1.18.5 节,“FOREIGN KEY Constraints”

MATCH FULLMATCH PARTIALMATCH SIMPLE 是允许的,但应避免使用它们,因为它们会导致 MySQL 服务器忽略同一语句中使用的任何 ON DELETE 或 ON UPDATE 子句。 MATCH 选项在 MySQL 中没有任何其他效果,这实际上是全时强制执行 MATCH SIMPLE 语义。

MySQL 要求对外键列进行索引; 如果创建具有外键约束但在给定列上没有索引的表,则会创建索引。

您可以从 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 表中获取有关外键的信息。 此处显示了针对此表的查询示例:

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME
     > FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
     > WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;
+--------------+---------------+-------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME    | COLUMN_NAME | CONSTRAINT_NAME |
+--------------+---------------+-------------+-----------------+
| fk1          | myuser        | myuser_id   | f               |
| fk1          | product_order | customer_id | f2              |
| fk1          | product_order | product_id  | f1              |
+--------------+---------------+-------------+-----------------+
3 rows in set (0.01 sec)

InnoDB 表上的外键信息也可以在 INFORMATION_SCHEMA 数据库的 INNODB_SYS_FOREIGNINNODB_SYS_FOREIGN_COLS 表中找到。

InnoDB 和 NDB 表支持外键。

1.7.3.3 对无效数据的约束

MySQL 5.7.5 及更高版本默认使用严格的 SQL 模式,它处理无效值,以便服务器拒绝它们并中止它们发生的语句(参见第 5.1.10 节,“服务器 SQL 模式”)。 以前,MySQL 对数据输入中使用的错误值更加宽容。 这现在需要禁用严格模式,不建议这样做。 本节的其余部分讨论禁用严格模式时 MySQL 遵循的旧行为。

如果你没有使用严格模式,那么每当你在一个列中插入一个“不正确”的值,例如一个 NULL 到一个 NOT NULL 列或一个太大的数值到一个数字列中,MySQL 将该列设置为“最佳 可能的值”而不是产生错误:以下规则更详细地描述了它是如何工作的:

  • 如果您尝试将超出范围的值存储到数值列中,MySQL 服务器将存储零、最小可能值或最大可能值,以最接近无效值的为准。
  • 对于字符串,MySQL 存储空字符串或尽可能多的字符串存储在列中。
  • 如果您尝试将不以数字开头的字符串存储到数字列中,MySQL 服务器将存储 0。
  • 第 1.7.3.4 节“ENUM 和 SET 约束”中所述处理 ENUM 和 SET 列的无效值。
  • MySQL 允许您将某些不正确的日期值存储到 DATE 和 DATETIME 列中(例如 ‘2000-02-31’ 或 ‘2000-02-00’)。 在这种情况下,当应用程序没有启用严格的 SQL 模式时,它由应用程序在存储日期之前验证日期。 如果 MySQL 可以存储日期值并检索完全相同的值,则 MySQL 将其存储为给定。 如果日期完全错误(超出服务器的存储能力),则将特殊的“零”日期值“0000-00-00”存储在列中。
  • 如果您尝试将 NULL 存储到不采用 NULL 值的列中,则单行 INSERT 语句会发生错误。 对于多行 INSERT 语句或 INSERT INTO … SELECT 语句,MySQL 服务器存储列数据类型的隐式默认值。 通常,数字类型为 0,字符串类型为空字符串 (’’),日期和时间类型为“零”值。 隐式默认值在第 11.6 节“数据类型默认值”中讨论。
  • 如果 INSERT 语句未指定列的值,则如果列定义包含显式 DEFAULT 子句,则 MySQL 将插入其默认值。 如果定义没有这样的 DEFAULT 子句,MySQL 会插入列数据类型的隐式默认值。

在严格模式无效时使用上述规则的原因是,在语句开始执行之前我们无法检查这些条件。 如果我们在更新几行后遇到问题,我们不能只回滚,因为存储引擎可能不支持回滚。 终止语句的选项不是很好; 在这种情况下,更新将“完成一半”,这可能是最糟糕的情况。 在这种情况下,最好“尽力而为”,然后像什么都没发生一样继续。

您可以使用 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES SQL 模式选择对输入值进行更严格的处理:

SET sql_mode = 'STRICT_TRANS_TABLES';
SET sql_mode = 'STRICT_ALL_TABLES';

STRICT_TRANS_TABLES 为事务存储引擎启用严格模式,在某种程度上也为非事务引擎启用。 它是这样工作的:

  • 对于事务存储引擎,语句中任何地方出现的错误数据值都会导致语句中止并回滚。
  • 对于非事务性存储引擎,如果错误发生在要插入或更新的第一行中,则语句中止。 (当第一行发生错误时,可以中止语句以保持表不变,就像事务表一样。)第一行之后的行中的错误不会中止语句,因为表已经被 第一排。 相反,错误的数据值会被调整并导致警告而不是错误。 换句话说,使用 STRICT_TRANS_TABLES,如果可以在不更改表的情况下完成,错误的值会导致 MySQL 回滚迄今为止完成的所有更新。 但是一旦表格被更改,进一步的错误会导致调整和警告。

要进行更严格的检查,请启用 STRICT_ALL_TABLES。 这与 STRICT_TRANS_TABLES 相同,除了对于非事务性存储引擎,即使对于第一行之后的行中的错误数据,错误也会中止语句。 这意味着,如果在多行插入或更新非事务性表的过程中发生错误,则会导致部分更新。 较早的行被插入或更新,但从错误开始的那些则不被插入或更新。 为避免非事务表出现这种情况,要么使用单行语句,要么使用 STRICT_TRANS_TABLES(如果可以接受转换警告而不是错误)。 为了避免出现问题,请不要使用 MySQL 检查列内容。 让应用程序确保它只将有效值传递给数据库是最安全的(而且通常更快)。

使用任一严格模式选项,您可以通过使用 INSERT IGNOREUPDATE IGNORE 而不是 INSERT 或 UPDATE 将错误视为警告。

1.7.3.4 ENUM 和 SET 约束

ENUM 和 SET 列提供了一种有效的方法来定义只能包含一组给定值的列。 请参阅第 11.3.5 节,“ENUM 类型”第 11.3.6 节,“SET 类型”

除非禁用严格模式(不推荐,但请参阅第 5.1.10 节,“服务器 SQL 模式”),ENUM 或 SET 列的定义充当输入到列中的值的约束。 不满足这些条件的值会发生错误:

  • ENUM 值必须是列定义中列出的值之一,或其内部数字等价物。 该值不能是错误值(即 0 或空字符串)。 对于定义为 ENUM(‘a’,‘b’,‘c’) 的列,’’、‘d’ 或 ‘ax’ 等值无效并被拒绝。
  • SET 值必须是空字符串或仅由列定义中列出的值组成的值,以逗号分隔。 对于定义为 SET(‘a’,‘b’,‘c’) 的列,‘d’ 或 ‘a,b,c,d’ 等值无效并被拒绝。

如果使用 INSERT IGNORE 或 UPDATE IGNORE,则可以在严格模式下抑制无效值的错误。 在这种情况下,会生成警告而不是错误。 对于 ENUM,该值作为错误成员 (0) 插入。 对于 SET,除了删除任何无效的子字符串外,按给定的值插入该值。 例如,‘a,x,b,y’ 会产生 ‘a,b’ 的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值