第 1 章 一般信息

第 1 章 一般信息

目录

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

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

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

重要

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

1.1 关于本手册

这是 MySQL 数据库系统版本 8.0 到版本 8.0.42 的参考手册,本文中指出了 MySQL 8.0 次要版本之间的差异,并参考了版本号(8.0.x licenseinformation 的 licenseinformation,请参阅 LegalNotices

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

如果您使用的是 MySQL 8.4,请参考MySQL 8.4 参考手册

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

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

MySQL 的源代码本身包含使用 Doxygen 编写的内部文档。生成的 Doxygen 内容可从 https://dev.mysql.com/doc/index-other.html 获取。也可以使用第 2.8.10 节 “生成 MySQL Doxygen 文档内容”中的说明从 MySQL sourcedistribution 本地生成此内容。

如果您对使用 MySQL 有任何疑问,请加入MySQL CommunitySlack。如果您对手册本身的添加或更正有任何建议,请将其发送给 http://www.mysql.com/company/contact/

排版和语法约定

本手册使用某些排版惯例:

  • Text in this style用于 SQLstatements;数据库、表和列名称;程序列表和源代码;和环境变量。示例:“Toreload the grant tables, use FLUSH PRIVILEGES statement.”
  • Text in this style表示您在示例中键入的输入。
  • 此样式中的文本表示可执行程序和脚本的名称,例如mysql (MySQL 命令行客户端程序) 和 mysqld (MySQL 服务器可执行文件)。
  • Text in this style用于变量输入,您应该用自己选择的值来替换它。
  • 此样式中的文本用于强调。
  • 这种样式的文本用于表标题,并传达特别强烈的强调。
  • Text in this style用于指示影响程序执行方式的程序选项,或提供程序以某种方式运行所需的信息。示例:“The--host 选项(简称 -h)告诉 mysql 客户端程序它应该连接到的 MySQL 服务器的主机名或 IP 地址”。
  • 文件名和目录名称写成这样:“全局 my.cnf 文件位于 /etc 目录中。
  • 字符序列写成这样:“要指定通配符,请使用 '%'字符。

当命令或语句以提示符为前缀时,我们使用以下命令:

$> type a command here
#> type a command as root here
C:\> type a command here (Windows only)
mysql> type a mysql statement here

命令在命令解释器中发出。在 Unix 上,这通常是 shcshbash 等程序。在 Windows 上,等效程序是 command.comcmd.exe,通常在控制台窗口中运行。以 mysql 为前缀的语句在mysql 命令行客户端中发出。

注意

当您输入示例中显示的命令或语句时,请勿键入示例中显示的提示符。

在某些区域中,不同的系统可能会彼此区分开来,以表明命令应该在两个不同的环境中执行。例如,在使用 replication 时,命令的前缀可能是 sourcereplica

source> type a mysql statement on the replication source here
replica> type a mysql statement on the replica here

数据库、表和列名称通常必须替换为 intostatements。为了表明这种替换是必要的,本手册使用了 db_nametbl_namecol_name。例如,您可能会看到这样的语句:

mysql> SELECT col_name FROM db_name.tbl_name;

这意味着,如果要输入类似的语句,则需要提供自己的数据库、表和列名称,可能如下所示:

mysql> SELECT author_name FROM biblio_db.author_list;

SQL 关键字不区分大小写,可以用任意字母大小写。本手册使用大写字母。

在语法描述中,方括号(“[” and“]”) 表示可选单词或子句。例如,在以下语句中,IF<br /> EXISTS 是可选的:

DROP TABLE [IF EXISTS] tbl_name

当语法元素由多个替代项组成时,替代项由竖线 (“|”) 分隔。当可以从一组选项中选择一个成员时,备选项将在方括号(“[”和“]”)内列出:

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

当一组选项中的一个成员必须 bechosen 时,备选项列在大括号(“{” and“}”)中:

{DESCRIBE | DESC} tbl_name [col_name | wild]

省略号 (...) 表示省略语句的 asection,通常用于提供更复杂语法的更短版本。例如,SELECT ... INTO OUTFILESELECT 语句形式的简写,该语句的其他部分后面有一个INTO OUTFILE 子句。

省略号还可以指示 astatement 的前面的语法元素可以重复。在以下示例中,可以给出多个reset_option 值,每个值都位于第一个值后面,前面带有逗号:

RESET reset_option [,reset_option] ...

用于设置 shell 变量的命令使用 Bourne shell语法显示。例如,设置 CC环境变量和运行 configure命令的顺序在 Bourne shell 语法中如下所示:

$> CC=gcc ./configure

如果您使用的是 cshtcsh,则必须以不同的方式发出命令:

$> setenv CC gcc
$> ./configure

手册作者

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

本手册最初由 David Axmark 和 Michael“Monty” Widenius 编写。它由 MySQLDocumentation 团队维护,该团队由 Edward Gilmore、SudharsanaGomadam、Kim seong Loh、Garima Sharma、Carlos Ortiz、Daniel So 和 Jon Stephens 组成。

1.2 MySQL 数据库管理系统概述

1.2.1 什么是 MySQL?

MySQL 是最受欢迎的开源 SQL 数据库管理系统,由 OracleCorporation 开发、分发和支持。

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”是指该标准的当前版本。我们使用短语“the SQL standard”来表示任何时候 SQL Standard 的当前版本。

  • *MySQL 软件是开源的。*

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

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

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

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

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

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

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

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

    MySQL Server 具有一组与用户密切合作开发的实用功能。您最喜欢的应用程序或语言很可能支持 MySQL DatabaseServer。

  • *热浪。*

    HeatWave 是一项完全托管的数据库服务,由 HeatWave 内存中查询加速器提供支持。它是唯一一个将事务、跨数据仓库和数据湖的实时分析以及机器学习结合在一个 MySQL 数据库中的云服务;没有 ETL 复制的复杂性、延迟、风险和成本。它在 OCI、AWS 和 Azure 上可用。了解更多信息: https://www.oracle.com/mysql/

“MySQL”的官方发音是“MyEss Que Ell”(而不是“my sequel”),但我们不介意你把它发音为“my sequel”或其他本地化方式。

1.2.2 MySQL 的主要功能

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

内部结构和可移植性

  • 用 C 和 C++ 编写。
  • 使用各种不同的编译器进行了测试。
  • 适用于许多不同的平台。请参阅 https://www.mysql.com/support/supportedplatforms/database.html
  • 为了实现可移植性,请使用 CMake 进行配置。
  • 使用 Purify(一种商业内存泄漏检测器)以及 GPL 工具 Valgrind ( https://valgrind.org/ ) 进行测试。
  • 采用多层服务器设计,模块独立。
  • 设计为使用内核线程实现完全多线程,如果可用,可以轻松使用多个 CPU。
  • 提供事务性和非事务性存储引擎。
  • 使用非常快速的 B 树磁盘表 (MyISAM 和索引压缩。
  • 旨在使添加其他 storageengine 变得相对容易。如果要为内部数据库提供 SQLinterface,这将非常有用。
  • 使用非常快速的基于线程的内存分配系统。
  • 使用优化的嵌套循环联接执行非常快速的联接。
  • 实现内存中哈希表,这些哈希表用作临时表。
  • 使用高度优化的类库实现 SQL 函数,该类库应尽可能快。通常,在查询初始化后,根本没有内存分配。
  • 将 服务器作为单独的程序提供,以便在 client/server 联网环境中使用。

数据类型

语句和函数

  • 查询的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 所需的表和列的别名。

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

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

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

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

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

安全

  • 一个非常灵活和安全的权限和密码系统,支持基于主机的验证。
  • 通过加密连接到服务器时的所有密码流量来确保密码安全。

可扩展性和限制

  • 支持大型数据库。我们将 MySQL Server 与包含 5000 万条记录的数据库一起使用。我们还知道使用 MySQL Server 的用户有 200,000 个表和大约 5,000,000,000 行。
  • 每个表最多支持 64 个索引。每个索引可以包含 1 到 16 列或部分列。InnoDB 表的最大 indexwidth 为 767 字节或 3072 字节。参见第 17.22 节“ InnoDB 限制”。MyISAM table 的最大索引宽度为 1000 字节。参见第 18.2 节“ MyISAM 存储引擎”。索引可以将列的 aprefix 用于 CHARVARCHARBLOBTEXT 列类型。

连接

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

地方化

  • 服务器可以用多种语言向客户端提供错误消息。参见第 12.12 节 “设置错误消息语言”。
  • 完全支持多种不同的字符集,包括latin1 (cp1252)、germanbig5ujis、多个 Unicode 字符集等。例如,允许在表和列名称中使用斯堪的纳维亚字符“å”、“ä”和“ö”。
  • 所有数据都保存在选定的字符集中。
  • 排序和比较是根据 default字符集和排序规则完成的。启动 MySQL 服务器时可以更改此设置(请参见第 12.3.2 节“服务器字符集和排序规则”)。要查看非常高级排序的示例,请查看 Czech 排序代码。MySQL Server 支持许多不同的字符集,这些字符集可以在编译时和运行时指定。
  • 服务器时区可以动态更改,并且各个客户端可以指定自己的时区。参见第 7.1.15 节“ MySQL 服务器时区支持”。

客户端和工具

  • MySQL 包括多个客户端和实用程序。这些程序包括mysqldumpmysqladmin 等命令行程序,以及MySQL Workbench 等图形程序。
  • MySQL Server 内置了对 SQL 语句的支持,用于检查、优化和修复表。这些语句可通过mysqlcheck 客户端从命令行获得。MySQL 还包括myisamchk,这是一个非常快速的命令行实用程序,用于对 MyISAM表执行这些作。请参见第 6 章 “MySQL 程序”。
  • 可以使用 --help-? 选项调用 MySQL 程序来获取联机帮助。

1.2.3 MySQL 的历史

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

MySQL 以联合创始人 Monty Widenius 的女儿 My.

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

1.3 MySQL 8.0 中的新增功能

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

MySQL 8.0 中添加的功能

MySQL8.0 新增以下功能:

  • 数据字典。MySQL 现在包含一个事务数据字典,用于存储有关数据库对象的信息。在以前的 MySQL 版本中,字典数据存储在元数据文件和非事务性表中。有关更多信息,请参见第 16 章 MySQL 数据字典

  • 原子数据定义语句 (Atomic DDL)。原子 DDL 语句将与 DDL作关联的数据字典更新、存储引擎作和二进制日志写入合并到单个原子事务中。有关更多信息,请参见第 15.1.1 节 “原子数据定义语句支持”。

  • 升级过程。以前,在安装新版本的 MySQL 后,MySQL 服务器会在下次启动时自动升级 datadictionary 表,之后 DBA 需要手动调用 mysql_upgrade来升级mysql schema 中的系统表,以及其他 schema 中的对象,例如 sys schema 和用户 schemas。

    从 MySQL 8.0.16 开始,服务器执行以前由 mysql_upgrade 处理的任务。安装新的 MySQL 版本后,服务器现在会在下次启动时自动执行所有必要的升级任务,并且不依赖于调用mysql_upgrade的 DBA。此外,服务器还会更新帮助表的内容(mysql_upgrade没有执行的作)。新的 --upgrade 服务器选项提供了对服务器如何执行自动数据字典和服务器升级作的控制。有关更多信息,请参见第 3.4 节“ MySQL 升级过程升级的内容”。

  • 会话重用。MySQL Server 现在默认支持 SSL 会话重用,通过超时设置来控制服务器维护会话缓存的时间,该缓存建立允许客户端请求会话重用新连接的时间段。所有 MySQL 客户端程序都支持会话重用。有关服务器端和客户端配置的信息,请参见第 8.3.5 节 “重用 SSL 会话”。

    此外,C 应用程序现在可以使用 C API 功能来启用加密连接的会话重用(请参阅 SSL 会话重用)。

  • 安全和帐户管理。添加这些增强功能是为了提高安全性,并在账户管理中实现更大的 DBA 灵活性:

    • MySQL Enterprise Audit 现在支持使用调度程序组件来配置和执行重复任务,以刷新内存中的缓存。有关设置说明,请参阅启用 Audit Log Flush 任务

    • 新的密码验证系统变量允许配置和强制执行用户在尝试替换自己的 MySQL 帐户密码时必须更改的最小字符数。此 newverification 设置是当前密码中 totalcharacters 的百分比。例如,如果validate_password.changed_characters_percentage的值为 50,则替换帐户密码中至少有一半的字符不得出现在当前密码中,否则密码将被拒绝。有关更多信息,请参见第 8.4.3 节 “口令验证组件”。

    • MySQL 企业版现在提供基于组件的数据脱敏和去标识化功能,而不是基于 MySQL8.0.13 中引入的插件库。MySQL Enterprise Data Masking 和 De-Identification 组件支持多字节字符、存储在 databasetable 中的掩码字典以及几个新功能。有关更多信息,请参见第 8.5.1 节 “数据屏蔽组件与数据屏蔽插件”。

    • 在 MySQL 8.0.33 之前,mysql系统数据库用于 MySQL Enterprise Audit 的过滤器和用户帐户数据的持久存储。为了增强灵活性,新的audit_log_database服务器系统变量现在允许在 serverstartup 时在全局架构命名空间中指定其他数据库。mysql 系统数据库是表存储的默认设置。

    • mysql systemdatabase 中的授权 table 现在是 InnoDB(transactional) 表。以前,这些是MyISAM (非事务性)表。grant table 存储引擎的更改是 account-management 语句行为的伴随更改的基础。以前,命名多个用户的帐户管理语句(例如CREATE USERDROP USER)对于某些用户可能会成功,而对于其他用户可能会失败。现在,每个语句都是事务性的,要么对所有命名用户成功,要么回滚,如果发生任何错误,则无效。如果成功,则语句将写入二进制日志,但如果失败,则不会写入二进制日志。在这种情况下,将发生回滚,并且不会进行任何更改。有关更多信息,请参见第 15.1.1 节 “原子数据定义语句支持”。

    • 新的 caching_sha2_password身份验证插件可用。与sha256_password 插件一样,caching_sha2_password 实现 SHA-256 密码哈希,但使用缓存来解决连接时的延迟问题。它还支持 moretransport 协议,并且不需要链接 host-ofOpenSSL 即可实现基于 RSA 密钥对的密码交换功能。参见第 8.4.1.2 节“缓存 SHA-2 可插拔身份验证”。

      caching_sha2_passwordsha256_password authenticationplugins 提供比mysql_native_password 插件(在 8.0.34 中已弃用)更安全的密码加密,caching_sha2_password 提供比 sha256_password 更好的性能。由于caching_sha2_password 的这些卓越的安全性和性能特性,它现在是首选的身份验证插件,也是默认身份验证插件而不是mysql_native_password。有关此默认插件更改对服务器作以及服务器与客户端和连接器的兼容性的影响的信息,请参阅caching_sha2_password作为首选身份验证插件

    • MySQL 企业版 SASL LDAP 身份验证插件现在支持将 GSSAPI/Kerberos 作为 Linux 上 MySQL 客户端和服务器的身份验证方法。这在应用程序使用 Microsoft Active Directory 访问 LDAP 的 Linux 环境中非常有用,默认情况下,Microsoft Active Directory 启用了 Kerberos。请参见LDAP 验证方法

    • MySQL 企业版现在支持一种身份验证方法,使用户能够使用 Kerberos 向 MySQL Server 进行身份验证,前提是适当的 Kerberos 票证可用或可以获取。有关细节,请参见第 8.4.1.8 节 “Kerberos 可插入身份验证”。

    • MySQL 现在支持角色,这些角色是名为 collections of privileges。可以创建和删除角色。角色可以具有授予和撤销的权限。可以向用户帐户授予角色,也可以从用户帐户中撤销角色。可以从授予账户的活动适用角色中进行选择,并且可以在该账户的会话期间进行更改。有关更多信息,请参见第 8.2.10 节 “使用角色”。

    • MySQL 现在包含用户帐户类别的概念,根据系统用户和普通用户是否具有SYSTEM_USER 权限来区分他们。参见第 8.2.11 节 “帐户类别”。

    • 以前,无法授予除某些架构外全局应用的权限。如果启用了partial_revokes systemvariable,现在可以这样做。参见第 8.2.12 节“使用部分撤销进行特权限制”。

    • GRANT 语句具有一个 AS user [WITH<br /> ROLE] 子句,该子句指定有关特权上下文的其他信息以使用 forstatement 执行。此语法在 SQL 级别可见,尽管其主要目的是通过使这些限制出现在二进制日志中,从而在部分撤销施加的授予者特权限制的所有节点上启用统一复制。参见第 15.7.1.6 节“ GRANT 语句”。

    • MySQL 现在维护有关密码历史记录的信息,从而限制重复使用以前的密码。DBA 可以要求在一定数量的密码更改或一段时间内不要从以前的密码中选择新密码。可以全局以及基于每个帐户建立 password-reuse 策略。

      现在可以要求通过指定要替换的 currentpassword 来验证更改帐户密码的尝试。这使 DBA 能够阻止用户在未证明他们知道当前密码的情况下更改密码。可以在全球范围内以及基于每个帐户建立 password-verification 策略。

      现在允许帐户使用双重密码,这使得分阶段密码更改可以在复杂的多服务器系统中无缝执行,而不会停机。

      MySQL 现在允许管理员配置用户帐户,以便由于密码不正确而导致的连续登录失败次数过多会导致临时帐户锁定。所需的失败次数和锁定时间可按账户配置。

      这些新功能使 DBA 能够更全面地控制密码管理。有关更多信息,请参见第 8.2.15 节 “密码管理”。

    • 如果使用 OpenSSL 编译,MySQL 现在支持 FIPS 模式,并且 OpenSSL 库和 FIPS 对象模块在运行时可用。FIPS 模式对加密作施加条件,例如对可接受的加密算法的限制或对更长密钥长度的要求。请参见第 8.8 节 “FIPS 支持”。

    • 服务器用于新连接的 TLS 上下文现在可以在运行时重新配置。例如,此功能可能很有用,可以避免重新启动运行时间过长以至于其 SSL 证书已过期的 MySQL 服务器。请参阅EncryptedConnections 的服务器端运行时配置和监控

    • OpenSSL 1.1.1 支持用于加密连接的 TLS v1.3 协议,如果服务器和客户端都使用 OpenSSL 1.1.1 或更高版本进行编译,则 MySQL 8.0.16 及更高版本也支持 TLS v1.3。参见第 8.3.2 节 “加密连接 TLS 协议和密码”。

    • MySQL 现在将授予命名管道上客户端的访问控制设置为在 Windows 上成功通信所需的最小值。较新的 MySQL 客户端软件可以打开命名管道连接,而无需任何其他配置。如果较旧的客户端软件无法立即升级,则可以使用新的named_pipe_full_access_group系统变量为 Windows 组提供打开命名管道连接的必要权限。完全访问权限组中的成员身份应受到限制且是临时的。

    • 以前,MySQL 用户帐户使用单一身份验证方法向服务器进行身份验证。从 MySQL8.0.27 开始,MySQL 支持多因素身份验证 (MFA),这使得创建具有多达三种身份验证方法的账户成为可能。MFA 支持需要以下更改:

      • CREATE USERALTER USER 语法已扩展为允许指定 multipleauthentication 方法。
      • authentication_policy系统变量通过控制可以使用的因素数量以及每个因素允许的身份验证类型来建立 MFA 策略。这对CREATE USERALTER USER 语句中与身份验证相关的子句的使用方式施加了限制。
      • 客户端程序具有用于指定 multiplepasswords 的 new--password1--password2--password3命令行选项。对于使用 C API 的应用程序,mysql_options4() CAPI 函数的新 MYSQL_OPT_USER_PASSWORD 选项将启用相同的功能。

      此外,MySQL 企业版现在支持使用智能卡、安全密钥和生物识别读取器等设备对 MySQLServer 进行身份验证。此身份验证方法基于 Fast Identity Online (FIDO) 标准,并使用一对插件,authentication_fido服务器端和 authentication_fido_client在客户端。服务器端 FIDO 身份验证插件仅包含在 MySQL Enterprise Edition 发行版中。它不包含在 MySQL 社区发行版中。但是,客户端插件包含在所有发行版中,包括社区发行版。这使任何发行版的 clients(客户端)都可以连接到加载了服务器端插件的服务器。

      多因素身份验证可以使用现有的 MySQL身份验证方法、新的 FIDO 身份验证方法或两者的组合。有关更多信息,请参阅第 8.2.18 节 “多重身份验证”第 8.4.1.11 节 “FIDO 可插拔身份验证”。

  • 资源管理。MySQL 现在支持创建和管理资源组,并允许将在服务器中运行的线程分配给特定组,以便线程根据组可用的资源执行。Group属性启用对其资源的控制,以启用或限制组中线程的资源消耗。DBA 可以根据不同的工作负载修改这些属性。目前,CPU 时间是一种可管理的资源,由“virtualCPU”的概念表示,它是一个术语,包括 CPU 内核、超线程、硬件线程等。服务器在启动时确定有多少个虚拟 CPU 可用,具有适当权限的数据库管理员扫描将这些 CPU 与资源组关联,并将线程分配给组。有关更多信息,请参阅第 7.1.16 节 “资源组”。

  • 表加密管理。现在,可以通过定义和强制执行加密默认值来全局管理表加密。default_table_encryption变量为新创建的架构和常规表空间定义加密默认值。在创建架构时,也可以使用 DEFAULT<br /> ENCRYPTION 子句定义架构的加密默认值。默认情况下,表继承了在其中创建它的 schema 或常规表空间的加密。加密默认值是通过启用table_encryption_privilege_check变量来强制执行的。当创建或更改具有不同于default_table_encryption设置的 Schema 或常规表空间时,或者使用不同于默认 schemaencryption 的加密设置创建或更改表时,将进行特权检查。TABLE_ENCRYPTION_ADMIN权限允许在启用table_encryption_privilege_check时覆盖默认加密设置。有关更多信息,请参阅定义架构和常规表空间的加密默认值

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

    • 每次值更改时,当前最大自动增量计数器值都会写入重做日志,并保存到每个检查点的引擎私有系统表中。这些更改使当前的 maximumauto-increment 计数器值在 serverrestart 之间保持不变。此外:

      • 服务器重新启动不再取消AUTO_INCREMENT = N 表选项的效果。如果将自动递增计数器初始化为特定值,或者将自动递增计数器值更改为更大的值,则新值将在服务器重新启动后保留。
      • ROLLBACK作之后立即重新启动服务器不再导致重用分配给回滚事务的自动增量值。
      • 如果将 AUTO_INCREMENT列值修改为大于 currentmaximum 自动增量值的值(例如,在UPDATE作中),则会保留新值,并且后续INSERT作将从新的更大值开始分配自动增量值。

      有关更多信息,请参阅第 17.6.1.6 节“InnoDB 中的AUTO_INCREMENT处理”InnoDB AUTO_INCREMENT计数器初始化

    • 当遇到索引树损坏时,InnoDB 会将损坏标志写入重做日志,这使得损坏标志 crashsafe。InnoDB 还会将内存中的损坏标志数据写入每个检查点上的引擎私有系统表。在恢复期间,InnoDB 从两个位置读取损坏标志并合并结果,然后将内存中的表和索引对象标记为损坏。

    • InnoDBmemcached 插件支持多个get作(在单个 memcached查询中获取多个键值对)和范围查询。参见第 17.20.4 节“ InnoDB memcached 多个 get 和 Range 查询支持”。

    • 新的动态变量 innodb_deadlock_detect 可用于禁用死锁检测。在高并发系统上,当多个线程等待相同的锁时,死锁检测可能会导致速度变慢。有时,禁用死锁检测并在发生死锁时依赖innodb_lock_wait_timeout设置进行事务回滚可能更有效。

    • 新的 Information SchemaINNODB_CACHED_INDEXES 表报告每个索引的InnoDB 缓冲池中缓存的索引页数。

    • InnoDB 临时 table 现在在共享临时表空间 ibtmp1 中创建。

    • InnoDB表空间加密功能支持 redolog 和 undo log 数据的加密。请参阅重做日志加密撤消日志加密

    • InnoDB 通过 SELECT ... 支持NOWAITSKIP<br /> LOCKED 选项SELECT ... FOR<br /> SHARESELECT ... FOR<br /> UPDATE 锁定读取语句。如果请求的行被 anothertransaction 锁定,NOWAIT 会导致语句立即返回。SKIP LOCKED 从结果集中删除锁定的行。请参阅使用 NOWAIT 和 SKIP LOCKED 锁定读取并发

      SELECT ... FOR SHARE 替换SELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE 仍可用于向后兼容。这些语句是等效的。但是,FOR UPDATEFOR SHARE 支持NOWAIT``SKIP<br /> LOCKEDOF<br /> tbl_name 选项。参见第 15.2.13 节“ SELECT 语句”。

      OF<br /> tbl_name 将锁定查询应用于命名表。

    • ADD PARTITION``DROP<br /> PARTITIONCOALESCE<br /> PARTITION``REORGANIZE<br /> PARTITIONREBUILD<br /> PARTITION ALTER TABLE 选项由本机分区就地 API 支持,并且可以与ALGORITHM={COPY|INPLACE}LOCK 子句。

      ALGORITHM=INPLACEDROP PARTITION 删除存储在分区中的数据并删除分区。但是,带有ALGORITHM=COPYold_alter_table=ONDROP PARTITION 会重建分区表,并尝试将数据从已删除的分区移动到另一个具有兼容 PARTITION ... VALUES定义。无法移动到 anotherpartition 的数据将被删除。

    • InnoDB 存储引擎现在使用 MySQL 数据字典,而不是自己的特定于 storageengine 的数据字典。有关数据字典的信息,请参见第 16 章 “MySQL 数据字典”。

    • mysql 系统表和 datadictionary 表现在在 MySQL 数据目录中名为mysql.ibd 的单个InnoDB 表空间文件中创建。以前,这些 table 是在 mysql 数据库目录中的单个 InnoDB 表空间文件中创建的。

    • MySQL 8.0 中引入了以下撤消表空间更改:

      • 默认情况下,撤消日志现在驻留在初始化 MySQL 实例时创建的两个撤消命名空间中。撤消日志不再在系统表空间中创建。

      • 从 MySQL 8.0.14 开始,可以在运行时使用CREATE UNDO TABLESPACE 语法在选定位置创建其他撤消表空间。

        CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
        

        使用CREATE UNDO TABLESPACE 语法创建的撤消表空间可以在运行时使用DROP UNDO TABLESPACE 语法删除。

        DROP UNDO TABLESPACE tablespace_name;
        

        ALTER UNDO TABLESPACE 语法可用于将撤消表空间标记为活动或非活动。

        ALTER UNDO TABLESPACE tablespace_name SET {ACTIVE|INACTIVE};
        

        显示表空间状态的 STATE 列已添加到 InformationSchemaINNODB_TABLESPACES表中。撤消表空间必须处于empty状态,然后才能删除。

      • 默认情况下,innodb_undo_log_truncate变量处于启用状态。

      • innodb_rollback_segments变量定义 perundo 表空间的回滚段数。以前,innodb_rollback_segments指定了 MySQL 实例的回滚分段总数。此更改增加了可用于 concurrenttransactions 的回滚段的数量。更多的回滚段会增加并发事务对撤消日志使用单独的回滚段的可能性,从而减少资源争用。

    • 修改了影响缓冲池预刷新和刷新行为的变量的默认值:

      • innodb_max_dirty_pages_pct_lwm默认值现在为 10。以前的默认值 0 将禁用缓冲池预刷新。值 10 将在缓冲池中脏页的百分比超过 10% 时启用预刷新。启用 preflushing 可以提高性能一致性。
      • innodb_max_dirty_pages_pct默认值从 75 增加到 90。InnoDB 尝试从缓冲池中刷新数据,以便 dirtypages 的百分比不超过此值。增加的默认值允许缓冲池中更大百分比的脏页。
    • 默认innodb_autoinc_lock_mode设置现在为 2(交错)。交错锁模式允许并行执行多行插入,从而提高并发性和可扩展性。新的innodb_autoinc_lock_mode默认设置反映了从 基于语句的复制 到 基于行的复制 作为 MySQL 5.7 中的默认复制类型的更改。基于语句的复制需要连续的自动递增锁定模式(以前的默认值)以确保以可预测和可重复的顺序为给定的 SQL 语句序列分配自动增量值,而基于行的复制对 SQL 语句的执行顺序不敏感。 有关更多信息,请参阅InnoDB AUTO_INCREMENT 锁定模式

      对于使用基于语句的复制的系统,新的innodb_autoinc_lock_mode默认设置可能会中断依赖于顺序自动增量值的应用程序。要恢复以前的默认值,请将innodb_autoinc_lock_mode设置为 1。

    • ALTERTABLESPACE 支持重命名通用表空间ALTER TABLESPACE ... RENAME TO 语法。

    • 默认情况下禁用的--innodb-dedicated-server服务器选项可用于让InnoDB根据服务器上检测到的内存量自动设置以下系统变量的值:

      此选项适用于在专用服务器上运行的 MySQL 服务器实例。有关更多信息,请参见第 17.8.12 节“为专用 MySQL 服务器启用自动 InnoDB 配置”。

    • 新的 Information SchemaINNODB_TABLESPACES_BRIEF视图为 InnoDB 表空间提供空间、名称、路径、标志和空间类型数据。

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

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

    • 序列化字典信息 (SDI) 存在于所有 InnoDB 表空间文件中,但全局临时表空间和撤消表空间文件除外。SDI 是表和表空间对象的序列化元数据。SDI 数据的存在提供了元数据冗余。例如,如果数据字典不可用,则可以从表空间文件中提取字典 objectmetadata。使用 ibd2sdi 工具执行 SDI 提取。SDIdata 以 JSON 格式存储。

      在表空间文件中包含 SDI 数据会增加稳定空间文件大小。SDI 记录需要一个单索引页,默认情况下为 16KB。但是,SDI 数据在存储时会被压缩以减少存储占用空间。

    • InnoDB 存储引擎现在支持原子 DDL,这可确保 DDL作完全提交或回滚,即使服务器在作期间停止。有关更多信息,请参见第 15.1.1 节 “原子数据定义语句支持”。

    • 当服务器处于脱机状态时,可以使用innodb_directories选项将表空间文件移动或恢复到新位置。有关更多信息,请参见第 17.6.3.6 节“在服务器脱机时移动 Tablespace 文件”。

    • 实施了以下重做日志记录优化:

      • 用户线程现在可以并发写入 logbuffer,而无需同步写入。
      • 用户线程现在可以按松散的顺序将脏页添加到 flushlist 中。
      • 专用日志线程现在负责将日志缓冲区写入系统缓冲区、将系统缓冲区刷新到磁盘、通知用户线程写入和刷新的重做、维护宽松刷新列表顺序所需的滞后以及写入检查点。
      • 添加了系统变量,用于配置等待 flushedredo 的用户线程对 spin delay 的使用:
      • innodb_log_buffer_size变量现在是动态的,它允许在服务器运行时调整日志缓冲区的大小。

      有关更多信息,请参见第 10.5.4 节“优化 InnoDB 重做日志记录”。

    • 从 MySQL 8.0.12 开始,对大型对象 (LOB) 数据的 smallupdates 支持撤消日志记录,这提高了大小为 100 字节或更小的 LOB 更新的性能。以前,LOB 更新的大小至少为 1 个 LOBpage,这对于可能只修改几个字节的更新来说不是最佳选择。此增强功能基于 MySQL 8.0.4 中对 LOB 数据部分更新添加的支持。

    • 从 MySQL 8.0.12 开始,以下ALTER TABLE作支持 ALGORITHM=INSTANT

      • 添加列。此功能也称为 “Instant ADD<br /> COLUMN有限制。参见第 17.12.1 节 “在线 DDL作”。
      • 添加或删除虚拟列。
      • 添加或删除列默认值。
      • 修改ENUMSET 列的定义。
      • 更改索引类型。
      • 重命名表。

      支持ALGORITHM=INSTANT 的作仅 modifymetadata 在数据字典中。不会对表进行元数据锁定,并且表数据不受影响,从而使作成为即时作。如果未明确指定,则默认情况下,支持它的作将使用 ALGORITHM=INSTANT。如果指定了ALGORITHM=INSTANT,但不支持,则作将立即失败并出现错误。

      有关支持ALGORITHM=INSTANT 的作的更多信息,请参见第 17.12.1 节“在线 DDL作”。

    • 从 MySQL 8.0.13 开始,TempTable存储引擎支持存储二进制大型对象 (BLOB) 类型的列。此增强功能提高了使用包含 BLOB 数据的临时表的查询的性能。以前,包含 BLOB 数据的临时表存储在internal_tmp_disk_storage_engine 定义的磁盘上 storageengine 中。有关更多信息,请参阅第 10.4.4 节 “MySQL 中的内部临时表使用”。

    • 从 MySQL 8.0.13 开始,InnoDB静态数据加密功能支持 generaltablespaces。以前,只能加密每个表一个文件表空间。为了支持常规表空间的加密,CREATE TABLESPACEALTER TABLESPACE 语法已扩展为包含ENCRYPTION 子句。

      Information SchemaINNODB_TABLESPACES 表现在包含一个 ENCRYPTION 列,该列指示表空间是否已加密。

      添加了 stage/innodb/alter tablespace<br /> (encryption) 性能模式stageinstrument,以允许监视 generaltablespace 加密作。

    • 禁用innodb_buffer_pool_in_core_file变量通过排除InnoDB 缓冲池页面来减小核心文件的大小。要使用 this变量,必须启用 core_file变量,并且作系统必须支持对 madvise()MADV_DONTDUMP非 POSIX 扩展,这在 Linux 3.4 及更高版本中受支持。有关更多信息,请参见第 17.8.3.7 节“从核心文件中排除缓冲池页面”。

    • 从 MySQL 8.0.13 开始,用户创建的临时表和优化器创建的内部临时表在从临时表空间池中分配给会话的会话临时表空间中恢复。当会话断开连接时,其 temporarytablespaces 将被截断并释放回池中。在以前的版本中,临时表是在全局临时表空间 (ibtmp1) 中创建的,在删除临时表后,该表不会将磁盘空间返回给作系统。

      innodb_temp_tablespaces_dir变量定义创建会话临时表空间的位置。默认位置是 datadirectory 中的 #innodb_temp 目录。

      INNODB_SESSION_TEMP_TABLESPACES表提供有关会话 temporarytablespaces 的元数据。

      全局临时表空间 (ibtmp1) 现在存储对用户创建的临时表所做的更改的 rollbacksegments。

    • 从 MySQL 8.0.14 开始,InnoDB 支持并行聚集索引读取,这可以提高CHECK TABLE 性能。此功能不适用于二级索引扫描。innodb_parallel_read_threads会话变量必须设置为大于 1 的值,才能进行并行聚集索引读取。默认值为 4。用于执行并行聚集索引读取的实际线程数由innodb_parallel_read_threads设置或要扫描的索引子树数(以较小者为准)确定。

    • 从 8.0.14 开始,当使用 --innodb-dedicated-server 启动服务器时,日志文件的大小和数量将根据自动配置的缓冲池大小进行配置。以前,日志文件大小是根据服务器上检测到的内存量配置的,日志文件的数量不会自动配置。

    • 从 8.0.14 开始,CREATE TABLESPACE语句的 ADD DATAFILE 子句是可选的,它允许没有FILE 权限的用户创建表空间。在没有ADD DATAFILE 子句的情况下执行的 CREATE TABLESPACE 语句会隐式创建具有唯一文件名的表空间数据文件。

    • 默认情况下,当 TempTable 存储引擎占用的内存量超过temptable_max_ram变量定义的内存限制时,TempTable 存储引擎开始从磁盘分配内存映射的临时文件。从 MySQL8.0.16 开始,此行为由temptable_use_mmap变量控制。禁用temptable_use_mmap会导致 TempTable 存储引擎使用InnoDB 磁盘上的内部临时表而不是内存映射文件作为其溢出机制。有关更多信息,请参阅内部临时表存储引擎

    • 从 MySQL 8.0.16 开始,InnoDB静态数据加密功能支持加密 mysql 系统表空间。mysql 系统表空间包含mysql 系统数据库和 MySQLdata 字典表。有关更多信息,请参见第 17.13 节“ InnoDB 静态数据加密”。

    • MySQL 8.0.16 中引入的innodb_spin_wait_pause_multiplier变量对线程等待获取互斥锁 orrw-lock 时发生的自旋锁轮询延迟的持续时间提供了更大的控制。可以更精细地调整 delays,以考虑不同处理器架构上 PAUSE 指令持续时间的差异。有关更多信息,请参见第 17.8.8 节 “配置旋转锁轮询”。

    • 在 MySQL8.0.17 中,通过更好地利用读取线程,通过减少并行扫描期间发生的预取活动的读取线程 I / O 以及支持分区的并行扫描,改进了大型数据集的 InnoDB 并行读取线程性能。

      并行读取线程功能由innodb_parallel_read_threads变量控制。最大设置现在为 256,即所有客户端连接的线程总数。如果达到线程限制,连接将回退到使用单个线程。

    • MySQL 8.0.18 中引入的innodb_idle_flush_pct变量允许在空闲期间对页面刷新设置限制,这有助于延长固态存储设备的使用寿命。请参阅限制空闲期间的缓冲区刷新

    • 从 MySQL 8.0.19 开始,支持对 InnoDB 数据进行高效采样以生成直方图统计信息。请参阅直方图统计分析

    • 从 MySQL 8.0.20 开始,doublewrite 缓冲区存储区域驻留在 doublewrite 文件中。在以前的发行版中,存储区域驻留在系统表空间中。将存储区域移出系统表空间可以减少写入延迟,提高吞吐量,并在放置 doublewritebuffer 页方面提供灵活性。为高级 doublewrite bufferconfiguration 引入了以下系统变量:

      有关更多信息,请参见第 17.6.4 节“Doublewrite Buffer”。

    • 争用感知事务调度 (CATS) 算法在 MySQL 8.0.20 中得到了改进,该算法优先考虑等待锁定的事务,事务调度权重计算现在完全在单独的线程中执行,从而提高了计算性能和准确性。

      已删除也用于事务调度的 First In First Out (FIFO) 算法。FIFO 算法被 CATS 算法增强变得多余。以前由 FIFO 算法执行的事务调度现在由 CATS 算法执行。

      已将 TRX_SCHEDULE_WEIGHT 列添加到INFORMATION_SCHEMA.INNODB_TRX table,它允许查询 CATS 算法分配的事务调度权重。

      添加了以下 INNODB_METRICS 计数器,用于监视代码级 transactionscheduling 事件:

      • lock_rec_release_attempts

        尝试释放记录锁的次数。

      • lock_rec_grant_attempts

        尝试授予记录锁定的次数。

      • lock_schedule_refreshes

        分析等待图以更新交易计划权重的次数。

      有关更多信息,请参见第 17.7.6 节 “事务调度”。

    • 从 MySQL 8.0.21 开始,为了提高需要访问表和行资源的锁定队列的作的并发性,锁系统互斥锁(lock_sys->mutex)被替换为分片闩锁,并且锁队列被分组到表和页锁队列分片中,每个分片都由专用互斥锁保护。以前,单锁系统互斥锁保护所有锁队列,这是高并发系统上的一个争论点。新的分片实现允许对锁定队列进行更精细的访问。

      锁系统 mutex(lock_sys->mutex) 被以下分片闩锁取代:

      • 一个由 64 个读写锁对象 (rw_lock_t) 组成的全局 latch (lock_sys->latches.global_latch)。访问单个锁队列需要一个共享的全局锁存器和锁队列分片上的锁存器。需要访问所有锁定队列的作采用 exclusiveglobal latch,该闩锁将锁定所有表和页锁定队列分片。
      • Table shard latches(lock_sys->latches.table_shards.mutexes),实现为 512 个互斥锁的数组,每个互斥锁专用于 512 个表锁队列分片中的一个。
      • 页面分片闩锁(lock_sys->latches.page_shards.mutexes),实现为 512 个互斥锁的数组,每个互斥锁专用于 512 个页面锁定队列分片之一。

      用于监控单锁系统互斥锁的wait/synch/mutex/innodb/lock_mutex工具被用于监控 newglobal、table shard 和 page shard 闩锁的工具所取代:

      • wait/synch/sxlock/innodb/lock_sys_global_rw_lock
      • wait/synch/mutex/innodb/lock_sys_table_mutex
      • wait/synch/mutex/innodb/lock_sys_page_mutex
    • 从 MySQL 8.0.21 开始,使用DATA DIRECTORY 子句在数据目录之外创建的表和表分区数据文件仅限于 InnoDB 已知的目录。此更改允许数据库管理员控制表空间数据文件的创建位置,并确保在恢复期间可以找到数据文件。

      常规和每表文件表空间数据文件(.ibd 文件)不能再在撤消表空间目录(innodb_undo_directory)中创建,除非InnoDB 直接知道。

      已知目录是由datadirinnodb_data_home_dirinnodb_directories变量定义的目录。

      截断驻留在逐表文件表空间中的 InnoDB 表会删除现有表空间并创建一个新表空间。从 MySQL8.0.21 开始,InnoDB 在默认位置创建 newtablespace,如果当前 tablespace 目录未知,则会向错误日志写入警告。要让 TRUNCATE TABLE 在其 currentlocation 中创建表空间,请在运行 TRUNCATE TABLE 之前将目录添加到innodb_directories设置中。

    • 从 MySQL 8.0.21 开始,可以使用ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG语法。此功能旨在将数据加载到新的 MySQL 实例中。禁用重做日志记录有助于避免重做日志写入,从而加快数据加载速度。

      新的INNODB_REDO_LOG_ENABLE权限允许启用和禁用重做日志记录。

      新的Innodb_redo_log_enabled状态变量允许监控重做日志记录状态。

      请参阅禁用重做日志记录

    • MySQL 8.0.23 中引入的 AUTOEXTEND_SIZE 选项定义了InnoDB 在空间已满时扩展表空间大小的量,从而可以以更大的增量扩展表空间大小。AUTOEXTEND_SIZE 选项支持 CREATE TABLEALTER TABLECREATE TABLESPACEALTER TABLESPACE语句。有关更多信息,请参见第 17.6.3.9 节“表空间AUTOEXTEND_SIZE配置”。

      已将 AUTOEXTEND_SIZE 大小列添加到 Information SchemaINNODB_TABLESPACES 表中。

    • MySQL 8.0.26 中引入的innodb_segment_reserve_factor系统变量允许配置保留为空页的表空间文件段页的百分比。有关更多信息,请参阅配置保留文件段页的百分比

    • 在支持 fdatasync() 系统调用的平台上,MySQL 8.0.26 中引入的innodb_use_fdatasync变量允许使用fdatasync() 而不是fsync() 进行作系统刷新。除非后续数据检索需要,否则 fdatasync() 系统调用不会刷新对文件元数据的更改,从而提供潜在的性能优势。

    • 从 MySQL 8.0.28 开始,tmp_table_size 变量定义了由 TempTable存储引擎创建的任何单个内存中内部临时表的最大大小。适当的大小限制可防止单个查询消耗过多的 amountglobal TempTable 资源。请参阅内部临时表存储引擎

    • 从 MySQL 8.0.28 开始,innodb_open_files变量定义InnoDB 一次可以打开的文件数,可以在运行时使用 SELECT<br /> innodb_set_open_files_limit(N) 语句进行设置。该语句执行设置新限制的存储过程。

      为防止非 LRU 管理文件占用整个innodb_open_files限制,非 LRU 托管文件限制为innodb_open_files限制的 90%,从而为 LRU 托管文件保留innodb_open_files 限制的 10%。

      innodb_open_files限制包括临时表空间文件,这些文件以前未计入限制。

    • 从 MySQL 8.0.28 开始,InnoDB 支持ALTER TABLE ... RENAME COLUMN使用ALGORITHM=INSTANT 的 RENAME COLUMN作。

      有关支持 ALGORITHM=INSTANT作和其他 DDL作的更多信息,请参见第 17.12.1 节“在线 DDL作”。

    • 从 MySQL 8.0.29 开始,InnoDB 支持ALTER TABLE ... DROP COLUMN ALGORITHM=INSTANT 的 DROP COLUMN作。

      在 MySQL 8.0.29 之前,只能将立即添加的列添加为表的最后一列。从 MySQL 8.0.29 开始,可以立即将添加的列添加到表中的任何位置。

      立即添加或删除的列会创建受影响行的新版本。最多允许 64 行版本。向 Information SchemaINNODB_TABLES 表中添加了一个新的 TOTAL_ROW_VERSIONS列,用于跟踪行版本的数量。

      有关支持ALGORITHM=INSTANT作的更多信息,请参见第 17.12.1 节“在线 DDL作”。

    • 从 MySQL 8.0.30 开始,innodb_doublewrite系统变量支持 DETECT_ONLYDETECT_AND_RECOVER 设置。使用 DETECT_ONLY 设置时,数据库页内容不会写入 doublewrite 缓冲区,并且 recovery 不使用 doublewrite 缓冲区来修复未完成的页写入。此轻量级设置仅用于检测不完整的页面写入。DETECT_AND_RECOVER 设置等同于现有的 ON设置。有关更多信息,请参见第 17.6.4 节“Doublewrite Buffer”。

    • 从 MySQL 8.0.30 开始,InnoDB 支持重做日志容量的动态配置。可以在运行时设置innodb_redo_log_capacity系统变量,以增加或减少 redolog 文件占用的磁盘空间总量。

      通过此更改,重做日志文件的数量及其默认位置也发生了变化。从 MySQL 8.0.30 开始,InnoDB 在 data 目录的 #innodb_redo 目录中维护 32 个重做日志文件。以前 InnoDB默认在 data 目录下创建了两个重做日志文件,重做日志文件的数量和大小由innodb_log_files_in_groupinnodb_log_file_size变量控制。这两个变量现已弃用。

      定义 innodb_redo_log_capacity设置后,将忽略 innodb_log_files_in_groupinnodb_log_file_size设置;否则,这些设置将用于计算innodb_redo_log_capacity 设置 (innodb_log_files_in_group* innodb_log_file_size= innodb_redo_log_capacity)。如果未设置这些变量,则重做日志容量将设置为 innodb_redo_log_capacity 默认值,即 104857600 字节 (100MB)。

      提供了几个状态变量,用于监控 theredo log 和 redo log 大小调整作。

      有关更多信息,请参见第 17.6.5 节 “重做日志”。

    • 在 MySQL 8.0.31 中,有两个新的状态变量用于监控在线缓冲池大小调整作。Innodb_buffer_pool_resize_status_code状态变量报告一个状态代码,该代码指示在线缓冲池大小调整作的阶段。Innodb_buffer_pool_resize_status_progress状态变量报告一个百分比值,该值指示每个阶段的进度。

      有关更多信息,请参见第 17.8.3.1 节“配置 InnoDB 缓冲池大小”。

  • 字符集支持。默认字符集已从latin1 更改为 utf8mb4utf8mb4 字符集具有多个新的排序规则,包括utf8mb4_ja_0900_as_cs,这是第一个可用于 Unicodein MySQL 的特定于日语的排序规则。有关更多信息,请参见第 12.10.1 节“ Unicode 字符集”。

  • JSON 增强功能。对 MySQL 的 JSON 功能进行了以下增强或添加:

    • 新增 ->>(inline path) 运算符,等同于 JSON_EXTRACT() 的结果调用JSON_UNQUOTE()

      这是对 列路径 operator->在 MySQL 5.7 中引入的改进;col->>"$.path" 等同于JSON_UNQUOTE(col->"$.path") 。内联路径运算符可用于任何可以使用JSON_UNQUOTE(JSON_EXTRACT()) 的地方,例如SELECT 列列表、WHEREHAVING子句以及 ORDER BYGROUP BY 子句。有关更多信息,请参阅运算符的说明以及 JSON 路径语法

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

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

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

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

    • 在使用 ORDER BY 对查询中的 JSON 值进行排序时,每个值现在由排序键的可变长度部分表示,而不是由固定的 1K 大小的一部分表示。在许多情况下,这可以减少过度使用。例如,ascalar INT 甚至BIGINT 值实际上需要很少的字节,因此这个空间的其余部分(高达 90% 或更多)被填充占用。此更改对性能有以下好处:

      • 现在,可以更有效地使用排序缓冲区空间,因此文件排序不需要像使用固定长度的排序键那样尽早或经常刷新到磁盘。这意味着可以在内存中对更多数据进行排序,从而避免不必要的磁盘访问。
      • 较短的键比较较长的键可以更快地进行比较,从而显着改善性能。对于完全在内存中执行的排序以及需要写入磁盘和从磁盘读取的排序,都是如此。
    • 在 MySQL 8.0.2 中添加了对 JSON 列值的部分就地更新的支持,这比完全删除现有 JSON 值并在其位置写入新值更有效,就像之前在更新任何JSON 列时所做的那样。要应用此优化,必须使用JSON_SET()JSON_REPLACE()JSON_REMOVE() 应用更新。无法将 newelements 添加到 正在更新的 JSON 文档中;文档中的值不能占用比更新前更多的空间。有关要求的详细讨论,请参阅JSON 值的部分更新

      JSON 文档的部分更新可以写入二进制日志,比记录 completeJSON 文档占用更少的空间。始终记录部分更新,例如在使用基于语句的复制时。要使 this 与基于行的复制一起使用,您必须首先设置binlog_row_value_options=PARTIAL_JSON;有关更多信息,请参阅此变量的描述。

    • 添加了 JSON 实用程序函数JSON_STORAGE_SIZE()JSON_STORAGE_FREE()JSON_STORAGE_SIZE() 返回在任何 partialupdate 之前用于 JSON 文档的 binary表示的存储空间(以字节为单位)(请参阅上一项)。JSON_STORAGE_FREE() 显示使用 JSON_SET()JSON_REPLACE() 部分更新后JSON 类型的表列中的剩余空间量;如果新值的二进制表示形式小于前一个值的二进制表示形式,则该值大于零。

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

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

      JSON_STORAGE_SIZE()JSON_STORAGE_FREE() 在 MySQL 8.0.2 中实现。

    • 在 MySQL 8.0.2 中添加了对 XPath 表达式中 $[1 to 5] 等范围的支持。此外,在此版本中添加了对last 关键字和相对寻址的支持,以便 $[last] 始终选择数组中的最后一个(编号最高)元素,而 $[last-1] 选择倒数第二个元素。last 和使用它的表达式也可以包含在范围定义中。例如,$[last-2 to last-1] 返回 lasttwo 元素,但一个元素来自数组。请参阅搜索和修改 JSON 值,以了解更多信息和示例。

    • 添加了旨在符合RFC7396 的 JSON 合并函数。JSON_MERGE_PATCH() 时,当用于 2 个 JSON 对象时,会将它们合并为一个 JSON对象,该对象的成员是以下集合的联合:

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

      作为这项工作的一部分,JSON_MERGE() 函数已重命名为JSON_MERGE_PRESERVE()在 MySQL8.0 中,JSON_MERGE() 继续被识别为JSON_MERGE_PRESERVE() 的别名,但现在已被弃用,并且可以在将来的 MySQL 版本中删除。

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

    • 实现了重复键的“最后一个重复键优先”规范化,与RFC7159 和大多数 JavaScript 解析器一致。此处显示了此行为的一个示例,其中仅保留具有键 x 的最 rightmostmember:

      mysql> SELECT JSON_OBJECT('x', '32', 'y', '[true, false]',
           >                     'x', '"abc"', 'x', '100') AS Result;
      +------------------------------------+
      | Result                             |
      +------------------------------------+
      | {"x": "100", "y": "[true, false]"} |
      +------------------------------------+
      1 row in set (0.00 sec)
      

      插入 MySQLJSON 列的值也以这种方式规范化,如以下示例所示:

      mysql> CREATE TABLE t1 (c1 JSON);
      
      mysql> INSERT INTO t1 VALUES ('{"x": 17, "x": "red", "x": [3, 5, 7]}');
      
      mysql> SELECT c1 FROM t1;
      +------------------+
      | c1               |
      +------------------+
      | {"x": [3, 5, 7]} |
      +------------------+
      

      这与以前版本的 MySQL 不兼容,在这种情况下使用了 “first duplicate key wins” 算法。

      有关更多信息和示例,请参阅 JSON 值的规范化、合并和自动包装

    • MySQL 8.0.4 新增 JSON_TABLE() 函数。此函数接受 JSON 数据并将其作为具有指定列的关系表返回。

      此函数的语法为JSON_TABLE(expr,<br /> path COLUMNS<br /> column_list) [AS]<br /> alias)其中expr 是返回 JSON 数据的表达式,path 是应用于源的 JSON 路径,column_list 是列定义的列表。示例如下所示:

      mysql> SELECT *
          -> FROM
          ->   JSON_TABLE(
          ->     '[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]',
          ->     "$[*]" COLUMNS(
          ->       rowid FOR ORDINALITY,
          ->
          ->       xa INT EXISTS PATH "$.a",
          ->       xb INT EXISTS PATH "$.b",
          ->
          ->       sa VARCHAR(100) PATH "$.a",
          ->       sb VARCHAR(100) PATH "$.b",
          ->
          ->       ja JSON PATH "$.a",
          ->       jb JSON PATH "$.b"
          ->     )
          ->   ) AS  jt1;
      +-------+------+------+------+------+------+--------+
      | rowid | xa   | xb   | sa   | sb   | ja   | jb     |
      +-------+------+------+------+------+------+--------+
      |     1 |    1 |    1 | 3    | 0    | 3    | "0"    |
      |     2 |    1 |    1 | 3    | 1    | "3"  | "1"    |
      |     3 |    1 |    1 | 2    | 1    | 2    | 1      |
      |     4 |    1 |    0 | 0    | NULL | 0    | NULL   |
      |     5 |    0 |    1 | NULL | NULL | NULL | [1, 2] |
      +-------+------+------+------+------+------+--------+
      

      JSON 源表达式可以是生成有效 JSON 文档的任何表达式,包括 JSON 文本、表列或返回 JSON 的函数调用,例如 JSON_EXTRACT(t1, data, '$.post.comments')有关更多信息,请参见第 14.17.6 节“ JSON Table 函数”。

  • 数据类型支持。MySQL 现在支持在数据类型规范中使用表达式作为默认值。这包括使用表达式作为BLOBTEXTGEOMETRYJSON 数据类型的默认值,这些数据类型以前根本无法分配默认值。有关细节,请参见第 13.6 节 “数据类型默认值”。

  • 优化。添加了以下优化器增强功能:

    • MySQL 现在支持不可见索引。优化器根本不使用不可见索引,但会正常维护。默认情况下,索引是可见的。不可见索引可以测试删除索引对查询性能的影响,而无需进行破坏性更改,如果需要索引,则必须撤消这些更改。参见第 10.3.12 节 “不可见索引”。

    • MySQL 现在支持降序索引:索引定义中的 DESC 不再被忽略,但会导致按降序存储键值。以前,可以按相反的顺序扫描索引,但会降低性能。降序索引可以按正向顺序扫描,这样效率更高。降序索引还使优化器能够在最有效的扫描顺序混合某些列的升序和其他列的降序时使用多列索引。参见第 10.3.13 节“降序索引”。

    • MySQL 现在支持创建函数索引键部分,用于索引表达式值而不是列值。功能键部分支持对无法通过其他方式编制索引的值(如JSON 值)进行索引。有关详细信息,请参见第 15.1.15 节“ CREATE INDEX 语句”。

    • 在 MySQL 8.0.14 及更高版本中,由常量文字表达式引起的琐碎WHERE 条件在准备期间删除,而不是稍后在优化期间删除。在过程的早期删除条件可以简化具有 outer joinshave trilittle 条件的查询的 join,例如:

      SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1
      

      优化器现在在准备过程中看到 0 = 1 始终为 false,使 OR 0 = 1变得多余,并将其删除,留下以下内容:

      SELECT * FROM t1 LEFT JOIN t2 ON condition_1 where condition_2
      

      现在,优化器可以将查询重写为 innerjoin,如下所示:

      SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1 AND condition_2
      

      有关更多信息,请参见第 10.2.1.9 节 “外部连接优化”。

    • 在 MySQL 8.0.16 及更高版本中,MySQL 可以在优化时使用 constantfolding 来处理列与常量值之间的比较,其中 constantis 超出范围或位于相对于列类型的范围边界上,而不是在执行时对每一行执行此作。例如,给定一个具有 TINYINT<br /> UNSIGNEDc 的表t,优化器可以将 WHERE<br /> c < 256 重写为 WHERE 1 等条件(并完全优化条件),或WHERE c >= 255 重写为 WHERE c<br /> = 255

      有关更多信息,请参见第 10.2.1.14 节“常量折叠优化”。

    • 从 MySQL 8.0.16 开始,用于 IN 子查询的半连接优化现在也可以应用于 EXISTS 子查询。此外,优化器现在在附加到子查询的WHERE 条件中对三相关相等谓词进行去相关,以便可以将它们与 IN 子查询中的表达式类似地处理;这适用于 EXISTSIN 子查询。

      有关更多信息,请参阅第 10.2.2.1 节“使用 SemijoinTransformations 优化 IN 和 EXISTS 子查询谓词”。

    • 从 MySQL 8.0.17 开始,服务器在上下文化阶段将任何不完整的 SQL 谓词(即具有WHERE<br /> value 形式的谓词,其中value 是列名或常量表达式,未使用比较运算符)在内部重写为 WHERE<br /> value <> 0,因此 queryresolver、查询优化器和查询执行程序只需要使用完整的谓词。

      此更改的一个明显影响是,对于布尔值,EXPLAIN 输出现在显示 truefalse,而不是10

      此更改的另一个影响是,在 SQL 布尔上下文中对 aJSON 值执行与 JSON 整数 0 的隐式比较。考虑创建并填充的表,如下所示:

      mysql> CREATE TABLE test (id INT, col JSON);
      
      mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}');
      
      mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
      +------+---------------+--------------+
      | id   | col           | col->"$.val" |
      +------+---------------+--------------+
      |    1 | {"val": true} | true         |
      +------+---------------+--------------+
      
      mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
      +------+----------------+--------------+
      | id   | col            | col->"$.val" |
      +------+----------------+--------------+
      |    1 | {"val": true}  | true         |
      |    2 | {"val": false} | false        |
      +------+----------------+--------------+
      
      mysql> SELECT id, col, col->"$.val" FROM test
          ->     WHERE JSON_VALUE(col, "$.val" RETURNING UNSIGNED) IS TRUE;
      +------+---------------+--------------+
      | id   | col           | col->"$.val" |
      +------+---------------+--------------+
      |    1 | {"val": true} | true         |
      +------+---------------+--------------+
      
    • UPDATE t1 SET t1.a=*value* WHERE t1.a IN (SELECT t2.a FROM t2)

    • DELETE FROM t1 WHERE t1.a IN (SELECT t2.a FROM t2)

-
-
-

  • Additional target types for casts. The functions CAST() and CONVERT() now support conversions to types DOUBLE, FLOAT, and REAL. Added in MySQL 8.0.17. See Section 14.10, “Cast Functions and Operators”.

  • JSON schema validation. MySQL 8.0.17 adds two functions JSON_SCHEMA_VALID() and JSON_SCHEMA_VALIDATION_REPORT() for validating JSON documents again JSON schemas. JSON_SCHEMA_VALID() returns TRUE (1) if the document validates against the schema and FALSE (0) if it does not. JSON_SCHEMA_VALIDATION_REPORT() returns a JSON document containing detailed information about the results of the validation. The following statements apply to both of these functions:

    • The schema must conform to Draft 4 of the JSON Schema specification.
    • required attributes are supported.
    • External resources and the $ref keyword are not supported.
    • Regular expression patterns are supported; invalid patterns are silently ignored.

    See Section 14.17.7, “JSON Schema Validation Functions”, for more information and examples.

  • Multi-valued indexes. Beginning with MySQL 8.0.17, InnoDB supports the creation of a multi-valued index, which is a secondary index defined on a JSON column that stores an array of values and which can have multiple index records for a single data record. Such an index uses a key part definition such as CAST(data->'$.zipcode' AS UNSIGNED ARRAY). A multi-valued index is used automatically by the MySQL optimizer for suitable queries, as can be viewed in the output of EXPLAIN.

    As part of this work, MySQL adds a new function JSON_OVERLAPS() and a new MEMBER OF() operator for working with JSON documents, additionally extending the CAST() function with a new ARRAY keyword, as described in the following list:

    • JSON_OVERLAPS() compares two JSON documents. If they contain any key-value pairs or array elements in common, the function returns TRUE (1); otherwise it returns FALSE (0). If both values are scalars, the function performs a simple test for equality. If one argument is a JSON array and the other is a scalar, the scalar is treated as an array element. Thus, JSON_OVERLAPS() acts as a complement to JSON_CONTAINS().
    • MEMBER OF() tests whether the first operand (a scalar or JSON document) is a member of the JSON array passed as the second operand, returning TRUE (1) if it is, and FALSE (0) if it is not. No type conversion of the operand is performed.
    • CAST(expression AS type ARRAY) permits creation of a functional index by casting the JSON array found in a JSON document at json_path to an SQL array. Type specifiers are limited to those already supported by CAST(), with the exception of BINARY (not supported). This usage of CAST() (and the ARRAY keyword) is supported only by InnoDB, and only for the creation of a multi-valued index.

    For detailed information about multi-valued indexes, including examples, see Multi-Valued Indexes. Section 14.17.3, “Functions That Search JSON Values”, provides information about JSON_OVERLAPS() and MEMBER OF(), along with examples of use.

  • Hintable time_zone. As of MySQL 8.0.17, the time_zone session variable is hintable using SET_VAR.

  • Redo Log Archiving. As of MySQL 8.0.17, InnoDB supports redo log archiving. Backup utilities that copy redo log records may sometimes fail to keep pace with redo log generation while a backup operation is in progress, resulting in lost redo log records due to those records being overwritten. The redo log archiving feature addresses this issue by sequentially writing redo log records to an archive file. Backup utilities can copy redo log records from the archive file as necessary, thereby avoiding the potential loss of data. For more information, see Redo Log Archiving.

  • The Clone Plugin. As of MySQL 8.0.17, MySQL provides a clone plugin that permits cloning InnoDB data locally or from a remote MySQL server instance. A local cloning operation stores cloned data on the same server or node where the MySQL instance runs. A remote cloning operation transfers cloned data over the network from a donor MySQL server instance to the recipient server or node where the cloning operation was initiated.

    The clone plugin supports replication. In addition to cloning data, a cloning operation extracts and transfers replication coordinates from the donor and applies them on the recipient, which enables using the clone plugin for provisioning Group Replication members and replicas. Using the clone plugin for provisioning is considerably faster and more efficient than replicating a large number of transactions. Group Replication members can also be configured to use the clone plugin as an alternative method of recovery, so that members automatically choose the most efficient way to retrieve group data from seed members.

    For more information, see Section 7.6.7, “The Clone Plugin”, and Section 20.5.4.2, “Cloning for Distributed Recovery”.

    As of MySQL 8.0.27, concurrent DDL operations on the donor MySQL Server instance are permitted while a cloning operation is in progress. Previously, a backup lock was held during the cloning operation, preventing concurrent DDL on the donor. To revert to the previous behavior of blocking concurrent DDL on the donor during a clone operation, enable the clone_block_ddl variable. See Section 7.6.7.4, “Cloning and Concurrent DDL”.

    As of MySQL 8.0.29, the clone_delay_after_data_drop variable permits specifying a delay period immediately after removing existing data on the recipient MySQL Server instance at the start of a remote cloning operation. The delay is intended to provide enough time for the file system on the recipient host to free space before data is cloned from the donor MySQL Server instance. Certain file systems free space asynchronously in a background process. On these file systems, cloning data too soon after dropping existing data can result in clone operation failures due to insufficient space. The maximum delay period is 3600 seconds (1 hour). The default setting is 0 (no delay).

    As of MySQL 8.0.37, cloning is allowed between different point releases. In other words, only the major and minor version numbers must match when previously the point release number also had to match.

    For example, clone functionality now permits cloning 8.0.37 to 8.0.41 or 8.0.51 to 8.0.39. Previous restrictions still apply to versions older than 8.0.37, so cloning the likes of 8.0.36 to 8.0.42 or vice-versa is not permitted.

  • Hash Join Optimization. Beginning with MySQL 8.0.18, a hash join is used whenever each pair of tables in a join includes at least one equi-join condition, and no indexes apply to any join condition. A hash join does not require indexes, although it can be used with indexes applying to single-table predicates only. A hash join is more efficient in most cases than the block-nested loop algorithm. Joins such as those shown here can be optimized in this manner:

    SELECT *
        FROM t1
        JOIN t2
            ON t1.c1=t2.c1;
    
    SELECT *
        FROM t1
        JOIN t2
            ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2)
        JOIN t3
            ON (t2.c1 = t3.c1)
    

    Hash joins can also be used for Cartesian products—that is, when no join condition is specified.

    您可以使用EXPLAIN FORMAT=TREEEXPLAIN ANALYZE 查看何时将哈希联接优化用于特定查询。(在 MySQL 8.0.20 及更高版本中,您也可以使用 EXPLAIN,省略FORMAT=TREE

    哈希联接可用的内存量受join_buffer_size 的值限制。需要超过此内存的 hashjoin 在磁盘上执行;非磁盘哈希联接可以使用的磁盘文件数受open_files_limit 的限制。

    从 MySQL 8.0.19 开始,不再支持 MySQL 8.0.18 中引入的hash_join 优化器开关(hash_join=on 仍作为值的一部分ofoptimizer_switch,但设置它不再有效)。HASH_JOINNO_HASH_JOIN 优化器提示也不再受支持。switch 和 hint 现在都已弃用;预计它们将在未来的 MySQL 版本中删除。在 MySQL 8.0.18 及更高版本中,可以使用 NO_BNL优化器开关禁用哈希联接。

    在 MySQL 8.0.20 及更高版本中,MySQL 服务器中不再使用块嵌套循环,并且只要以前使用块嵌套循环,即使查询不包含等值连接条件,也会使用哈希连接。这适用于内部非等连接、半连接、反连接、左外部连接和右外部连接。仍然支持 optimizer_switch systemvariable 的block_nested_loop 标志以及BNLNO_BNL 优化器提示,但此后仅控制哈希连接的使用。此外,内部和外部连接(包括半连接和反连接)现在都可以使用批量密钥访问 (BKA),它以增量方式分配连接缓冲区内存,以便单个查询不需要消耗大量实际上不需要解析的资源。从 MySQL8.0.18 开始,仅支持用于内部连接的 BKA。

    MySQL 8.0.20 还将以前版本的 MySQL 中使用的执行程序替换为迭代器执行程序。这项工作包括替换旧的索引子查询引擎,这些引擎控制 WHERE<br /> value IN (SELECT<br /> column FROM<br /> table WHERE ...) 形式的查询,以替代那些尚未优化为 semijoins 的 IN 查询,以及以相同形式实现的查询,这些查询以前依赖于旧的执行程序。

    有关更多信息和示例,请参见第 10.2.1.4 节 “哈希连接优化”。另请参阅批量密钥访问联接

  • EXPLAIN ANALYZE 语句。MySQL 8.0.18 中实现了 EXPLAIN语句的新形式 EXPLAIN ANALYZE,为处理查询时使用的每个迭代器提供了有关以TREE 格式执行SELECT 语句的扩展信息,并使将估计成本与查询的实际成本进行比较成为可能。此信息包括启动成本、总成本、此迭代器返回的行数以及执行的循环数。

    在 MySQL 8.0.21 及更高版本中,此语句还支持FORMAT=TREE 说明符。TREE 是唯一支持的格式。

    有关更多信息,请参阅使用 EXPLAIN ANALYZE 获取信息

  • 查询强制转换注入。在版本 8.0.18 及更高版本中,MySQL 将强制转换作注入到参数数据类型与 expected数据类型不匹配的表达式和条件内的查询项树中。这对 queryresults 或执行速度没有影响,但会使执行的查询等同于符合 SQLstandard 的查询,同时保持与以前版本的 MySQL 的向后兼容性。

    现在,可以在时间类型(DATEDATETIMETIME和数字类型(TIMESTAMPSMALLINT,TINYINT,MEDIUMINT,INTSMALLINT/MEDIUMINTINTTINYINTINTEGERBIGINTDECIMAL/NUMERIC;FLOATDOUBLEREAL;BIT)每当使用任何标准数字 comparisonoperators(=>=><<=<>/!=,or<=>) 进行比较时。在这种情况下,任何尚未成为DOUBLE 的值都将转换为 1。现在还执行强制转换注入以比较DATETIME 值与DATETIME 值,其中参数在必要时强制转换为DATETIME

    从 MySQL 8.0.21 开始,在将字符串类型与其他类型的类型进行比较时,也会执行此类强制转换。强制转换的字符串类型包括 CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET。将字符串类型的值与数字类型或YEAR 进行比较时,字符串强制转换为DOUBLE如果另一个参数的类型不是 FLOAT``DOUBLEREAL则它也将被强制转换为DOUBLE。将字符串类型与DATETIMETIMESTAMP值进行比较时,字符串将转换为 DATETIME;将字符串类型与 DATE 进行比较时,字符串将转换为 DATE

    通过查看 EXPLAIN ANALYZEEXPLAIN FORMAT=JSONEXPLAIN FORMAT=TREE 的输出,可以查看何时将强制转换注入给定查询:

    mysql> CREATE TABLE d (dt DATETIME, d DATE, t TIME);
    Query OK, 0 rows affected (0.62 sec)
    
    mysql> CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL);
    Query OK, 0 rows affected (0.51 sec)
    
    mysql> CREATE TABLE s (c CHAR(25), vc VARCHAR(25),
        ->     bn BINARY(50), vb VARBINARY(50), b BLOB, t TEXT,
        ->     e ENUM('a', 'b', 'c'), se SET('x' ,'y', 'z'));
    Query OK, 0 rows affected (0.50 sec)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (cast(d.dt as double) = cast(n.i as double))
    (cost=0.70 rows=1)
        -> Table scan on n  (cost=0.35 rows=1)
        -> Hash
            -> Table scan on d  (cost=0.35 rows=1)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from s JOIN d ON d.dt = s.c\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (d.dt = cast(s.c as datetime(6)))  (cost=0.72 rows=1)
        -> Table scan on d  (cost=0.37 rows=1)
        -> Hash
            -> Table scan on s  (cost=0.35 rows=1)
    
    1 row in set (0.01 sec)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from n JOIN s ON n.d = s.c\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (cast(n.d as double) = cast(s.c as double))  (cost=0.70 rows=1)
        -> Table scan on s  (cost=0.35 rows=1)
        -> Hash
            -> Table scan on n  (cost=0.35 rows=1)
    
    1 row in set (0.00 sec)
    
INSERT INTO t SET a=9,b=5
    ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);
INSERT INTO t SET a=9,b=5 AS new
    ON DUPLICATE KEY UPDATE a=new.a+new.b;

INSERT INTO t VALUES(9,5) AS new
    ON DUPLICATE KEY UPDATE a=new.a+new.b;

INSERT INTO t SET a=9,b=5 AS new(m,n)
    ON DUPLICATE KEY UPDATE a=m+n;

INSERT INTO t VALUES(9,5) AS new(m,n)
    ON DUPLICATE KEY UPDATE a=m+n;
SELECT a FROM t1 FORCE INDEX (i_a) FOR JOIN WHERE a=1 AND b=2;

SELECT /*+ JOIN_INDEX(t1 i_a) */ a FROM t1 WHERE a=1 AND b=2;
CAST(
    JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) )
    AS type
);
CREATE TABLE t1(
    j JSON,
    INDEX i1 ( (JSON_VALUE(j, '$.id' RETURNING UNSIGNED)) )
);

INSERT INTO t1 VALUES ROW('{"id": "123", "name": "shoes", "price": "49.95"}');
SELECT j->"$.name" as name, j->"$.price" as price 
    FROM t1
    WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;
mysql> CREATE USER 'mary'@'localhost' COMMENT 'This is Mary Smith\'s account';
Query OK, 0 rows affected (0.33 sec)

mysql> ALTER USER 'mary'@'localhost'
    -≫     ATTRIBUTE '{"fname":"Mary", "lname":"Smith"}';
Query OK, 0 rows affected (0.14 sec)

mysql> ALTER USER 'mary'@'localhost'
    -≫     ATTRIBUTE '{"email":"mary.smith@example.com"}';
Query OK, 0 rows affected (0.12 sec)

mysql> SELECT
    ->    USER,
    ->    HOST,
    ->    ATTRIBUTE->>"$.fname" AS 'First Name',
    ->    ATTRIBUTE->>"$.lname" AS 'Last Name',
    ->    ATTRIBUTE->>"$.email" AS 'Email',
    ->    ATTRIBUTE->>"$.comment" AS 'Comment'
    -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    -> WHERE USER='mary' AND HOST='localhost'\G
*************************** 1. row ***************************
      USER: mary
      HOST: localhost
First Name: Mary
 Last Name: Smith
     Email: mary.smith@example.com
   Comment: This is Mary Smith's account
1 row in set (0.00 sec)

有关更多信息和示例,请参见第 15.7.1.3 节“ CREATE USER 语句”第 15.7.1.1 节“ALTER USER 语句”第 28.3.46 节“INFORMATION_SCHEMA USER_ATTRIBUTES表”。

  • 新的 optimizer_switch 标志。MySQL 8.0.21 为optimizer_switch systemvariable 添加了两个新标志,如以下列表所述:

    • prefer_ordering_index标志

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

      此标志的默认值为on

    • subquery_to_derived标志

      当此标志设置为 on 时,优化器将符合条件的标量子查询转换为派生表上的联接。例如,查询SELECT * FROM t1 WHERE t1.a > (SELECT<br /> COUNT(a) FROM t2) 被重写为SELECT t1.a FROM t1 JOIN ( SELECT COUNT(t2.a)<br /> AS c FROM t2 ) AS d WHERE t1.a > d.c.

      此优化可应用于作为HAVING WHERE 或 HAVING 子句一SELECT部分的子查询; JOIN包含一个或多个聚合函数,但没有 GROUP BY子句;不相关;并且不使用任何非确定性函数。

      优化也可以应用于表子查询,该子查询是 IN``NOT INNOT EXISTS 的参数,并且EXISTS不包含 GROUP BY。例如,查询 SELECT * FROM t1 WHERE t1.b < 0 OR<br /> t1.a IN (SELECT t2.a + 1 FROM t2) 被重写为 SELECT a, b FROM t1 LEFT JOIN (SELECT<br /> DISTINCT 1 AS e1, t2.a AS e2 FROM t2) d ON t1.a + 1 =<br /> d.e2 WHERE t1.b < 0 OR d.e1 IS NOT NULL

      从 MySQL 8.0.24 开始,此优化也可以应用于相关标量子查询,方法是对其应用额外的分组,然后在提升的谓词上进行外部连接。例如,诸如SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE<br /> t2.a=t1.a) > 0 之类的查询可以重写为SELECT t1.* FROM t1 LEFT OUTER JOIN (SELECT a,<br /> COUNT(*) AS ct FROM t2 GROUP BY a) AS derived ON t1.a =<br /> derived.a WHERE derived.a > 0。MySQL执行基数检查以确保子查询不会返回多个 row(ER_SUBQUERY_NO_1_ROW)。有关更多信息,请参见第 15.2.15.7 节“相关子查询”。

      此优化通常处于禁用状态,因为它在大多数情况下不会产生明显的性能优势;该标志默认设置为 off

    有关更多信息,请参见第 10.9.2 节 “可切换优化”。另请参见第 10.2.1.19 节“LIMIT 查询优化”第 10.2.2.1 节“使用 SemijoinTransformations 优化 IN 和 EXISTS 子查询谓词”第 10.2.2.4 节“使用合并或具体化优化派生表、视图引用和公共表表达式”。

  • XML 增强功能。从 MySQL 8.0.21 开始,LOAD XML 语句现在支持导入 XML 中的CDATA 部分。

  • 现在支持转换为 YEAR 类型。从 MySQL 8.0.22 开始,服务器允许强制转换为YEARCAST()CONVERT() 函数都支持一位数、两位数和四位数的YEAR 值。对于 1 位和 2 位值,允许的范围为 0-99。四位数字的值必须在 1901-2155 范围内。YEAR 也可以用作 JSON_VALUE() 函数的 returntype;此功能仅支持四位数年份。

    字符串、时间和日期以及浮点值都可以转换为 YEAR不支持将GEOMETRY 值强制转换为YEAR

    有关详细信息(包括转换规则),请参阅 CONVERT() 函数的说明。

  • 以 UTC 格式检索 TIMESTAMP 值。MySQL 8.0.22 及更高版本支持在检索时将TIMESTAMP 列值从系统时区转换为 UTCDATETIME,使用 CAST(value AT<br /> TIME ZONE specifier AS<br /> DATETIME)其中说明符是 [INTERVAL] '+00:00''UTC' 之一。如果需要,强制转换返回的DATETIME 值的精度最多可以指定 6 位小数。此构造不支持ARRAY 关键字。

    还支持使用时区偏移量插入表中的 TIMESTAMP 值。CONVERT() 或任何其他 MySQL 函数或构造不支持使用AT TIME ZONE

    有关更多信息和示例,请参阅 CAST() 函数的说明。

  • Dump 文件输出同步。MySQL 8.0.22 及更高版本支持通过SELECT INTO DUMPFILESELECT INTO<br /> OUTFILE 语句写入文件时进行定期同步。这可以通过将select_into_disk_sync系统变量设置为 ON来启用;写入缓冲区的大小由select_into_buffer_size 设置的值决定;默认值为 131072 (217) 字节。

    In addition, an optional delay following synchronization to disk can be set using select_into_disk_sync_delay; the default is no delay (0 milliseconds).

    For more information, see the descriptions of the variables referenced previously in this item.

  • Single preparation of statements. As of MySQL 8.0.22, a prepared statement is prepared a single time, rather than once each time it is executed. This is done when executing PREPARE. This is also true for any statement inside a stored procedure; the statement is prepared once, when the stored procedure is first executed.

    One result of this change is that the fashion in which dynamic parameters used in prepared statements are resolved is also changed in the ways listed here:

    • A prepared statement parameter is assigned a data type when the statement is prepared; the type persists for each subsequent execution of the statement (unless the statement is reprepared; see following).

      Using a different data type for a given parameter or user variable within a prepared statement for executions of the statement subsequent to the first execution may cause the statement to be reprepared; for this reason, it is advisable to use the same data type for a given parameter when re-executing a prepared statement.

    • ``

    • ``

  • 字符集:特定于语言的排序规则。以前,当多种语言具有完全相同的排序规则定义时,MySQL 仅对其中一种语言实施排序规则,这意味着某些语言仅由特定于其他语言的 utf8mb4 Unicode9.0 排序规则覆盖。MySQL 8.0.30(及更高版本)通过为以前仅由其他语言的特定于语言的排序规则涵盖的语言提供特定于语言的排序规则来修复此类问题。newcollations 涵盖的语言如下所示:

    • 挪威语 (尼诺斯克)

      挪威语 (Bokmål)

    • 塞尔维亚语(拉丁字符)

    • 波斯尼亚语 (拉丁字符)

    • 保加利亚语

    • 加利西亚语

    • 蒙古语(西里尔字符)

    MySQL 为刚刚列出的每种语言提供 *_as_cs*_ai_ci 排序规则。

    有关更多信息,请参阅特定于语言的排序规则

  • IF EXISTS 和 IGNORE UNKNOWN USER 选项。MySQL 8.0.30 为REVOKE 实现了两个新选项,可用于确定当找不到或无法分配语句中指定的用户、角色或权限时,语句是否会产生错误或警告。下面提供了非常基本的语法来显示这些新选项的位置:

    REVOKE [IF EXISTS] privilege_or_role 
        ON object 
        FROM user_or_role [IGNORE UNKNOWN USER]
    

    只要指定的目标用户或角色实际存在,IF EXISTS 会导致不成功的REVOKE 语句引发警告而不是错误,尽管语句中对任何角色或权限的引用都找不到。

    当找不到语句中的目标用户或 rolenamed 时,IGNORE UNKNOWN USER 会导致 anunsuccessful REVOKE 引发警告,而不是错误。

    有关更多信息和示例,请参见第 15.7.1.8 节“ REVOKE 语句”。

  • 生成的不可见主键。从 MySQL 8.0.30 开始,可以运行复制源服务器,以便将生成的不可见主键 (GIPK) 添加到创建时没有显式主键的任何InnoDB 表中。添加到此类 table 的生成键 columndefinition 等同于此处显示的内容:

    my_row_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT INVISIBLE PRIMARY KEY
    

    默认情况下,GIPK 模式未启用。要启用它,请将sql_generate_invisible_primary_key服务器系统变量设置为 ON

    生成的不可见主键通常在 SHOW CREATE TABLESHOW INDEX 等语句的输出中以及 MySQL Information Schematables (COLUMNSSTATISTICS 表)中可见。在这种情况下,您可以通过将show_gipk_in_create_table_and_information_schema设置为 OFF 来隐藏它们。

    作为这项工作的一部分,向 mysqldumpmysqlpump 添加了一个新的--skip-generated-invisible-primary-key选项,以从其输出中排除生成的 invisibleprimary key、列和列值。

    GIPK 和表之间的复制(有或没有主键)。在 MySQL 复制中,副本有效地忽略了源上sql_generate_invisible_primary_key的 anysettings,因此它对 replicatedtables 没有影响。MySQL 8.0.32 及更高版本使副本可以将生成的不可见主键添加到任何InnoDB 表中,否则,在复制时,没有主键。您可以通过调用CHANGE REPLICATION SOURCE TO ... REQUIRE_TABLE_PRIMARY_KEY_CHECK = GENERATE 在副本上。

    REQUIRE_TABLE_PRIMARY_KEY_CHECK =<br /> GENERATE 与 MySQL GroupReplication 不兼容。

    有关更多信息,请参见第 15.1.20.11 节“生成的不可见主键”。

  • 崩溃安全的 XA 事务。以前,XA 事务不能完全灵活地应对二进制日志的意外停止,如果在服务器执行XA PREPAREXA COMMITXA ROLLBACK 时发生这种情况,则无法保证服务器可以恢复到正确的状态,可能会使二进制日志具有尚未应用的额外 XA 事务,或者缺少一个或多个已应用的 XA事务。从 MySQL8.0.30 开始,这不再是一个问题,并且由于某种原因退出复制拓扑的服务器在重新加入时始终可以恢复到一致的 XA 事务状态。

    已知问题:当使用相同的 transactionXID 按顺序执行 XA 事务,并且在执行 XA COMMIT ...<br /> ONE PHASE,使用相同的 XID,在存储引擎中准备了 thistransaction 之后,可能无法再同步二进制日志和存储引擎之间的状态。

    有关更多信息,请参见第 15.3.8.3 节“对 XA 事务的限制”。

  • 使用 UNION 嵌套。从 MySQL 8.0.31 开始,带括号的查询表达式的主体可以与 UNION 组合嵌套多达 63 层。此类查询以前被拒绝并显示错误ER_NOT_SUPPORTED_YET,但现在允许。此类查询的 EXPLAIN输出如下所示:

    mysql> EXPLAIN FORMAT=TREE ( 
        ->   (SELECT a, b, c FROM t ORDER BY a LIMIT 3) ORDER BY b LIMIT 2
        -> ) ORDER BY c LIMIT 1\G
    *************************** 1. row ***************************
    EXPLAIN: -> Limit: 1 row(s)  (cost=5.55..5.55 rows=1)
        -> Sort: c, limit input to 1 row(s) per chunk  (cost=2.50 rows=0)
            -> Table scan on <result temporary>  (cost=2.50 rows=0)
                -> Temporary table  (cost=5.55..5.55 rows=1)
                    -> Limit: 2 row(s)  (cost=2.95..2.95 rows=1)
                        -> Sort: b, limit input to 2 row(s) per chunk  (cost=2.50 rows=0)
                            -> Table scan on <result temporary>  (cost=2.50 rows=0)
                                -> Temporary table  (cost=2.95..2.95 rows=1)
                                    -> Limit: 3 row(s)  (cost=0.35 rows=1)
                                        -> Sort: t.a, limit input to 3 row(s) per chunk  (cost=0.35 rows=1)
                                            -> Table scan on t  (cost=0.35 rows=1)
    
    1 row in set (0.00 sec)
    

    MySQL 在折叠带括号的查询表达式的主体时遵循 SQL 标准语义,因此较高的 outerlimit 无法覆盖内部较低的 outerlimit 。例如,(SELECT ... LIMIT 5) LIMIT 10 可以返回不超过 5 行。

    只有在 MySQLOptimizer 的解析器执行了它可以执行的任何简化或合并之后,才会施加 63 级限制。

    有关更多信息,请参见第 15.2.11 节 “带括号的查询表达式”。

  • 禁用查询重写。以前,在使用 Rewriter插件时,无论用户是谁,所有查询都会被重写。这在某些情况下可能会出现问题,例如在管理系统时,或者应用源自复制源的语句或 mysqldump 或其他 MySQL 程序创建的转储文件时。MySQL 8.0.31 通过实施新的用户权限SKIP_QUERY_REWRITE为此类问题提供了解决方案;具有此权限的用户发出的语句将被 Rewriter 忽略,并且不会重写。

    MySQL 8.0.31 还添加了一个新的服务器系统变量rewriter_enabled_for_threads_without_privilege_checks。设置为 OFF 时,PRIVILEGE_CHECKS_USERNULL 的线程(例如复制 applierthreads)发出的可重写语句不会由Rewriter 插件重写。默认值为ON,这意味着此类语句将被重写。

    有关更多信息,请参见第 7.6.4 节“重写器查询重写插件”。

  • XA 语句的复制筛选。以前,每当使用 --replicate-do-db 时,默认--replicate-ignore-db数据库都会过滤语句XA STARTXA ENDXA<br /> COMMITXA ROLLBACK,这可能会导致丢失事务。从 MySQL8.0.31 开始,无论binlog_format 的值如何,在这种情况下都不会过滤这些语句。

  • 复制筛选和权限检查。从 MySQL 8.0.31 开始,当使用复制过滤时,副本不再引发与被过滤掉的事件的权限检查或require_row_format验证相关的复制错误,从而可以过滤掉任何验证失败的事务。

    由于对过滤行的特权检查不能再导致复制停止,因此副本现在只能接受已授予给定用户访问权限的数据库部分;只要仅以基于行的格式复制对数据库的这一部分的更新,就会出现这种情况。

    从本地或云服务迁移到 HeatWave 服务时,此功能也可能有用,因为本地或云服务将表用于管理或入站复制用户无权访问的其他目的。

    有关更多信息,请参见第 19.2.5 节“服务器如何评估复制过滤规则”以及第 19.5.1.29 节“复制期间的副本错误”。

  • INTERSECT 和 EXCEPT 表运算符。MySQL 8.0.31 增加了对 SQLINTERSECTEXCEPT 表运算符的支持。其中 ab 表示查询的结果集,这些运算符的行为如下:

    • a INTERSECT<br /> b 仅包含出现在结果集ab 中的行。
    • a EXCEPT<br /> b 仅返回结果集 a同时出现在b 中的那些行。

    INTERSECT DISTINCTINTERSECT<br /> ALL``EXCEPT DISTINCTEXCEPT ALL 均受支持;DISTINCTINTERSECTEXCEPT 的默认值(这与UNION 相同)。

    有关更多信息和示例,请参阅第 15.2.8 节 “INTERSECT 子句”第 15.2.4 节 “EXCEPT 子句”。

  • 用户定义的直方图。从 MySQL 8.0.31 开始,可以将列的直方图设置为用户指定的 JSON 值。这可以使用以下 SQL 语法来完成:

    ANALYZE TABLE tbl_name 
      UPDATE HISTOGRAM ON col_name
      USING DATA 'json_data'
    

    此语句使用直方图的 JSON 表示json_data为表tbl_name 的列col_name 创建或覆盖直方图。执行 this 语句后,您可以通过查询 Information SchemaCOLUMN_STATISTICS 表来验证直方图是否已创建或更新,如下所示:

    SELECT HISTOGRAM FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
      WHERE TABLE_NAME='tbl_name' 
      AND COLUMN_NAME='col_name';
    
  • 在查询表达式的带括号的尾随块中,使用 INTO,而不管它相对于 FROM 的位置如何。

参见第 15.2.13.1 节 “SELECT ...INTO 语句“第 15.2.18 节 ”UNION 子句”。

  • FLUSH HOSTS 自 MySQL 8.0.23 起已弃用。相反,截断 Performance Schemahost_cache 表:

    TRUNCATE TABLE performance_schema.host_cache;
    

    TRUNCATE TABLE作需要表的 DROP 权限。

  • mysql_upgrade 客户端已弃用,因为它用于升级 mysql 系统架构中的系统表和其他架构中的对象的功能已移至 MySQL 服务器中。参见第 3.4 节“ MySQL 升级过程升级的内容”。

  • --no-dd-upgrade serveroption 已弃用。它被 --upgrade 选项取代,该选项提供了对数据字典和 serverupgrade 行为的更精细控制。

  • mysql_upgrade_info 文件(用于创建数据目录并用于存储 MySQL 版本号)已弃用;预计它会在 MySQL 的未来版本中删除。

  • relay_log_info_file 系统变量和 --master-info-file 选项已弃用。以前,当设置了relay_log_info_repository=FILEmaster_info_repository=FILE时,这些设置用于指定中继日志信息日志和源信息日志的名称,但这些设置已被弃用。relay日志信息日志和源信息日志的 useof 文件已被崩溃安全副本表取代,这是 MySQL 8.0 中的默认值。

  • max_length_for_sort_data系统变量现在已弃用,因为优化器更改使其过时且无效。

  • 这些用于压缩服务器连接的旧参数已弃用: --compress client命令行选项;MYSQL_OPT_COMPRESS 选项mysql_options() C API 函数;slave_compressed_protocol系统变量。有关 useinstead 的参数的信息,请参见第 6.2.8 节 “连接压缩控制”。

  • 不推荐使用 MYSQL_PWD 环境变量指定 MySQL 密码。

  • 使用 VALUES() 访问INSERT ... ON DUPLICATE KEY UPDATE 自 MySQL 8.0.20 起已弃用。请改用新行和新列的别名。

  • 因为在调用JSON_TABLE() 时在ON EMPTY 之前指定 ON ERROR 与 SQL 标准相反,所以此语法现在在 MySQL 中已被弃用。从 MySQL 8.0.20 开始,每当您尝试这样做时,服务器都会打印警告。在单个 JSON_TABLE() 调用中指定这两个子句时,请确保首先使用 ON EMPTY

  • 从未支持将具有索引前缀的列作为 table 分区键的一部分;以前,在创建、更改或升级分区表时允许这些作,但 table 的分区功能会排除这些作,并且服务器不会发出发生这种情况的警告。这种宽容的行为现在已被弃用,并且可以在将来的 MySQL 版本中删除,其中在 partitioningkey 中使用任何此类列会导致 CREATE TABLEALTER TABLE 语句被拒绝。

    从 MySQL 8.0.21 开始,每当使用索引前缀的列指定为分区键的一部分时,都会为每个此类列生成警告。每当CREATE TABLEALTER TABLE 语句被拒绝时,因为建议的 partitioningkey 中的所有列都具有索引前缀,生成的错误现在会提供拒绝的确切原因。在任一实例中,这包括通过使用空PARTITION BY KEY() 子句将分区函数中使用的列隐式定义为表主键中的列的情况。

    有关更多信息和示例,请参阅键分区不支持列索引前缀

  • InnoDB memcached 插件从 MySQL8.0.22 开始已弃用;预计在 MySQL 的未来版本中删除对它的支持。

  • temptable_use_mmap变量从 MySQL 8.0.26 开始已弃用;预计支持在 MySQL 的未来版本中删除它。

  • BINARY 运算符从 MySQL 8.0.27 开始已弃用,您应该会在 MySQL 的未来版本中将其删除。现在,使用BINARY 会导致警告。使用CAST(... AS BINARY)

  • default_authentication_plugin变量从 MySQL 8.0.27 开始已弃用;预计支持在 MySQL 的未来版本中删除它。

    default_authentication_plugin变量在 MySQL 8.0.27 中仍在使用,但与新的authentication_policy 系统变量结合使用,其优先级低于 MySQL 8.0.27 中引入的具有多重身份验证功能的新 系统变量。有关详细信息,请参阅默认身份验证插件

  • MySQL 测试套件使用的 --abort-slave-event-count--disconnect-slave-event-count服务器选项,通常不用于生产,从 MySQL8.0.29 开始弃用;预计在 MySQL 的未来版本中将删除这两个选项。

  • myisam_repair_threads系统变量和 myisamchk--parallel-recover 选项从 MySQL 8.0.29 开始已弃用;预计在 MySQL 的未来版本中将删除对两者的支持。

    从 MySQL 8.0.29 开始,myisam_repair_threads的 1(默认值)以外的值会产生警告。

  • 以前,MySQL 接受包含任意数量的(任意)分隔符字符的DATETIMEDATETIMETIMESTAMP 文字,以及在日期和时间部分之前、之后和之间具有任意数量的空白字符的 DATETIMETIMESTAMP 文字。从 MySQL 8.0.29 开始,每当 Literal 值包含以下任何内容时,服务器都会发出弃用警告:

    • 一个或多个非标准分隔符
    • 过多的分隔符
    • 空格字符以外的空格 (' ',0x20
    • 多余的空格字符

    每个时间值都会发出一个弃用警告,即使它存在多个问题。此警告在严格模式下不会提升为错误,因此当严格模式生效时,执行此类值的INSERT 仍然会成功。

    您应该期望在 MySQL 的未来版本中删除非标准行为,并立即采取措施确保您的应用程序不依赖于它。

    有关更多信息和示例,请参阅 Date and Time Context 中的 String and Numeric Literals

  • replica_parallel_type系统变量及其关联的服务器选项--replica-parallel-type 自 MySQL 8.0.29 起已弃用。从此版本开始,读取或设置此值会引发弃用警告;预计它会在 MySQL 的未来版本中删除。

  • 从 MySQL 8.0.30 开始,将replica_parallel_workers系统变量(或等效的服务器选项)设置为 0 已弃用,并会引发警告。如果希望 replica 使用单线程,请改用replica_parallel_workers=1,这将产生相同的结果,但没有警告。

  • 从 MySQL 8.0.30 开始,--skip-host-cache server选项已弃用;预计在未来的 MySQL 版本中会将其删除。请改用host_cache_size systemvariable。

  • 这些区域有:--old-style-user-limits选项,旨在向后兼容非常旧的(5.0.3 之前)版本,从 MySQL 8.0.30 开始已弃用;现在,使用它会引发警告。您应该期望在 MySQL 的未来版本中删除此选项。

  • innodb_log_files_in_groupinnodb_log_file_size变量自 MySQL 8.0.30 起已弃用。这些变量被innodb_redo_log_capacity变量取代。有关更多信息,请参见第 17.6.5 节 “重做日志”。

  • 从 MySQL 8.0.32 开始,不推荐使用“FULL”作为带引号的标识符,因为它是 SQL 标准中的保留关键字。这意味着 CREATE TABLE full (c1 INT, c2<br /> INT) 等语句现在会引发 warning(ER_WARN_DEPRECATED_IDENT)。为防止这种情况发生,请更改名称,或者如此处所示,将其括在反引号 (```) 中:

    CREATE TABLE `full` (c1 INT, c2 INT);
    

    有关详细信息,请参见第 11.3 节 “关键字和保留字”。

  • 从 MySQL 8.0.32 开始,不推荐使用美元符号($) 作为 anunquoted 标识符的前导字符,并会产生警告。此类用法可能会在 MySQL 的未来版本中删除。这包括用作数据库、表、视图、列或存储程序名称的标识符,以及其中任何一个的别名。美元符号仍可用作带引号的标识符的第一个字符。有关更多信息,请参见第 11.2 节 “架构对象名称”。

  • binlog_format serversystem 变量自 MySQL 8.0.34 起已弃用,并可能在未来版本中删除。更改二进制日志记录格式也被弃用,预计删除binlog_format 将使基于行的二进制日志记录(MySQL 8.0 中的默认值)成为 MySQL 使用或支持的唯一二进制日志记录格式。因此,新的 MySQL 安装应仅使用基于行的二进制日志记录;使用binlog_format=STATEMENTbinlog_format=MIXED 日志记录格式的现有复制设置应迁移到基于行的格式。

    系统变量log_bin_trust_function_creatorslog_statements_unsafe_for_binlog 专门用于基于语句的日志记录和复制。因此,它们现在也被弃用,并且可以在未来版本的 MySQL 中删除。

    在 MySQL 8.0.34 及更高版本中设置或选择binlog_formatlog_bin_trust_function_creatorslog_statements_unsafe_for_binlog 的值会引发警告。

  • 从 MySQL 8.0.34 开始,mysqlpump 客户端实用程序已弃用,并在调用时产生弃用警告。该程序可能会在 MySQL 的未来版本中删除。由于 MySQL 提供了其他具有相同或附加功能来执行数据库转储和备份的方法,包括mysqldumpMySQL Shell,因此该程序现在被认为是多余的。

    相关的 lz4_decompresszlib_decompress 实用程序也从 MySQL 8.0.34 开始弃用。

  • 从 MySQL8.0.34 开始,使用不带空格字符的版本号(或注释结束)已被弃用,并会引发警告。此语句在 MySQL 8.0.34 或更高版本中引发警告,如下所示:

    mysql> CREATE TABLE t1(a INT, KEY (a)) /*!50110KEY_BLOCK_SIZE=1024*/ ENGINE=MYISAM;
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 4164
    Message: Immediately starting the version comment after the version number is
    deprecated and may change behavior in a future release. Please insert a
    white-space character after the version number.  
    1 row in set (0.00 sec)
    

    要避免此类警告,请在版本号后插入一个或多个空白字符,如下所示:

    mysql> CREATE TABLE t2(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024*/ ENGINE=MYISAM;
    Query OK, 0 rows affected (0.00 sec)
    

    另请参见第 11.7 节 “注释”。

  • 从 MySQL 8.0.34 开始,sync_relay_log_info system变量及其等效的 serverstartup 选项---sync-relay-log-info已被弃用。您应该期望在未来版本的 MySQL 中删除对此变量以及在文件中存储复制应用程序元数据的支持。建议您在此之前更新任何可能依赖它的 MySQL 应用程序。

  • binlog_transaction_dependency_tracking服务器系统变量自 MySQL 8.0.35 起已弃用,并可能在未来版本的 MySQL 中删除。引用此变量或等效的 mysqld启动选项 --binlog-transaction-dependency-tracking现在会触发警告。没有计划替换 this变量或其功能,预计稍后将在服务器内部进行。

MySQL 8.0 中删除的功能

以下项目已过时,并已在 MySQL8.0 中删除。如果显示替代方案,则应更新应用程序以使用它们。

对于使用 MySQL 8.0 中删除的功能的 MySQL 5.7 应用程序,从 MySQL 5.7 源复制到 MySQL8.0 副本时,语句可能会失败,或者可能对源和副本产生不同的影响。为避免此类问题,应修改使用 MySQL 8.0 中删除的功能的应用程序以避免这些问题,并尽可能使用替代方案。

  • 已删除 innodb_locks_unsafe_for_binlog system变量。READ COMMITTED 隔离级别提供类似的功能。

  • MySQL 8.0.0 中引入的 information_schema_stats 变量在 MySQL 8.0.3 中删除并替换为information_schema_stats_expiry

    information_schema_stats_expiry 定义缓存INFORMATION_SCHEMA TableStatistics 的过期设置。有关更多信息,请参见第 10.2.3 节 “优化 INFORMATION_SCHEMA 查询”。

  • MySQL 8.0.3 中删除了与过时的 InnoDB systemtables 相关的代码。基于 InnoDB 系统表的 INFORMATION_SCHEMA 视图已替换为数据字典表的内部系统视图。受影响的InnoDBINFORMATION_SCHEMA 视图已重命名:

    表 1.1 重命名的 InnoDB 信息架构视图

    旧名称 新名称
    INNODB_SYS_COLUMNS INNODB_COLUMNS
    INNODB_SYS_DATAFILES INNODB_DATAFILES
    INNODB_SYS_FIELDS INNODB_FIELDS
    INNODB_SYS_FOREIGN INNODB_FOREIGN
    INNODB_SYS_FOREIGN_COLS INNODB_FOREIGN_COLS
    INNODB_SYS_INDEXES INNODB_INDEXES
    INNODB_SYS_TABLES INNODB_TABLES
    INNODB_SYS_TABLESPACES INNODB_TABLESPACES
    INNODB_SYS_TABLESTATS INNODB_TABLESTATS
    INNODB_SYS_VIRTUAL INNODB_VIRTUAL

    升级到 MySQL 8.0.3 或更高版本后,更新引用以前的 InnoDBINFORMATION_SCHEMA 视图名称的任何脚本。

  • 已删除以下与账户管理相关的功能:

    • 使用 GRANT 创建 users。请改用 CREATE USER。遵循这种做法使NO_AUTO_CREATE_USER SQL mode对 GRANT语句无关紧要,因此它也被删除,并且当选项文件中 sql_mode 选项的 thisvalue 阻止 mysqld 启动时,现在会向服务器日志写入错误。

    • 使用 GRANT 修改除权限分配以外的帐户属性。这包括 authentication、SSL 和 resource-limit属性。相反,请在帐户创建时使用 CREATE USER 建立此类属性,或者之后使用ALTER USER 修改它们。

    • CREATE USERGRANTIDENTIFIED BY PASSWORD<br /> 'auth_string'。相反,将IDENTIFIED WITH<br /> auth_plugin AS<br /> 'auth_string' CREATE USERALTER USER,其中 'auth_string' 值的格式与命名插件兼容。

      此外,由于删除了 IDENTIFIED BY<br /> PASSWORD 语法,因此log_builtin_as_identified_by_password系统变量是多余的,因此已被删除。

    • PASSWORD() 函数。此外,删除 PASSWORD() 意味着SET PASSWORD ... = PASSWORD('auth_string')语法不再可用。

    • old_passwords 系统变量。

  • 查询缓存已删除。删除包括以下项目:

    • FLUSH QUERY CACHERESET QUERY CACHE

    • 这些系统变量:query_cache_limitquery_cache_limit,query_cache_min_res_unit,query_cache_size,query_cache_type,query_cache_wlock_invalidate。query_cache_min_res_unit``query_cache_size``query_cache_type``query_cache_wlock_invalidate

    • 这些状态变量:Qcache_free_blocksQcache_free_blocks,Qcache_free_memory,Qcache_hits,Qcache_inserts,Qcache_lowmem_prunes,Qcache_not_cached,Qcache_queries_in_cache,Qcache_total_blocks。Qcache_free_memory``Qcache_hits``Qcache_inserts``Qcache_lowmem_prunes``Qcache_not_cached``Qcache_queries_in_cache``Qcache_total_blocks

    • 这些线程状态:checking privileges on<br /> cached querychecking query cache<br /> for query``invalidating query cache<br /> entriessending cached result to<br /> clientstoring result in query<br /> cacheWaiting for query cache<br /> lock

    • SQL_CACHESELECT 修饰符。

    这些已弃用的查询缓存项仍已弃用,但不起作用;预计它们将在未来的 MySQL 版本中删除:

    • SQL_NO_CACHESELECT 修饰符。
    • ndb_cache_check_time systemvariable。

    have_query_cache 系统变量仍不推荐使用,并且始终具有NO 值;预计它会在 futureMySQL 版本中删除。

  • 数据字典提供有关 databaseobjects 的信息,因此服务器不再检查数据目录中的目录名称来查找数据库。因此,--ignore-db-dir 选项和ignore_db_dirs 系统变量是无关的,将被删除。

  • 已删除 DDL 日志(也称为元数据日志)。从 MySQL 8.0.3 开始,此功能由 data dictionaryinnodb_ddl_log table 处理。请参阅查看 DDL 日志

  • tx_isolationtx_read_only 系统变量已被删除。请改用 transaction_isolationtransaction_read_only

  • 已删除 sync_frm 系统变量,因为 .frm 文件已过时。

  • 已删除 secure_auth 系统变量和 --secure-auth 客户端选项。删除了 mysql_options() C API函数的 MYSQL_SECURE_AUTH 选项。

  • multi_range_count 系统变量已删除。

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

  • 已删除sql_log_bin 系统变量的全局范围。sql_log_bin只有 sessionscope,依赖 access@@GLOBAL.sql_log_bin 的应用程序需要调整。

  • metadata_locks_cache_sizemetadata_locks_hash_instances 系统变量将被删除。

  • 未使用的 date_formatdatetime_formattime_formatmax_tmp_tables 系统变量将被删除。

  • 这些已弃用的兼容性 SQL 模式已删除:DB2MAXDB``MSSQL``MYSQL323MYSQL40ORACLE``POSTGRESQL``NO_FIELD_OPTIONSNO_KEY_OPTIONSNO_TABLE_OPTIONS。它们不能再分配给 sql_mode 系统变量或用作mysqldump--compatible 选项的允许值。

    删除 MAXDB 意味着CREATE TABLEALTER TABLETIMESTAMP 数据类型被视为TIMESTAMP不再被视为 DATETIME

  • 已删除 GROUP<br /> BY 子句的已弃用的 ASCDESC 限定符。以前依赖于 GROUP BY 排序的查询可能会产生与以前的 MySQL 版本不同的结果。要生成给定的排序顺序,请提供 ORDER BY子句。

  • 已删除EXPLAIN 语句的 EXTENDEDPARTITIONS 关键字。这些关键字是不必要的,因为它们的效果始终处于启用状态。

  • 这些与加密相关的项目将被删除:

    • ENCODE()DECODE() 函数。

    • ENCRYPT() 函数。

    • DES_ENCRYPT()DES_DECRYPT() 函数、--des-key-file 选项、have_crypt 系统变量、FLUSH 语句的DES_KEY_FILE 选项以及HAVE_CRYPT CMake选项。

    代替已删除的加密函数:对于ENCRYPT()请考虑使用SHA2() 代替单向哈希。对于其他选项,请考虑改用AES_ENCRYPT()AES_DECRYPT()

  • 在 MySQL 5.7 中,多个名称下可用的几个空间函数已被弃用,以使空间函数命名空间更加一致,目标是每个空间函数名称以 ST_ 开头(如果它执行精确作),或者如果它执行基于最小边界矩形的作,则以 MBR 开头。在 MySQL8.0 中,已弃用的函数被删除,只留下相应的 ST_MBR 函数:

    • 这些函数被删除,取而代之的是MBR 名称:Contains()Disjoint()Equals()Intersects()Overlaps()Within()

    • 这些函数被删除,取而代之的是ST_名称:Area()AsBinary()AsText()AsWKB()AsWKT()Buffer()Centroid()ConvexHull()Crosses()Dimension()Distance()EndPoint()Envelope()ExteriorRing()GeomCollFromText()GeomCollFromWKB()GeomFromText()GeomFromWKB()GeometryCollectionFromText()``GeometryCollectionFromWKB()GeometryFromText()GeometryFromWKB()GeometryN()GeometryType()InteriorRingN()IsClosed()IsEmpty()IsSimple()LineFromText()LineFromWKB()LineStringFromText()LineStringFromWKB()MLineFromText()MLineFromWKB()MPointFromText()MPointFromWKB()MPolyFromText()MPolyFromWKB()MultiLineStringFromText()MultiLineStringFromWKB()MultiPointFromWKB()MultiPointFromText()``MultiPolygonFromText()``MultiPolygonFromWKB()NumGeometries()NumInteriorRings()NumPoints()PointFromText()``PointFromWKB()PointN()PolyFromText()``PolyFromWKB()PolygonFromText()PolygonFromWKB()SRID()StartPoint()Touches()X()Y()

    • 删除 GLength() 以支持ST_Length()

  • 第 14.16.4 节 “从 WKB 值创建几何值的函数” 中描述的函数以前接受 WKB 字符串或 geometry 参数。Geometry 参数不再被允许使用,并产生错误。有关从 usinggeometry 参数迁移查询的指南,请参阅该部分。

  • 解析器不再在 SQL 语句中将 \N 视为 NULL 的同义词。请改用NULL

    此更改不会影响使用 LOAD DATASELECT ... INTO OUTFILENULL继续由 \N 表示。参见第 15.2.9 节“ LOAD DATA 语句”。

  • PROCEDURE ANALYSE() 语法已删除。

  • 客户端 --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选项。(server-side--ssl 选项仍然可用,但从 MySQL 8.0.26 开始已弃用,并可能在未来的 MySQL 版本中删除。

    对于 C mysql_options()MYSQL_OPT_SSL_ENFORCEMYSQL_OPT_SSL_VERIFY_SERVER_CERT 选项对应于客户端 --ssl--ssl-verify-server-cert 选项,并被删除。请改用 MYSQL_OPT_SSL_MODE 和 anoption 值为 SSL_MODE_REQUIREDSSL_MODE_VERIFY_IDENTITY

  • 删除了 --temp-pool 服务器选项。

  • ignore_builtin_innodb 系统变量将被删除。

  • 服务器不再执行包含特殊字符的 MySQL 5.1 之前的数据库名称到 5.1 格式的转换,并添加了 #mysql50# 前缀。由于不再执行这些转换,因此将删除mysqlcheck--fix-db-names--fix-table-names 选项、ALTER DATABASE 语句的 UPGRADE DATA<br /> DIRECTORY NAME 子句以及 Com_alter_db_upgrade 状态变量。

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

  • mysql_install_db 程序已从 MySQL 发行版中删除。数据目录初始化应该通过使用 --initialize--initialize-insecure 选项调用mysqld 来执行。此外,删除了mysql_install_db 使用的 mysqld--bootstrap选项,并删除了控制mysql_install_db 安装位置的INSTALL_SCRIPTDIR CMake选项。

  • 通用分区处理程序已从 MySQLserver 中删除。为了支持给定表的分区,用于该表的存储引擎现在必须提供其own(“本机”)分区处理程序。从 MySQL 服务器中删除了--partition--skip-partition选项,并且与分区相关的条目不再显示在SHOW PLUGINS的输出或信息架构PLUGINS表中。

    目前有两个 MySQL 存储引擎提供本机分区支持:InnoDBNDB。其中,MySQL8.0 仅支持InnoDB。使用任何其他存储引擎在 MySQL 8.0 中创建分区表的任何尝试都会失败。

    升级的后果。不支持使用 InnoDB 以外的存储引擎(如MyISAM将分区表从 MySQL5.7(或更早版本)直接升级到 MySQL 8.0。处理 sucha table 有两种选择:

    在将服务器升级到 MySQL8.0 之前,必须为每个分区的非 InnoDBtable 执行刚才列出的两个作中的至少一个。否则,升级后无法使用此类表。

    由于使用不支持分区的存储引擎生成分区表的表创建语句现在失败并显示错误(ER_CHECK_NOT_IMPLEMENTED),因此您必须确保您希望导入到创建分区表的 MySQL8.0 服务器的旧版本的转储文件(例如由 mysqldump 编写的)中的任何语句也不指定存储引擎,例如MyISAM没有原生 partitioningHandler 的 PartitioningHandler 的 PartitioningHandler 中。您可以通过执行以下任一作来执行此作:

    • 从使用 STORAGE ENGINE 选项(InnoDB除外)的CREATE TABLE 语句中删除对分区的任何引用。
    • 将存储引擎指定为InnoDB ,或默认允许将InnoDB 用作 table 的存储引擎。

    有关更多信息,请参见第 26.6.2 节 “与存储引擎相关的分区限制”。

  • 系统和状态变量信息不再保留在 INFORMATION_SCHEMA 中。这些表已删除:GLOBAL_VARIABLESGLOBAL_VARIABLES,SESSION_VARIABLES,GLOBAL_STATUS,SESSION_STATUSSESSION_STATUSSESSION_VARIABLES``GLOBAL_STATUS请改用相应的 Performance Schema 表。参见第 29.12.14 节“性能模式系统变量表”第 29.12.15 节“性能模式状态变量表”。此外,还删除了 show_compatibility_56系统变量。它用于过渡期,在此期间INFORMATION_SCHEMA表中的系统和状态变量信息被移动到性能架构表,并且不再需要。删除了这些状态变量:Slave_heartbeat_periodSlave_heartbeat_period,Slave_last_heartbeat,Slave_received_heartbeats,Slave_retried_transactions,Slave_runningSlave_runningSlave_last_heartbeat``Slave_received_heartbeats``Slave_retried_transactions他们提供的信息在 Performance Schema 表中可用;请参阅迁移到 Performance Schema System 和 Status Variable Tables

  • Performance Schema setup_timers 表已删除,performance_timers 表中的 TICK 行也被删除。

  • libmysqld 嵌入式服务器库被删除,同时:

    • mysql_options()MYSQL_OPT_GUESS_CONNECTIONMYSQL_OPT_USE_EMBEDDED_CONNECTIONMYSQL_OPT_USE_REMOTE_CONNECTIONMYSQL_SET_CLIENT_IP 选项
    • mysql_config--libmysqld-libs--embedded-libs--embedded 选项
    • CMakeWITH_EMBEDDED_SERVERWITH_EMBEDDED_SHARED_LIBRARYINSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR选项
    • (未记录的)mysql--server-arg 选项
    • mysqltest--embedded-server--server-arg--server-file 选项
    • mysqltest_embeddedmysql_client_test_embedded 测试程序
  • 已删除 mysql_plugin 实用程序。替代方案包括在服务器启动时使用 --plugin-load--plugin-load-add 选项加载插件,或在运行时使用 INSTALL PLUGIN 语句加载插件。

  • resolveip 实用程序已删除。可以改用 nslookuphostdig

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

  • 以下服务器错误代码未使用,已被删除。应更新专门测试这些错误的应用程序。

    ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE
    ER_BINLOG_ROW_RBR_TO_SBR
    ER_BINLOG_ROW_WRONG_TABLE_DEF
    ER_CANT_ACTIVATE_LOG
    ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION
    ER_CANT_CREATE_FEDERATED_TABLE
    ER_CANT_CREATE_SROUTINE
    ER_CANT_DELETE_FILE
    ER_CANT_GET_WD
    ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF
    ER_CANT_SET_WD
    ER_CANT_WRITE_LOCK_LOG_TABLE
    ER_CREATE_DB_WITH_READ_LOCK
    ER_CYCLIC_REFERENCE
    ER_DB_DROP_DELETE
    ER_DELAYED_NOT_SUPPORTED
    ER_DIFF_GROUPS_PROC
    ER_DISK_FULL
    ER_DROP_DB_WITH_READ_LOCK
    ER_DROP_USER
    ER_DUMP_NOT_IMPLEMENTED
    ER_ERROR_DURING_CHECKPOINT
    ER_ERROR_ON_CLOSE
    ER_EVENTS_DB_ERROR
    ER_EVENT_CANNOT_DELETE
    ER_EVENT_CANT_ALTER
    ER_EVENT_COMPILE_ERROR
    ER_EVENT_DATA_TOO_LONG
    ER_EVENT_DROP_FAILED
    ER_EVENT_MODIFY_QUEUE_ERROR
    ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
    ER_EVENT_OPEN_TABLE_FAILED
    ER_EVENT_STORE_FAILED
    ER_EXEC_STMT_WITH_OPEN_CURSOR
    ER_FAILED_ROUTINE_BREAK_BINLOG
    ER_FLUSH_MASTER_BINLOG_CLOSED
    ER_FORM_NOT_FOUND
    ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED
    ER_FRM_UNKNOWN_TYPE
    ER_GOT_SIGNAL
    ER_GRANT_PLUGIN_USER_EXISTS
    ER_GTID_MODE_REQUIRES_BINLOG
    ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST
    ER_HASHCHK
    ER_INDEX_REBUILD
    ER_INNODB_NO_FT_USES_PARSER
    ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR
    ER_LOAD_DATA_INVALID_COLUMN_UNUSED
    ER_LOGGING_PROHIBIT_CHANGING_OF
    ER_MALFORMED_DEFINER
    ER_MASTER_KEY_ROTATION_ERROR_BY_SE
    ER_NDB_CANT_SWITCH_BINLOG_FORMAT
    ER_NEVER_USED
    ER_NISAMCHK
    ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR
    ER_NO_FILE_MAPPING
    ER_NO_GROUP_FOR_PROC
    ER_NO_RAID_COMPILED
    ER_NO_SUCH_KEY_VALUE
    ER_NO_SUCH_PARTITION__UNUSED
    ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE
    ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED
    ER_ORDER_WITH_PROC
    ER_PARTITION_SUBPARTITION_ERROR
    ER_PARTITION_SUBPART_MIX_ERROR
    ER_PART_STATE_ERROR
    ER_PASSWD_LENGTH
    ER_QUERY_ON_MASTER
    ER_RBR_NOT_AVAILABLE
    ER_SKIPPING_LOGGED_TRANSACTION
    ER_SLAVE_CHANNEL_DELETE
    ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT
    ER_SLAVE_MUST_STOP
    ER_SLAVE_WAS_NOT_RUNNING
    ER_SLAVE_WAS_RUNNING
    ER_SP_GOTO_IN_HNDLR
    ER_SP_PROC_TABLE_CORRUPT
    ER_SQL_MODE_NO_EFFECT
    ER_SR_INVALID_CREATION_CTX
    ER_TABLE_NEEDS_UPG_PART
    ER_TOO_MUCH_AUTO_TIMESTAMP_COLS
    ER_UNEXPECTED_EOF
    ER_UNION_TABLES_IN_DIFFERENT_DIR
    ER_UNSUPPORTED_BY_REPLICATION_THREAD
    ER_UNUSED1
    ER_UNUSED2
    ER_UNUSED3
    ER_UNUSED4
    ER_UNUSED5
    ER_UNUSED6
    ER_VIEW_SELECT_DERIVED_UNUSED
    ER_WRONG_MAGIC
    ER_WSAS_FAILED
    
  • 已弃用的 INFORMATION_SCHEMA``INNODB_LOCKSINNODB_LOCK_WAITS 表将被删除。请改用 Performance Schemadata_locksdata_lock_waits 表。

    注意

    在 MySQL 5.7 中,INNODB_LOCKS 表中的 LOCK_TABLE 列和sys 架构innodb_lock_waitsx$innodb_lock_waits 视图中的locked_table 列包含组合的架构/表名称值。在 MySQL 8.0 中,data_locks 表和sys schema 视图包含单独的 schema name 和 table name 列。参见第 30.4.3.9 节“innodb_lock_waits 和 x$innodb_lock_waits 视图”。

  • InnoDB 不再支持 compressedtemporary table。当innodb_strict_mode isenabled(默认值)时,如果指定了ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZECREATE TEMPORARY TABLE 将返回错误。如果innodb_strict_mode isdisabled,则会发出警告,并使用非压缩行格式创建临时表。

  • 在 MySQL 数据目录之外创建表空间数据文件时,InnoDB 不再创建 .isl 文件(InnoDB符号链接文件)。innodb_directories 选项现在支持查找在数据目录之外创建的表空间文件。

    通过此更改,不再支持在服务器脱机时通过手动修改 .isl 文件来移动远程表空间。innodb_directories 选项现在支持移动远程表空间文件。参见第 17.6.3.6 节“在服务器脱机时移动 Tablespace 文件”。

  • 删除了以下 InnoDB 文件格式变量:

    • innodb_file_format

    • innodb_file_format_check

    • innodb_file_format_max

    • innodb_large_prefix

    文件格式变量对于在 MySQL 5.1 中创建与早期版本的InnoDB 兼容的表是必需的。现在 MySQL 5.1 已结束其产品生命周期,不再需要这些选项。

    FILE_FORMAT 列已从 INNODB_TABLESINNODB_TABLESPACES InformationSchema 表中删除。

  • 删除了 innodb_support_xa 系统变量,该变量允许在 XAtransactions 中支持两阶段提交。InnoDB 对 XA 事务中的两阶段提交的支持始终处于启用状态。

  • 已删除对 DTrace 的支持。

  • 已删除 JSON_APPEND() 函数。请改用 JSON_ARRAY_APPEND()

  • 在 MySQL8.0.13 中删除了对在共享InnoDB 表空间中放置表分区的支持。共享表空间包括InnoDB 系统表空间和通用表空间。有关识别共享表空间中的分区并将其移动到 file-per-tabletable 空间的信息,请参阅第 3.6 节 “准备升级安装”。

  • MySQL 8.0.13 中已弃用对在SET以外的语句中设置用户变量的支持。此功能可在 MySQL 8.4 中删除。

  • ---ndb perror 选项已删除。请改用 ndb_perror 实用程序。

  • 已删除 innodb_undo_logs 变量。innodb_rollback_segments变量执行相同的功能,应改用。

  • 已删除 Innodb_available_undo_logs status变量。可以使用 SHOW<br /> VARIABLES LIKE 'innodb_rollback_segments'; 检索每个表空间的可用 rollbacksegments 数;

  • 从 MySQL 8.0.14 开始,以前弃用的innodb_undo_tablespaces变量不再可配置。有关更多信息,请参见第 17.6.3.4 节 “撤消 Tablespaces”。

  • 支持 ALTER TABLE ... UPGRADE<br /> PARTITIONING 语句。

  • 从 MySQL 8.0.16 开始,已删除对internal_tmp_disk_storage_engine系统变量的支持;internal 临时 table现在始终使用InnoDB 存储引擎。有关更多信息,请参阅Storage Engine for On-Disk Internal Temporary Tables

  • DISABLE_SHAREDCMake 选项未使用,已被删除。

  • myisam_repair_threads系统变量从 MySQL 8.0.30 开始被删除。

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

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

MySQL 8.0 中引入的选项和变量

MySQL 8.0 中添加了以下系统变量、状态变量和 serveroptions。

  • Acl_cache_items_count:缓存的权限对象数。MySQL 8.0.0 新增。
  • Audit_log_current_size:审计日志文件当前大小。在 MySQL 8.0.11 中添加。
  • Audit_log_event_max_drop_size:最大已丢弃的审核事件的大小。在 MySQL 8.0.11 中添加。
  • Audit_log_events:已处理的审计事件数。在 MySQL 8.0.11 中添加。
  • Audit_log_events_filtered:已过滤的审计事件数。在 MySQL 8.0.11 中添加。
  • Audit_log_events_lost:已删除的已审核事件数。在 MySQL 8.0.11 中添加。
  • Audit_log_events_written:写入的审计事件数。在 MySQL 8.0.11 中添加。
  • Audit_log_total_size:书面审计事件的总大小。在 MySQL8.0.11 中添加。
  • Audit_log_write_waits:延迟写审计事件数。在 MySQL 8.0.11 中添加。
  • Authentication_ldap_sasl_supported_methods:SASL LDAP 身份验证支持的身份验证方法。在 MySQL 8.0.21 中添加。
  • Caching_sha2_password_rsa_public_key:caching_sha2_password 身份验证插件 RSA 公钥值。在 MySQL 8.0.4 中添加。
  • Com_alter_resource_group:ALTER RESOURCE GROUP的次数。在 MySQL8.0.3 中添加。
  • Com_alter_user_default_role:ALTER USER 的计数 ...DEFAULT ROLE 语句。MySQL 8.0.0 新增。
  • Com_change_replication_source:CHANGE REPLICATION SOURCE TO 和 CHANGE MASTER TO 语句的计数。MySQL 8.0.23 新增。
  • Com_clone:CLONE 语句数。在 MySQL 8.0.2 中添加。
  • Com_create_resource_group:CREATE RESOURCE GROUP 语句的次数。在 MySQL8.0.3 中添加。
  • Com_create_role:CREATE ROLE 语句的次数。MySQL 8.0.0 新增。
  • Com_drop_resource_group:DROP RESOURCE GROUP 语句数。MySQL 8.0.3 新增。
  • Com_drop_role:DROP ROLE 语句的计数。MySQL 8.0.0 新增。
  • Com_grant_roles:GRANT ROLE 语句数。MySQL 8.0.0 新增。
  • Com_install_component:INSTALL COMPONENT 语句数。MySQL 8.0.0 新增。
  • Com_replica_start:START REPLICA 和 START SLAVE 语句的计数。MySQL 8.0.22 中新增。
  • Com_replica_stop:STOP REPLICA 和 STOP SLAVE 语句的计数。MySQL 8.0.22 中新增。
  • Com_restart:RESTART 语句数。在 MySQL 8.0.4 中添加。
  • Com_revoke_roles:REVOKE ROLES 语句的计数。MySQL 8.0.0 新增。
  • Com_set_resource_group:SET RESOURCE GROUP 语句的计数。MySQL 8.0.3 新增。
  • Com_set_role:SET ROLE 语句的计数。MySQL 8.0.0 新增。
  • Com_show_replica_status:SHOW REPLICA STATUS 和 SHOW SLAVE STATUS 语句的计数。在 MySQL 8.0.22 中添加。
  • Com_show_replicas:SHOW REPLICAS 和 SHOW SLAVE HOSTS 语句的计数。在 MySQL 8.0.22 中添加。
  • Com_uninstall_component:UINSTALL COMPONENT 语句数。MySQL 8.0.0 新增。
  • Compression_algorithm:当前连接的压缩算法。在 MySQL8.0.18 中添加。
  • Compression_level:当前连接的压缩级别。在 MySQL8.0.18 中添加。
  • Connection_control_delay_generated:服务器延迟连接请求多少次。MySQL 8.0.1 新增。
  • Current_tls_ca:ssl_ca系统变量的当前值。在 MySQL8.0.16 中添加。
  • Current_tls_capath:ssl_capath系统变量的当前值。在 MySQL8.0.16 中添加。
  • Current_tls_cert:ssl_cert 系统变量的当前值。在 MySQL8.0.16 中添加。
  • Current_tls_cipher:ssl_cipher系统变量的当前值。在 MySQL8.0.16 中添加。
  • Current_tls_ciphersuites:tsl_ciphersuites系统变量的当前值。新增于 MySQL 8.0.16。
  • Current_tls_crl:ssl_crl系统变量的当前值。在 MySQL8.0.16 中添加。
  • Current_tls_crlpath:ssl_crlpath 系统变量的当前值。在 MySQL8.0.16 中添加。
  • Current_tls_key:ssl_key 系统变量的当前值。在 MySQL8.0.16 中添加。
  • Current_tls_version:tls_version系统变量的当前值。在 MySQL8.0.16 中添加。
  • Error_log_buffered_bytes:error_log表中使用的字节数。在 MySQL8.0.22 中添加。
  • Error_log_buffered_events:表中的事件数error_log在 MySQL 8.0.22 中添加。
  • Error_log_expired_events:error_log表中丢弃的事件数。MySQL 8.0.22 中新增。
  • Error_log_latest_write:上次写入 error_log 表的时间。在 MySQL 8.0.22 中添加。
  • Firewall_access_denied:MySQL Enterprise Firewall 拒绝的语句数。MySQL 8.0.11 新增。
  • Firewall_access_granted:MySQL Enterprise Firewall 接受的语句数。MySQL 8.0.11 中的新增内容。
  • Firewall_cached_entries:MySQL Enterprise Firewall 记录的语句数。MySQL 8.0.11 新增。
  • Global_connection_memory:所有用户线程当前使用的内存量。新增于 MySQL 8.0.28。
  • Innodb_buffer_pool_resize_status_code:InnoDB 缓冲池大小调整状态码。在 MySQL 8.0.31 中添加。
  • Innodb_buffer_pool_resize_status_progress:InnoDB 缓冲池大小调整状态进度。在 MySQL8.0.31 中添加。
  • Innodb_redo_log_capacity_resized:在上次完成容量调整大小作后重做日志容量。在 MySQL 8.0.30 中添加。
  • Innodb_redo_log_checkpoint_lsn:重做日志检查点 LSN。在 MySQL 8.0.30 中添加。
  • Innodb_redo_log_current_lsn:重做日志当前 LSN。在 MySQL 8.0.30 中添加。
  • Innodb_redo_log_enabled:InnoDB 重做日志状态。在 MySQL 8.0.21 中添加。
  • Innodb_redo_log_flushed_to_disk_lsn:红日志 flush 到磁盘 LSN。在 MySQL 8.0.30 中添加。
  • Innodb_redo_log_logical_size:重做日志的逻辑大小。在 MySQL 8.0.30 中添加。
  • Innodb_redo_log_physical_size:重做日志物理大小。在 MySQL 8.0.30 中添加。
  • Innodb_redo_log_read_only:重做日志是否为只读。在 MySQL 8.0.30 中添加。
  • Innodb_redo_log_resize_status:重做日志的 resize 调整状态。在 MySQL 8.0.30 中添加。
  • Innodb_redo_log_uuid:重做日志 UUID。在 MySQL 8.0.30 中添加。
  • Innodb_system_rows_deleted:从 system schema 表中删除的行数。MySQL 8.0.19 中新增。
  • Innodb_system_rows_inserted:插入系统 Schema 表的行数。MySQL 8.0.19 中新增。
  • Innodb_system_rows_read:从 System Schema 表中读取的行数。在 MySQL8.0.19 中添加。
  • Innodb_system_rows_updated:系统结构表更新的行数。在 MySQL8.0.19 中添加。
  • Innodb_undo_tablespaces_active:活动撤消表空间的数量。在 MySQL 8.0.14 中添加。
  • Innodb_undo_tablespaces_explicit:用户创建的 undo 表空间数。在 MySQL8.0.14 中添加。
  • Innodb_undo_tablespaces_implicit:InnoDB 创建的撤消表空间数。在 MySQL8.0.14 中添加。
  • Innodb_undo_tablespaces_total:撤消表空间总数。在 MySQL 8.0.14 中添加。
  • Mysqlx_bytes_received_compressed_payload:作为压缩消息负载接收的字节数,在解压缩前测量。MySQL 8.0.19 中添加。
  • Mysqlx_bytes_received_uncompressed_frame:解压缩后作为压缩消息负载接收的字节数。MySQL 8.0.19 中添加。
  • Mysqlx_bytes_sent_compressed_payload:作为压缩消息 payload 发送的字节数,压缩后测量。MySQL 8.0.19 中添加。
  • Mysqlx_bytes_sent_uncompressed_frame:作为压缩消息负载发送的字节数,压缩前测量。MySQL 8.0.19 中添加。
  • Mysqlx_compression_algorithm:本次会话的 X 协议连接正在使用的压缩算法。在 MySQL 8.0.20 中添加。
  • Mysqlx_compression_level:此会话的 X 协议连接使用的压缩级别。在 MySQL 8.0.20 中添加。
  • Replica_open_temp_tables:复制 SQL 线程当前打开的临时表数。在 MySQL 8.0.26 中添加。
  • Replica_rows_last_search_algorithm_used:此副本最近使用的搜索算法,用于查找基于行的复制(索引、表或哈希扫描)的行。在 MySQL 8.0.26 中添加。
  • Resource_group_supported:服务器是否支持资源组功能。新增于 MySQL 8.0.31。
  • Rpl_semi_sync_replica_status:半同步复制是否在副本上运行。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_clients:半同步副本数。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_net_avg_wait_time:源等待副本回复的平均时间。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_net_wait_time:源等待副本回复的总时间。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_net_waits:源等待副本回复的总次数。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_no_times:源关闭半同步复制的次数。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_no_tx:未成功确认的提交数。MySQL 8.0.26 中新增。
  • Rpl_semi_sync_source_status:半同步复制是否在源上运行。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_timefunc_failures:调用 time 函数时 source 失败的次数。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_tx_avg_wait_time:每个事务的平均源等待时间。MySQL 8.0.26 中新增。
  • Rpl_semi_sync_source_tx_wait_time:源等待事务的总时间。在 MySQL8.0.26 中添加。
  • Rpl_semi_sync_source_tx_waits:源等待事务的总次数。MySQL 8.0.26 中新增。
  • Rpl_semi_sync_source_wait_pos_backtraverse:源等待 binarycoordinates 低于之前等待的事件的事件的总次数。MySQL 8.0.26 中新增。
  • Rpl_semi_sync_source_wait_sessions:当前等待副本回复的会话数。在 MySQL 8.0.26 中添加。
  • Rpl_semi_sync_source_yes_tx:成功确认的提交数。在 MySQL8.0.26 中添加。
  • Secondary_engine_execution_count:卸载到辅助引擎的查询数。MySQL 8.0.13 中新增。
  • Ssl_session_cache_timeout:缓存中的当前 SSL 会话超时值。在 MySQL8.0.29 中添加。
  • Telemetry_traces_supported:是否支持服务器遥测链路。在 MySQL8.0.33 中添加。
  • Tls_library_version:正在使用的 OpenSSL 库的运行时版本。在 MySQL8.0.30 中添加。
  • activate_all_roles_on_login:是否在连接时激活所有用户角色。MySQL 8.0.2 新增。
  • admin-ssl:开启连接加密。在 MySQL 8.0.21 中添加。
  • admin_address:administrativeinterface 上的连接要绑定到的 IP 地址。在 MySQL 8.0.14 中添加。
  • admin_port:用于 administrativeinterface 上的连接的 TCP/IP 号。在 MySQL 8.0.14 中添加。
  • admin_ssl_ca:包含受信任的 SSL CertificateAuthority 列表的文件。在 MySQL 8.0.21 中添加。
  • admin_ssl_capath:D包含受信任的 SSL 证书颁发机构证书文件的文件。在 MySQL 8.0.21 中添加。
  • admin_ssl_cert:包含 X.509 证书的文件。在 MySQL 8.0.21 中添加。
  • admin_ssl_cipher😛 连接加密的允许密码。在 MySQL8.0.21 中添加。
  • admin_ssl_crl:包含证书吊销列表的文件。MySQL 8.0.21 新增。
  • admin_ssl_crlpath:D包含证书吊销列表文件的编辑器。在 MySQL 8.0.21 中添加。
  • admin_ssl_key:包含 X.509 密钥的文件。在 MySQL 8.0.21 中添加。
  • admin_tls_ciphersuites:P允许的 TLSv1.3 密码套件,用于加密连接。在 MySQL 8.0.21 中添加。
  • admin_tls_version:P允许的加密连接的 TLS 协议。MySQL 8.0.21 新增。
  • audit-log:是否激活审计日志插件。在 MySQL 8.0.11 中添加。
  • audit_log_buffer_size:审计日志缓冲区的大小。在 MySQL 8.0.11 中添加。
  • audit_log_compression:审计日志文件压缩方法。在 MySQL 8.0.11 中添加。
  • audit_log_connection_policy:连接相关事件的审核日志记录策略。MySQL 8.0.11 新增。
  • audit_log_current_session:是否审计当前会话。在 MySQL 8.0.11 中添加。
  • audit_log_database:存储审计表的 schema。在 MySQL 8.0.33 中添加。
  • audit_log_disable:是否关闭审计日志。在 MySQL 8.0.28 中添加。
  • audit_log_encryption:审计日志文件加密方法。在 MySQL 8.0.11 中添加。
  • audit_log_exclude_accounts:账目不予审计。在 MySQL 8.0.11 中添加。
  • audit_log_file:审计日志文件的名称。在 MySQL 8.0.11 中添加。
  • audit_log_filter_id:当前审计日志过滤器的 ID。在 MySQL 8.0.11 中添加。
  • audit_log_flush:关闭并重新打开审计日志文件。在 MySQL 8.0.11 中添加。
  • audit_log_flush_interval_seconds:是否对内存缓存进行重复 flush。在 MySQL 8.0.34 中添加。
  • audit_log_format:审计日志文件格式。在 MySQL 8.0.11 中添加。
  • audit_log_format_unix_timestamp:JSON 格式审计日志是否包含 Unix 时间戳。在 MySQL 8.0.26 中添加。
  • audit_log_include_accounts:要审计的账户。在 MySQL 8.0.11 中添加。
  • audit_log_max_size:JSON 审计日志文件组合大小限制。在 MySQL8.0.26 中添加。
  • audit_log_password_history_keep_days:保留存档的审计日志加密密码的天数。在 MySQL 8.0.17 中添加。
  • audit_log_policy:审计日志记录策略。在 MySQL 8.0.11 中添加。
  • audit_log_prune_seconds:审计日志文件被修剪的秒数。在 MySQL 8.0.24 中添加。
  • audit_log_read_buffer_size:审计日志文件读取缓冲区大小。在 MySQL 8.0.11 中添加。
  • audit_log_rotate_on_size:关闭并重新打开此大小的审核日志文件。在 MySQL8.0.11 中添加。
  • audit_log_statement_policy:语句相关事件的审计日志记录策略。MySQL 8.0.11 新增。
  • audit_log_strategy:审计日志记录策略。在 MySQL 8.0.11 中添加。
  • authentication_fido_rp_id:FIDO 多重身份验证的信赖方 ID。MySQL 8.0.27 新增。
  • authentication_kerberos_service_key_tab:包含 Kerberos 服务密钥的文件,用于对 TGSticket 进行身份验证。在 MySQL 8.0.26 中添加。
  • authentication_kerberos_service_principal:Kerberos 服务主体名称。在 MySQL 8.0.26 中添加。
  • authentication_ldap_sasl_auth_method_name:鉴权方法名称。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_bind_base_dn:LDAP 服务器基本可分辨名称。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_bind_root_dn:LDAP 服务器根可分辨名称。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_bind_root_pwd:LDAP 服务器 root 绑定密码。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_ca_path:LDAP 服务器证书颁发机构文件名。在 MySQL8.0.11 中添加。
  • authentication_ldap_sasl_group_search_attr:LDAP 服务器组搜索属性。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_group_search_filter:LDAP 自定义组搜索过滤器。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_init_pool_size:LDAP 服务器初始连接池大小。在 MySQL8.0.11 中添加。
  • authentication_ldap_sasl_log_status:LDAP 服务器日志级别。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_max_pool_size:LDAP 服务器最大连接池大小。在 MySQL8.0.11 中添加。
  • authentication_ldap_sasl_referral:是否开启 LDAP 搜索引用。在 MySQL 8.0.20 中添加。
  • authentication_ldap_sasl_server_host:LDAP 服务器主机名或 IP 地址。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_server_port:LDAP 服务器端口号。在 MySQL 8.0.11 中添加。
  • authentication_ldap_sasl_tls:是否使用加密连接到 LDAP 服务器。MySQL 8.0.11 新增。
  • authentication_ldap_sasl_user_search_attr:LDAP 服务器用户搜索属性。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_auth_method_name:鉴权方法名称。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_bind_base_dn:LDAP 服务器基本专有名称。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_bind_root_dn:LDAP 服务器根可分辨名称。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_bind_root_pwd:LDAP 服务器 root 绑定密码。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_ca_path:LDAP 服务器证书颁发机构文件名。在 MySQL8.0.11 中添加。
  • authentication_ldap_simple_group_search_attr:LDAP 服务器组搜索属性。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_group_search_filter:LDAP 自定义组搜索过滤器。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_init_pool_size:LDAP 服务器初始连接池大小。在 MySQL8.0.11 中添加。
  • authentication_ldap_simple_log_status:LDAP 服务器日志级别。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_max_pool_size:LDAP 服务器最大连接池大小。在 MySQL8.0.11 中添加。
  • authentication_ldap_simple_referral:是否开启 LDAP 搜索引用。在 MySQL 8.0.20 中添加。
  • authentication_ldap_simple_server_host:LDAP 服务器主机名或 IP 地址。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_server_port:LDAP 服务器端口号。在 MySQL 8.0.11 中添加。
  • authentication_ldap_simple_tls:是否使用加密连接到 LDAP 服务器。MySQL 8.0.11 新增。
  • authentication_ldap_simple_user_search_attr:LDAP 服务器用户搜索属性。在 MySQL 8.0.11 中添加。
  • authentication_policy😛 lugins 用于多因素身份验证;有关语法,请参见文档。在 MySQL 8.0.27 中添加。
  • authentication_windows_log_level:Windows 身份验证插件日志记录级别。在 MySQL8.0.11 中添加。
  • authentication_windows_use_principal_name:是否使用 Windows 认证插件主体名称。在 MySQL 8.0.11 中添加。
  • binlog_encryption:开启此服务器上的二进制日志文件加密和中继日志文件。在 MySQL 8.0.14 中添加。
  • binlog_expire_logs_auto_purge:控制二进制日志文件的自动清除;可以通过将 bothbinlog_expire_logs_seconds 和 expire_logs_days 设置为 0 来在启用时被覆盖。MySQL 8.0.29 中新增。
  • binlog_expire_logs_seconds😛 urge 二进制日志。在 MySQL8.0.1 中新增。
  • binlog_rotate_encryption_master_key_at_startup:服务器启动时轮换二进制日志主密钥。在 MySQL8.0.14 中添加。
  • binlog_row_metadata:使用基于行的日志记录时,是将所有表相关的元数据记录到二进制日志中,还是只将最少的表相关元数据记录到二进制日志中。在 MySQL8.0.1 中新增。
  • binlog_row_value_options:为基于行的复制启用部分 JSON 更新的二进制日志记录。MySQL 8.0.3 新增。
  • binlog_transaction_compression:对二进制日志文件中的事务负载启用压缩。在 MySQL 8.0.20 中添加。
  • binlog_transaction_compression_level_zstd:二进制日志文件中事务负载的压缩级别。在 MySQL 8.0.20 中添加。
  • binlog_transaction_dependency_history_size:为查找最近更新了某行的交易而保留的行哈希数。在 MySQL 8.0.1 中添加。
  • binlog_transaction_dependency_tracking:依赖信息(提交时间戳或事务写入集)的来源,从中评估哪些事务可以由 replica 的多线程应用程序并行执行。在 MySQL 8.0.1 中添加。
  • build_id:编译时生成的唯一内部版本 ID(仅限 Linux)。在 MySQL 8.0.31 中添加。
  • caching_sha2_password_auto_generate_rsa_keys:是否自动生成 RSA 密钥对文件。在 MySQL8.0.4 中添加。
  • caching_sha2_password_digest_rounds:caching_sha2_password authentication插件的 hash 轮数。在 MySQL 8.0.24 中添加。
  • caching_sha2_password_private_key_path:SHA2 鉴权插件私钥路径名。MySQL 8.0.3 新增。
  • caching_sha2_password_public_key_path:SHA2 鉴权插件公钥路径名。MySQL 8.0.3 新增。
  • check-table-functions:在数据字典中查找表约束和其他表达式中使用的函数时如何进行,此类函数会导致错误。使用 WARN 记录警告;ABORT(default) 还会记录警告,并停止任何正在进行的升级。在 MySQL 8.0.42 中添加。
  • clone_autotune_concurrency:为远程克隆作启用线程的动态生成。在 MySQL 8.0.17 中添加。
  • clone_block_ddl:在克隆作期间启用独占备份锁。在 MySQL 8.0.27 中添加。
  • clone_buffer_size:D定义供体 MySQL 服务器实例上的中间缓冲区的大小。在 MySQL 8.0.17 中添加。
  • clone_ddl_timeout:克隆作等待备份锁定的秒数。在 MySQL 8.0.17 中添加。
  • clone_delay_after_data_drop:克隆进程开始前的延迟时间(以秒为单位)。在 MySQL 8.0.29 中添加。
  • clone_donor_timeout_after_network_failure:网络故障后允许重新启动克隆作的时间。在 MySQL 8.0.24 中添加。
  • clone_enable_compression:在克隆过程中启用网络层数据压缩。在 MySQL 8.0.17 中添加。
  • clone_max_concurrency:用于执行克隆作的最大并发线程数。在 MySQL 8.0.17 中添加。
  • clone_max_data_bandwidth:远程克隆作的最大数据传输速率(以 MiB/秒为单位)。在 MySQL 8.0.17 中添加。
  • clone_max_network_bandwidth:远程克隆作的最大网络传输速率(以 MiB /秒为单位)。在 MySQL 8.0.17 中添加。
  • clone_ssl_ca:指定证书颁发机构 (CA) 文件的路径。MySQL 8.0.14 新增。
  • clone_ssl_cert:指定公钥证书文件的路径。在 MySQL8.0.14 中添加。
  • clone_ssl_key:指定私钥文件的路径。在 MySQL 8.0.14 中添加。
  • clone_valid_donor_list:D定义供体主机地址以进行远程克隆作。在 MySQL 8.0.17 中添加。
  • component_scheduler.enabled:调度器是否正在积极执行任务。新增于 MySQL 8.0.34。
  • connection_control_failed_connections_threshold:延迟发生前连续连接尝试失败。在 MySQL 8.0.1 中添加。
  • connection_control_max_connection_delay:服务器响应 failedconnection 尝试的最大延迟(毫秒)。在 MySQL 8.0.1 中添加。
  • connection_control_min_connection_delay:服务器响应 failedconnection 尝试的最小延迟(毫秒)。在 MySQL 8.0.1 中添加。
  • connection_memory_chunk_size:仅当用户内存使用量变化Global_connection_memory量或以上时,才会更新该数量;0 禁用更新。新增于 MySQL 8.0.28。
  • connection_memory_limit:在拒绝该用户的所有查询之前,任意一个 userconnection 可以消耗的最大内存量。不适用于 MySQL root 等系统用户。在 MySQL8.0.28 中添加。
  • create_admin_listener_thread:是否对管理界面上的连接使用专用的监听线程。在 MySQL 8.0.14 中添加。
  • cte_max_recursion_depth:公共表表达式最大递归深度。MySQL 8.0.3 新增。
  • ddl-rewriter:是否激活ddl_rewriter插件。在 MySQL8.0.16 中添加。
  • utf8mb4 字符集的 default_collation_for_utf8mb4😄 efault 排序规则;仅供 MySQL Replication 内部使用。在 MySQL 8.0.11 中添加。
  • default_table_encryption😄 efault 架构和表空间加密设置。新增于 MySQL 8.0.16。
  • dragnet.Status:最近一次赋值的结果 todragnet.log_error_filter_rules。在 MySQL 8.0.12 中添加。
  • dragnet.log_error_filter_rules:错误记录的过滤规则。在 MySQL 8.0.4 中添加。
  • early-plugin-load:指定在加载强制内置插件之前和存储引擎初始化之前要加载的插件。MySQL 8.0.0 新增。
  • enterprise_encryption.maximum_rsa_key_size:MySQL EnterpriseEncryption 生成的 RSA 密钥的最大大小。在 MySQL 8.0.30 中添加。
  • enterprise_encryption.rsa_support_legacy_padding:D加密并验证旧版 MySQL Enterprise Encryption 内容。在 MySQL 8.0.30 中添加。
  • explain_format😄 termines EXPLAIN 语句使用的默认输出格式。在 MySQL 8.0.32 中添加。
  • generated_random_password_length:生成密码的最大长度。在 MySQL 8.0.18 中添加。
  • global_connection_memory_limit:alluser 连接可消耗的最大内存总量。当超过 Global_connection_memory 时,来自普通用户的所有查询都将被拒绝。不适用于 MySQL root 等系统用户。在 MySQL 8.0.28 中添加。
  • global_connection_memory_tracking:是否计算全局连接内存使用量(如 Global_connection_memory 所示);default 为 disabled。在 MySQL 8.0.28 中添加。
  • group_replication_advertise_recovery_endpoints:为分布式恢复提供的连接。在 MySQL8.0.21 中添加。
  • group_replication_autorejoin_tries:该成员自动尝试重新加入群组的次数。在 MySQL 8.0.16 中添加。
  • group_replication_clone_threshold:供主和接收者之间的交易编号差距,超过该差距则使用远程克隆作进行状态转移。MySQL 8.0.17 中新增。
  • group_replication_communication_debug_options:组复制组件的调试消息级别。MySQL 8.0.3 新增。
  • group_replication_communication_max_message_size:Group Replication 通信的最大消息大小,较大的消息是碎片化的。在 MySQL 8.0.16 中添加。
  • group_replication_communication_stack:指定应该使用哪个通信栈(XCom 或 MySQL)来建立成员之间的组通信连接。在 MySQL 8.0.27 中添加。
  • group_replication_consistency:group提供的交易一致性保证类型。在 MySQL 8.0.14 中添加。
  • group_replication_exit_state_action:实例非自愿离开组时的行为。在 MySQL 8.0.12 中添加。
  • group_replication_flow_control_hold_percent😛 的组配额将保持未使用状态。在 MySQL8.0.2 中添加。
  • group_replication_flow_control_max_quota:组的最大流控配额。在 MySQL 8.0.2 中添加。
  • group_replication_flow_control_member_quota_percent:P计算配额时,成员应承担的配额分数对自己可用。在 MySQL 8.0.2 中添加。
  • group_replication_flow_control_min_quota:每个成员可分配的最低流控配额。在 MySQL 8.0.2 中添加。
  • group_replication_flow_control_min_recovery_quota:每个成员可以分配的最低配额,因为另一个组成员正在恢复。在 MySQL 8.0.2 中添加。
  • group_replication_flow_control_period:D定义在流控制迭代之间等待的秒数。在 MySQL 8.0.2 中添加。
  • group_replication_flow_control_release_percent:当流控不再需要限制 writer 成员时,应该如何释放 group quota。在 MySQL 8.0.2 中添加。
  • group_replication_ip_allowlist:允许连接到组的主机列表(MySQL 8.0.22 及更高版本)。在 MySQL 8.0.22 中添加。
  • group_replication_member_expel_timeout:怀疑 Group Member 失败到将其逐出 Group ,导致 Group 成员重新配置的时间。在 MySQL 8.0.13 中添加。
  • group_replication_member_weight:此成员当选为主要成员的几率。在 MySQL8.0.2 中添加。
  • group_replication_message_cache_size:组通信引擎消息缓存 (XCom) 的最大内存。在 MySQL 8.0.16 中添加。
  • group_replication_paxos_single_leader:在 single-primary 模式下使用单个共识 leader。MySQL 8.0.27 新增。
  • group_replication_recovery_compression_algorithms:P传出 recoveryconnections 的压缩算法。在 MySQL 8.0.18 中添加。
  • group_replication_recovery_get_public_key:是否接受从 donor 获取公钥的首选项。在 MySQL 8.0.4 中添加。
  • group_replication_recovery_public_key_path:接受公钥信息。在 MySQL 8.0.4 中添加。
  • group_replication_recovery_tls_ciphersuites:P当 TLSv1.3 用于连接加密时,此实例作为客户端(加入成员)时,将输入密码套件。MySQL 8.0.19 中添加。
  • group_replication_recovery_tls_version😛 客户端(加入成员)使用用于连接加密的 TLS 协议。MySQL 8.0.19 中添加。
  • group_replication_recovery_zstd_compression_level:使用 zstdcompression 的恢复连接的压缩级别。在 MySQL 8.0.18 中添加。
  • group_replication_tls_source:用于组复制的 TLS 资料来源。在 MySQL8.0.21 中添加。
  • group_replication_unreachable_majority_timeout:导致 inminority 离开组的网络分区等待多长时间。在 MySQL 8.0.2 中添加。
  • group_replication_view_change_uuid:视图更改事件 GTID 的 UUID。在 MySQL 8.0.26 中添加。
  • histogram_generation_max_mem_size:用于创建直方图统计信息的最大内存。MySQL 8.0.2 新增。
  • immediate_server_version:作为直接复制源的服务器的 MySQL Server 版本号。在 MySQL 8.0.14 中添加。
  • information_schema_stats_expiry:缓存表统计信息的过期时间设置。在 MySQL8.0.3 中添加。
  • init_replica:replica 连接到 source 时执行的语句。在 MySQL 8.0.26 中添加。
  • innodb-dedicated-server:启用缓冲池大小、日志文件大小和 flush 方法的自动配置。MySQL 8.0.3 新增。
  • innodb_buffer_pool_debug:P当缓冲池大小小于 1GB 时,将发送多个缓冲池实例。MySQL 8.0.0 新增。
  • innodb_buffer_pool_in_core_file:控制将缓冲池页面写入核心转储文件,在支持 MADV_DONTDUMP 的系统上默认为 OFF(从 8.4 开始)。在 MySQL 8.0.14 中添加。
  • innodb_checkpoint_disabled😄 isables 检查点,以便故意退出服务器始终启动恢复。在 MySQL 8.0.2 中添加。
  • innodb_ddl_buffer_size:DDL作的最大缓冲区大小。在 MySQL8.0.27 中添加。
  • innodb_ddl_log_crash_reset_debug😄 ebug 选项重置 DDL 日志崩溃注入计数器。MySQL 8.0.3 新增。
  • innodb_ddl_threads:创建索引的最大并行线程数。在 MySQL 8.0.27 中添加。
  • innodb_deadlock_detect:启用或禁用死锁检测。MySQL 8.0.0 新增。
  • innodb_directories:D定义要在启动时扫描表空间数据文件的目录。在 MySQL 8.0.4 中添加。
  • innodb_doublewrite_batch_size:此功能已被 innodb_doublewrite_pages 取代。在 MySQL 8.0.20 中添加。
  • innodb_doublewrite_dir😄 oublewrite buffer 文件目录下。在 MySQL 8.0.20 中添加。
  • innodb_doublewrite_files:doublewrite 文件数。在 MySQL 8.0.20 中添加。
  • innodb_doublewrite_pages:每个线程的双写页数。在 MySQL 8.0.20 中添加。
  • innodb_extend_and_initialize:控制如何在 Linux 上分配新的表空间页。MySQL 8.0.22 中新增。
  • innodb_fsync_threshold:控制 InnoDB 在创建新文件时调用 fsync 的频率。在 MySQL 8.0.13 中添加。
  • innodb_idle_flush_pct:限制 InnoDB 空闲时的 I/0作。在 MySQL8.0.18 中添加。
  • innodb_log_checkpoint_fuzzy_now😄 ebug 选项强制 InnoDB 写入模糊检查点。在 MySQL 8.0.13 中添加。
  • innodb_log_spin_cpu_abs_lwm:最小 CPU 使用率,低于该量时,用户线程在等待刷新重做时不再旋转。在 MySQL 8.0.11 中添加。
  • innodb_log_spin_cpu_pct_hwm:最大 CPU 使用率,超过该量,用户线程在等待 flush 重做时不再旋转。在 MySQL 8.0.11 中添加。
  • innodb_log_wait_for_flush_spin_hwm:最大平均日志刷新时间超过该时间后,用户线程在等待刷新重做时不再旋转。在 MySQL8.0.11 中添加。
  • innodb_log_writer_threads:开启专用的日志写入器线程,用于写入和 flushingredo 日志。在 MySQL 8.0.22 中添加。
  • innodb_parallel_read_threads:并行索引读取的线程数。在 MySQL8.0.14 中添加。
  • innodb_print_ddl_logs:是否将 DDL 日志打印到错误日志中。在 MySQL8.0.3 中添加。
  • innodb_redo_log_archive_dirs:已标记重做日志归档目录。在 MySQL 8.0.17 中添加。
  • innodb_redo_log_capacity:重做日志文件的大小限制。在 MySQL 8.0.30 中添加。
  • innodb_redo_log_encrypt:控制 encryptedtablespace 的重做日志数据的加密。在 MySQL 8.0.1 中添加。
  • innodb_scan_directories:定义在 InnoDBrecovery 期间扫描表空间文件的目录。在 MySQL 8.0.2 中添加。
  • innodb_segment_reserve_factor:保留为空页的表空间文件段页的百分比。在 MySQL 8.0.26 中添加。
  • innodb_spin_wait_pause_multiplier:用于确定 spin-wait 循环中 PAUSEinstruction 数量的乘数值。在 MySQL 8.0.16 中添加。
  • innodb_stats_include_delete_marked:计算 persistentInnoDB 统计信息时包含删除标记的记录。在 MySQL 8.0.1 中添加。
  • innodb_temp_tablespaces_dir:Session 临时 tablespaces 路径。在 MySQL 8.0.13 中添加。
  • innodb_tmpdir:D在线 ALTER TABLE作期间创建的临时表文件的创建位置。MySQL 8.0.0 新增。
  • innodb_undo_log_encrypt:控制 encryptedtablespaces 的撤消日志数据的加密。在 MySQL 8.0.1 中添加。
  • innodb_use_fdatasync:InnoDB 在将数据刷新到作系统时是否使用 fdatasync() 而不是 fsync()。在 MySQL 8.0.26 中添加。
  • innodb_validate_tablespace_paths:启动时开启表空间路径验证。在 MySQL8.0.21 中添加。
  • internal_tmp_mem_storage_engine:用于内部内存中临时表的存储引擎。在 MySQL 8.0.2 中添加。
  • keyring-migration-destination:密钥迁移目标密钥环插件。在 MySQL8.0.4 中添加。
  • keyring-migration-host:用于连接到正在运行的服务器以进行密钥迁移的主机名。在 MySQL 8.0.4 中添加。
  • keyring-migration-password😛 assword 用于连接到正在运行的服务器以进行密钥迁移。在 MySQL 8.0.4 中添加。
  • keyring-migration-port:TCP/IP 端口号,用于连接正在运行的服务器进行 keymigration。在 MySQL 8.0.4 中添加。
  • keyring-migration-socket:Unix 套接字文件或 Windows 命名管道,用于连接正在运行的服务器进行密钥迁移。在 MySQL 8.0.4 中添加。
  • keyring-migration-source:密钥迁移源密钥环插件。在 MySQL 8.0.4 中添加。
  • keyring_aws_cmk_id:AWS 密钥环插件客户主密钥 ID 值。MySQL 8.0.11 新增。
  • keyring_aws_conf_file:AWS 密钥环插件配置文件位置。在 MySQL8.0.11 中添加。
  • keyring_aws_data_file:AWS 密钥环插件存储文件位置。在 MySQL8.0.11 中添加。
  • keyring_aws_region:AWS 密钥环插件区域。在 MySQL 8.0.11 中添加。
  • keyring_encrypted_file_data:keyring_encrypted_file插件数据文件。在 MySQL8.0.11 中添加。
  • keyring_encrypted_file_password:keyring_encrypted_file插件密码。在 MySQL 8.0.11 中添加。
  • keyring_hashicorp_auth_path:HashiCorp Vault AppRole 身份验证路径。在 MySQL8.0.18 中添加。
  • keyring_hashicorp_ca_path😛 ath 添加到 CA 文件中keyring_hashicorp。在 MySQL 8.0.18 中添加。
  • keyring_hashicorp_caching:是否开启keyring_hashicorp缓存。在 MySQL8.0.18 中添加。
  • keyring_hashicorp_commit_auth_path:keyring_hashicorp_auth_path 使用中的价值。在 MySQL8.0.18 中添加。
  • keyring_hashicorp_commit_ca_path:keyring_hashicorp_ca_path 使用中的价值。在 MySQL 8.0.18 中添加。
  • keyring_hashicorp_commit_caching:keyring_hashicorp_caching 值。在 MySQL 8.0.18 中添加。
  • keyring_hashicorp_commit_role_id:keyring_hashicorp_role_id 使用中的价值。在 MySQL 8.0.18 中添加。
  • keyring_hashicorp_commit_server_url:keyring_hashicorp_server_url 值。在 MySQL8.0.18 中添加。
  • keyring_hashicorp_commit_store_path:keyring_hashicorp_store_path 使用中的价值。在 MySQL8.0.18 中添加。
  • keyring_hashicorp_role_id:HashiCorp Vault AppRole 鉴权角色 ID。在 MySQL8.0.18 中新增。
  • keyring_hashicorp_secret_id:HashiCorp Vault AppRole 鉴权密钥 ID。MySQL 8.0.18 新增。
  • keyring_hashicorp_server_url:HashiCorp Vault 服务器 URL。在 MySQL 8.0.18 中添加。
  • keyring_hashicorp_store_path:HashiCorp Vault 存储路径。在 MySQL 8.0.18 中添加。
  • keyring_oci_ca_certificate:对等体鉴权的 CA 证书文件。在 MySQL8.0.22 中添加。
  • keyring_oci_compartment:OCI 区间 OCID。在 MySQL 8.0.22 中添加。
  • keyring_oci_encryption_endpoint:OCI 加密服务器端点。在 MySQL 8.0.22 中添加。
  • keyring_oci_key_file:OCI RSA 私钥文件。在 MySQL 8.0.22 中添加。
  • keyring_oci_key_fingerprint:OCI RSA 私钥文件指纹。在 MySQL 8.0.22 中添加。
  • keyring_oci_management_endpoint:OCI 管理服务器端点。在 MySQL 8.0.22 中添加。
  • keyring_oci_master_key:OCI 主密钥 OCID。在 MySQL 8.0.22 中添加。
  • keyring_oci_user:OCI 用户 OCID。在 MySQL 8.0.22 中添加。
  • keyring_oci_vaults_endpoint:OCI 文件库服务器端点。在 MySQL 8.0.22 中添加。
  • keyring_oci_virtual_vault:OCI 文件库 OCID。在 MySQL 8.0.22 中添加。
  • keyring_okv_conf_dir:Oracle Key Vault 密钥环插件配置目录。在 MySQL 8.0.11 中添加。
  • keyring_operations:是否开启密钥环作。在 MySQL 8.0.4 中添加。
  • lock_order:运行时是否开启LOCK_ORDER工具。在 MySQL8.0.17 中添加。
  • lock_order_debug_loop:当 LOCK_ORDER 工具遇到标记为 loop 的 dependency 时,是否导致 debug assert。在 MySQL 8.0.17 中添加。
  • lock_order_debug_missing_arc:当 LOCK_ORDER 工具遇到 sundeclared 依赖时,是否导致 debug assert。在 MySQL 8.0.17 中添加。
  • lock_order_debug_missing_key:当 LOCK_ORDER 工具遇到 MySQL 8.0.17 中未正确检测的 Performance Schema.Added 对象时,是否会导致 debug assert。
  • lock_order_debug_missing_unlock:当LOCK_ORDER工具遇到仍处于长柄状态时被销毁的锁时,是否触发 debug assert。在 MySQL8.0.17 中添加。
  • lock_order_dependencies😛 文件lock_order_dependencies.txt。在 MySQL8.0.17 中添加。
  • lock_order_extra_dependencies😛 ath 复制到第二个依赖项文件。在 MySQL 8.0.17 中添加。
  • lock_order_output_directory:D工具写入日志LOCK_ORDER在 MySQL8.0.17 中添加。
  • lock_order_print_txt:是否进行锁单图分析并打印文本报告。在 MySQL 8.0.17 中添加。
  • lock_order_trace_loop:当 LOCK_ORDER 工具遇到标记为 loop 的依赖项时,是否打印日志文件跟踪。在 MySQL 8.0.17 中添加。
  • lock_order_trace_missing_arc:当 LOCK_ORDER 工具遇到未声明的依赖时,是否打印日志文件跟踪。在 MySQL 8.0.17 中添加。
  • lock_order_trace_missing_key:当LOCK_ORDER工具遇到未正确检测 PerformanceSchema 的对象时,是否打印日志文件跟踪。在 MySQL 8.0.17 中添加。
  • lock_order_trace_missing_unlock:当 LOCK_ORDER 工具遇到仍处于长存状态下被销毁的锁时,是否打印日志文件跟踪。MySQL 8.0.17 中新增。
  • log_error_filter_rules:筛选错误日志记录的规则。在 MySQL 8.0.2 中添加。
  • log_error_services:用于错误记录的组件。在 MySQL 8.0.2 中添加。
  • log_error_suppression_list:要抑制的警告/信息错误日志消息。MySQL 8.0.13 中新增。
  • log_replica_updates:replica 是否应该将 replication SQL 线程执行的更新记录到它自己的二进制日志中。在 MySQL8.0.26 中添加。
  • log_slow_extra:是否向 slow 查询日志文件写入额外信息。在 MySQL 8.0.14 中添加。
  • log_slow_replica_statements:导致 replica 执行的 slow 语句写入 slow 查询日志。在 MySQL 8.0.26 中添加。
  • mandatory_roles:自动为所有用户授予角色。在 MySQL8.0.2 中添加。
  • mysql_firewall_mode:MySQL Enterprise Firewall 是否正常运行。MySQL 8.0.11 新增。
  • mysql_firewall_trace:是否开启防火墙跟踪。在 MySQL 8.0.11 中添加。
  • mysqlx:X Plugin 是否初始化。在 MySQL 8.0.11 中添加。
  • mysqlx_compression_algorithms:X 协议连接允许使用压缩算法。MySQL 8.0.19 中添加。
  • mysqlx_deflate_default_compression_level😄 X 协议连接上 Deflate 算法的压缩级别。在 MySQL 8.0.20 中添加。
  • mysqlx_deflate_max_client_compression_level:XProtocol 连接上 Deflate 算法允许的最大压缩级别。在 MySQL 8.0.20 中添加。
  • mysqlx_interactive_timeout:等待交互式客户端超时的秒数。在 MySQL 8.0.4 中添加。
  • mysqlx_lz4_default_compression_level😄 X 协议连接上 LZ4 算法的压缩级别。在 MySQL 8.0.20 中添加。
  • mysqlx_lz4_max_client_compression_level:XProtocol 连接上 LZ4 算法允许的最大压缩级别。在 MySQL 8.0.20 中添加。
  • mysqlx_read_timeout:等待阻塞读作完成的秒数。在 MySQL 8.0.4 中添加。
  • mysqlx_wait_timeout:等待连接活动发生的秒数。在 MySQL 8.0.4 中添加。
  • mysqlx_write_timeout:等待阻塞写入作完成的秒数。在 MySQL 8.0.4 中添加。
  • mysqlx_zstd_default_compression_level😄 X 协议连接上 zstd 算法的压缩级别。在 MySQL 8.0.20 中添加。
  • mysqlx_zstd_max_client_compression_level:XProtocol 连接上 zstd 算法允许的最大压缩级别。在 MySQL 8.0.20 中添加。
  • named_pipe_full_access_group:被授予命名管道完全访问权限的 Windows 组的名称。在 MySQL 8.0.14 中添加。
  • no-dd-upgrade😛 revent 在启动时自动升级数据字典表。在 MySQL 8.0.4 中添加。
  • no-monitor😄 o 不是 RESTART 所需的 fork monitor 进程。MySQL 8.0.12 新增。
  • original_commit_timestamp:在原始源上提交事务的时间。在 MySQL 8.0.1 中添加。
  • original_server_version:最初提交事务的 Server 的 MySQL Server 版本号。在 MySQL 8.0.14 中添加。
  • partial_revokes:是否开启部分吊销。在 MySQL 8.0.16 中添加。
  • password_history:重用密码前需要修改密码的次数。MySQL 8.0.3 新增。
  • password_require_current:更改密码是否需要当前 passwordverification。在 MySQL 8.0.13 中添加。
  • password_reuse_interval:重用密码前需要经过的天数。在 MySQL 8.0.3 中添加。
  • performance-schema-consumer-events-statements-cpu:configure 语句 CPU-usage consumer。在 MySQL 8.0.28 中添加。
  • performance_schema_max_digest_sample_age:查询 resample age(秒)。MySQL 8.0.3 新增。
  • performance_schema_show_processlist:选择 SHOW PROCESSLIST 实现。在 MySQL 8.0.22 中添加。
  • persist_only_admin_x509_subject:SSL 证书 X.509 使用者,用于启用持久性限制的系统变量。在 MySQL 8.0.14 中添加。
  • persist_sensitive_variables_in_plaintext:是否允许服务器将敏感系统变量的值以未加密的格式存储。MySQL 8.0.29 中新增。
  • persisted_globals_load:是否加载持久化配置设置。MySQL 8.0.0 新增。
  • print_identified_with_as_hex:对于 SHOW CREATE USER,打印包含 unprintable字符的 hash 值(十六进制)。在 MySQL 8.0.17 中添加。
  • protocol_compression_algorithms:P传入连接的压缩算法。在 MySQL 8.0.18 中添加。
  • pseudo_replica_mode:供内部服务器使用。在 MySQL 8.0.26 中添加。
  • regexp_stack_limit:正则表达式匹配堆栈大小限制。在 MySQL8.0.4 中添加。
  • regexp_time_limit:正则表达式匹配超时。在 MySQL 8.0.4 中添加。
  • replica_checkpoint_group:调用 checkpoint作到 updateprogress 状态之前,multithreadedreplica 处理的最大事务数。NDB 群集不支持。在 MySQL8.0.26 中添加。
  • replica_checkpoint_period:在此毫秒数后,将多线程副本的进度状态和 flushrelay 日志信息更新到磁盘。NDB 群集不支持。在 MySQL 8.0.26 中添加。
  • replica_compressed_protocol:使用源/从协议压缩。在 MySQL8.0.26 中添加。
  • replica_exec_mode:允许在 IDEMPOTENTmode(抑制 key 和其他一些错误)和 STRICT 模式之间切换复制线程;STRICT 模式是默认的,但 NDB 群集除外,其中始终使用 IDEMPOTENT。在 MySQL 8.0.26 中添加。
  • replica_load_tmpdir:复制 LOAD DATA 语句时,replica 应放置其临时文件的位置。在 MySQL 8.0.26 中添加。
  • replica_max_allowed_packet:可以从复制源服务器发送到副本的数据包的最大大小(以字节为单位);overridesmax_allowed_packet。在 MySQL 8.0.26 中添加。
  • replica_net_timeout:在中止读取之前等待来自 source/replicaconnection 的更多数据的秒数。在 MySQL 8.0.26 中添加。
  • replica_parallel_type:告诉副本使用时间戳信息 (LOGICAL_CLOCK) 或数据库分区 (DATABASE) 来并行化事务。在 MySQL 8.0.26 中添加。
  • replica_parallel_workers:执行 replicationtransactions 的 applier 线程数。NDB 群集:请参阅文档。在 MySQL8.0.26 中添加。
  • replica_pending_jobs_size_max:保存尚未应用的事件的副本 worker 队列的最大大小。在 MySQL 8.0.26 中添加。
  • replica_preserve_commit_order:确保副本 worker 的所有提交都与源上的顺序相同,以便在使用 parallelapplier 线程时保持一致性。在 MySQL 8.0.26 中添加。
  • replica_skip_errors:当 query从提供的列表中返回错误时,告诉复制线程继续复制。在 MySQL 8.0.26 中添加。
  • replica_sql_verify_checksum:导致副本在从 relaylog 读取时检查校验和。在 MySQL 8.0.26 中添加。
  • replica_transaction_retries:复制 SQL 线程在事务失败时出现死锁或超时锁等待超时后,在放弃和停止之前重试事务的次数。在 MySQL 8.0.26 中添加。
  • replica_type_conversions:控制副本的类型转换模式。value 是此列表中零个或多个元素的列表:ALL_LOSSY,ALL_NON_LOSSY。设置为空字符串以禁止源和副本之间的类型转换。在 MySQL 8.0.26 中添加。
  • replication_optimize_for_static_plugin_config:用于半同步复制的共享锁。在 MySQL8.0.23 中添加。
  • replication_sender_observe_commit_only:半同步复制的有限回调。新增于 MySQL 8.0.23。
  • rpl_read_size:设置从 binarylog 文件和 relay log 文件中读取的最小数据量(以字节为单位)。在 MySQL 8.0.11 中添加。
  • rpl_semi_sync_replica_enabled:副本是否开启半同步复制。在 MySQL 8.0.26 中添加。
  • rpl_semi_sync_replica_trace_level:副本上的半同步复制调试跟踪级别。在 MySQL 8.0.26 中添加。
  • rpl_semi_sync_source_enabled:源端是否开启半同步复制。在 MySQL 8.0.26 中添加。
  • rpl_semi_sync_source_timeout:等待副本确认的毫秒数。在 MySQL 8.0.26 中添加。
  • rpl_semi_sync_source_trace_level:源上的半同步复制调试跟踪级别。在 MySQL 8.0.26 中添加。
  • rpl_semi_sync_source_wait_for_replica_count:在继续之前,源必须接收每个事务的副本确认数。在 MySQL 8.0.26 中添加。
  • rpl_semi_sync_source_wait_no_replica:没有副本时,source 是否等待超时。在 MySQL 8.0.26 中添加。
  • rpl_semi_sync_source_wait_point:副本交易回执确认的等待点。在 MySQL 8.0.26 中添加。
  • rpl_stop_replica_timeout:STOP REPLICA 超时前等待的秒数。在 MySQL 8.0.26 中添加。
  • schema_definition_cache:字典对象缓存中可以保留的 Schema 定义对象数。MySQL 8.0.0 新增。
  • secondary_engine_cost_threshold:Optimizer 将查询卸载到 secondaryengine 的成本阈值。在 MySQL 8.0.16 中添加。
  • select_into_buffer_size:用于 OUTFILE 或 DUMPFILE 导出文件的缓冲区大小;覆盖 read_buffer_size。在 MySQL 8.0.22 中添加。
  • select_into_disk_sync:刷新缓冲区后与 OUTFILE 或 DUMPFILE 导出文件后与存储设备同步数据;OFF 禁用同步,并且是默认值。在 MySQL 8.0.22 中添加。
  • select_into_disk_sync_delay:当 select_into_sync_disk = ON时,设置每次同步 OUTFILE 或 DUMPFILE export filebuffer 后的延迟时间(以毫秒为单位),否则无效。在 MySQL 8.0.22 中添加。
  • show-replica-auth-info:在此源上的 SHOW REPLICAS 中显示用户名和密码。在 MySQL 8.0.26 中添加。
  • show_create_table_skip_secondary_engine:是否从 SHOWCREATE TABLE 输出中排除 SECONDARY ENGINE 子句。在 MySQL 8.0.18 中添加。
  • show_create_table_verbosity:SHOW CREATE TABLE 中有默认值,是否显示 ROW_FORMAT。在 MySQL 8.0.11 中添加。
  • show_gipk_in_create_table_and_information_schema:生成的不可见主键是否显示在 SHOW 语句和 INFORMATION_SCHEMA 表中。在 MySQL8.0.30 中添加。
  • skip-replica-start:如果设置,则 replica server 启动时不会自动启动复制。在 MySQL 8.0.26 中添加。
  • source_verify_checksum:导致 source 在从 binarylog 读取时检查校验和。在 MySQL 8.0.26 中添加。
  • sql_generate_invisible_primary_key:是否为在此服务器上创建且没有显式 PK 的 InnoDBtables 生成不可见的主键。MySQL 8.0.30 新增。
  • sql_replica_skip_counter:副本应跳过的源中的事件数。与 GTID 复制不兼容。在 MySQL 8.0.26 中添加。
  • sql_require_primary_key:表是否必须有主键。在 MySQL 8.0.13 中添加。
  • terminology_use_previous:在更改不兼容的情况下,使用指定版本之前的术语。在 MySQL 8.0.26 中添加。
  • thread_pool_algorithm:线程池算法。在 MySQL 8.0.11 中添加。
  • thread_pool_dedicated_listeners:D在每个线程组中编辑一个侦听器线程以侦听网络事件。MySQL 8.0.23 新增。
  • thread_pool_high_priority_connection:当前会话是否为高优先级。在 MySQL8.0.11 中添加。
  • thread_pool_max_active_query_threads:每组允许的最大活动查询线程数。MySQL 8.0.19 中添加。
  • thread_pool_max_transactions_limit:thread pool作期间允许的最大事务数。MySQL 8.0.23 新增。
  • thread_pool_max_unused_threads:允许的最大未使用线程数。在 MySQL8.0.11 中添加。
  • thread_pool_prio_kickup_timer:多长时间前语句被移动到高优先级执行。在 MySQL 8.0.11 中添加。
  • thread_pool_query_threads_per_group:线程组的最大查询线程数。新增于 MySQL 8.0.31。
  • thread_pool_size:线程池中的线程组数。在 MySQL 8.0.11 中添加。
  • thread_pool_stall_limit:how long before statement 被定义为 stalled。MySQL 8.0.11 新增。
  • thread_pool_transaction_delay😄 period 后,线程池才会执行新事务。在 MySQL 8.0.31 中添加。
  • tls_ciphersuites:P允许的 TLSv1.3 密码套件,用于加密连接。在 MySQL 8.0.16 中添加。
  • upgrade:控制启动时的自动升级。在 MySQL 8.0.16 中添加。
  • use_secondary_engine:是否使用辅助引擎执行查询。MySQL 8.0.13 中新增。
  • validate-config:验证服务器配置。在 MySQL 8.0.16 中添加。
  • validate_password.changed_characters_percentage:新密码所需的最小更改字符百分比。在 MySQL 8.0.34 中添加。
  • validate_password.check_user_name:是否根据用户名检查密码。在 MySQL8.0.4 中添加。
  • validate_password.dictionary_file:validate_password 字典文件。在 MySQL 8.0.4 中添加。
  • validate_password.dictionary_file_last_parsed:上次解析字典文件的时间。在 MySQL 8.0.4 中添加。
  • validate_password.dictionary_file_words_count:词典文件中的单词数。在 MySQL 8.0.4 中添加。
  • validate_password.length:validate_password所需的密码长度。在 MySQL8.0.4 中添加。
  • validate_password.mixed_case_count:validate_password所需的大小写字符数。在 MySQL 8.0.4 中添加。
  • validate_password.number_count:validate_password 所需的位数字符数。在 MySQL 8.0.4 中添加。
  • validate_password.policy:validate_password 密码策略。在 MySQL 8.0.4 中添加。
  • validate_password.special_char_count:validate_password 所需的特殊字符数。在 MySQL 8.0.4 中添加。
  • version_compile_zlib:编译后的 zlib 库的版本。在 MySQL 8.0.11 中添加。
  • windowing_use_high_precision:是否将窗口函数计算到高精度。在 MySQL 8.0.2 中添加。

MySQL 8.0 中弃用的选项和变量

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

  • Compression:客户端连接是否在 client/serverprotocol 中使用压缩。在 MySQL 8.0.18 中已弃用。
  • Rsa_public_key:sha256_password身份验证插件 RSA 公钥值。在 MySQL 8.0.16 中已弃用。
  • Slave_open_temp_tables:复制 SQL 线程当前打开的临时表数。在 MySQL 8.0.26 中已弃用。
  • Slave_rows_last_search_algorithm_used:此副本最近使用的搜索算法,用于查找基于行的复制(索引、表或哈希扫描)的行。在 MySQL 8.0.26 中已弃用。
  • abort-slave-event-count:mysql-test 用于调试和测试复制的选项。在 MySQL 8.0.29 中已弃用。
  • admin-ssl:开启连接加密。在 MySQL 8.0.26 中已弃用。
  • audit_log_connection_policy:连接相关事件的审核日志记录策略。在 MySQL 8.0.34 中已废弃。
  • audit_log_exclude_accounts:账目不予审计。在 MySQL 8.0.34 中已弃用。
  • audit_log_include_accounts:要审计的账户。在 MySQL 8.0.34 中已弃用。
  • binlog_transaction_dependency_tracking:依赖信息(提交时间戳或事务写入集)的来源,从中评估哪些事务可以由 replica 的多线程应用程序并行执行。在 MySQL 8.0.35 中已弃用。
  • character-set-client-handshake😄 o 不忽略在 handshake 期间发送的客户端字符集值。在 MySQL 8.0.35 中已弃用。
  • daemon_memcached_enable_binlog:。在 MySQL 8.0.22 中已弃用。
  • daemon_memcached_engine_lib_name:实现 InnoDB memcached 插件的共享库。在 MySQL 8.0.22 中已弃用。
  • daemon_memcached_engine_lib_path😄 irectory 包含实现 InnoDBmemcached 插件的共享库。在 MySQL 8.0.22 中已弃用。
  • daemon_memcached_option:在启动时传递给 underlyingmemcached 守护进程的空格分隔选项。在 MySQL 8.0.22 中已弃用。
  • daemon_memcached_r_batch_size:指定在执行 COMMIT 以启动新事务之前要执行多少个 memcached 读取作。在 MySQL8.0.22 中已废弃。
  • daemon_memcached_w_batch_size:指定在执行 COMMIT 以启动新事务之前要执行多少个 memcached 写入作。在 MySQL 8.0.22 中已废弃。
  • default_authentication_plugin😄 efault 认证插件。在 MySQL 8.0.27 中已弃用。
  • disconnect-slave-event-count:mysql-test 用于调试和测试复制的选项。在 MySQL 8.0.29 中已弃用。
  • expire_logs_days😛 urge 二进制日志。在 MySQL8.0.3 中已废弃。
  • group_replication_ip_whitelist:允许连接到组的主机列表。在 MySQL 8.0.22 中已废弃。
  • group_replication_primary_member😛 组在 single-primarymode 下运行时的成员 UUID。如果 group 在 multi-primarymode 下运行,则为空字符串。在 MySQL 8.0.4 中已弃用。
  • group_replication_recovery_complete_at:状态转移后处理缓存事务时的恢复策略。在 MySQL 8.0.34 中已弃用。
  • have_openssl:mysqld 是否支持 SSL 连接。在 MySQL8.0.26 中已废弃。
  • have_ssl:mysqld 是否支持 SSL 连接。在 MySQL8.0.26 中已废弃。
  • init_slave:replica 连接到 source 时执行的语句。在 MySQL 8.0.26 中已弃用。
  • innodb_api_bk_commit_interval:自动提交使用 InnoDBmemcached 接口的空闲连接的频率(以秒为单位)。在 MySQL 8.0.22 中已弃用。
  • innodb_api_disable_rowlock:。在 MySQL 8.0.22 中已弃用。
  • innodb_api_enable_binlog:允许将 InnoDB memcached 插件与 MySQL 二进制日志一起使用。在 MySQL 8.0.22 中已弃用。
  • innodb_api_enable_mdl:锁定 InnoDB memcached 插件使用的表,使其无法被 DDL 通过 SQL 接口删除或更改。在 MySQL 8.0.22 中已废弃。
  • innodb_api_trx_level:允许控制 memcached 接口处理的查询的事务隔离级别。在 MySQL 8.0.22 中已弃用。
  • innodb_log_file_size:log group 中每个日志文件的大小。在 MySQL8.0.30 中废弃。
  • innodb_log_files_in_group:log group 中 InnoDB 的日志文件数。在 MySQL8.0.30 中废弃。
  • innodb_undo_tablespaces:回滚 Segment 被划分的表空间文件数。在 MySQL 8.0.4 中已弃用。
  • keyring_encrypted_file_data:keyring_encrypted_file插件数据文件。在 MySQL8.0.34 中已废弃。
  • keyring_encrypted_file_password:keyring_encrypted_file插件密码。在 MySQL8.0.34 中已废弃。
  • keyring_file_data:keyring_file 插件数据文件。在 MySQL 8.0.34 中已弃用。
  • keyring_oci_ca_certificate:对等体鉴权的 CA 证书文件。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_compartment:OCI 区间 OCID。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_encryption_endpoint:OCI 加密服务器端点。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_key_file:OCI RSA 私钥文件。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_key_fingerprint:OCI RSA 私钥文件指纹。在 MySQL8.0.31 中已废弃。
  • keyring_oci_management_endpoint:OCI 管理服务器端点。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_master_key:OCI 主密钥 OCID。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_secrets_endpoint:OCI Secrets 服务器端点。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_tenancy:OCI 租户 OCID。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_user:OCI 用户 OCID。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_vaults_endpoint:OCI 文件库服务器端点。在 MySQL 8.0.31 中已弃用。
  • keyring_oci_virtual_vault:OCI 文件库 OCID。在 MySQL 8.0.31 中已弃用。
  • log_bin_trust_function_creators:如果等于 0(默认),则当使用 --log-bin 时,只有具有 SUPERprivilege 的用户才允许创建 storedfunction,并且仅当创建的函数不会破坏 binarylogging 时。在 MySQL 8.0.34 中已弃用。
  • log_bin_use_v1_row_events:服务器是否正在使用版本 1 二进制日志行事件。在 MySQL 8.0.18 中已弃用。
  • log_slave_updates:replica 是否应该将其复制 SQL 线程执行的更新记录到自己的二进制日志中。在 MySQL 8.0.26 中已废弃。
  • log_slow_slave_statements:导致 replica 执行的 slow 语句写入 slow 查询日志。在 MySQL 8.0.26 中已弃用。
  • log_statements_unsafe_for_binlog😄 isables 错误 1592 警告正在写入错误日志。在 MySQL 8.0.34 中已弃用。
  • log_syslog:是否向 syslog 写入错误日志。在 MySQL8.0.2 中已废弃。
  • master-info-file:记住源的文件的位置和名称,以及 I/O 复制线程在源的二进制日志中的位置。在 MySQL 8.0.18 中已废弃。
  • master_info_repository:是否将包含源信息和复制 I/O 线程位置的连接元数据仓库写入 source 的二进制日志到文件或表中。在 MySQL8.0.23 中已废弃。
  • master_verify_checksum:导致 source 在从 binarylog 读取时检查校验和。在 MySQL 8.0.26 中已弃用。
  • max_length_for_sort_data:已排序记录的最大字节数。在 MySQL8.0.20 中已废弃。
  • myisam_repair_threads:修复 MyISAM 表时使用的线程数。1 禁用并行修复。在 MySQL 8.0.29 中已弃用。
  • mysql_native_password_proxy_users:mysql_native_password鉴权插件是否代理。在 MySQL 8.0.16 中已弃用。
  • new: 使用非常新的、可能是 'unsafe' 函数。在 MySQL8.0.35 中废弃。
  • no-dd-upgrade😛 revent 在启动时自动升级数据字典表。在 MySQL 8.0.16 中已弃用。
  • old:导致服务器恢复到旧版本中的某些行为。在 MySQL 8.0.35 中已弃用。
  • old-style-user-limits:启用旧式用户限制(在 5.0.3 之前,用户资源是按每个用户 + 主机计算的,而不是按账户计算的)。在 MySQL 8.0.30 中已废弃。
  • performance_schema_show_processlist:选择 SHOW PROCESSLIST 实现。在 MySQL8.0.35 中废弃。
  • pseudo_slave_mode:供内部服务器使用。在 MySQL 8.0.26 中已弃用。
  • query_prealloc_size😛 用于查询解析和执行的缓冲区。已在 MySQL 8.0.29 中废弃。
  • relay_log_info_file:replica 记录中继日志信息的 applier 元数据仓库的文件名。在 MySQL8.0.18 中废弃。
  • relay_log_info_repository:是否将 relaylogs 中复制 SQL 线程的位置写入文件或表。在 MySQL 8.0.23 中已弃用。
  • replica_parallel_type:告诉副本使用时间戳信息 (LOGICAL_CLOCK) 或数据库分区 (DATABASE) 来并行化事务。在 MySQL 8.0.29 中已弃用。
  • rpl_stop_slave_timeout:STOP REPLICA 或 STOP SLAVE 在超时前等待的秒数。在 MySQL 8.0.26 中已弃用。
  • safe-user-create😄 o 不允许对 mysql.user 表没有写入权限的用户创建新用户;此选项已弃用且被忽略。在 MySQL 8.0.11 中已弃用。
  • sha256_password_auto_generate_rsa_keys:是否自动生成 RSA 密钥对文件。在 MySQL 8.0.16 中已弃用。
  • sha256_password_private_key_path:SHA256 鉴权插件私钥路径名。已在 MySQL 8.0.16 中废弃。
  • sha256_password_proxy_users:鉴权插件是否sha256_password代理。在 MySQL 8.0.16 中已弃用。
  • sha256_password_public_key_path:SHA256 鉴权插件公钥路径名。已在 MySQL 8.0.16 中废弃。
  • show-slave-auth-info:在此源的 SHOW REPLICAS 和 SHOW SLAVEHOSTS 中显示用户名和密码。在 MySQL 8.0.26 中已弃用。
  • skip-character-set-client-handshake:忽略握手期间发送的客户端字符集值。在 MySQL 8.0.35 中已弃用。
  • skip-host-cache😄 o 不缓存主机名。在 MySQL 8.0.30 中已弃用。
  • skip-new:D不要使用新的、可能是错误的例程。在 MySQL8.0.35 中废弃。
  • skip-slave-start:如果设置,则当 replica server 启动时不会自动启动复制。在 MySQL 8.0.26 中已弃用。
  • skip-ssl😄 isable 连接加密。在 MySQL 8.0.26 中已弃用。
  • slave-skip-errors:当 query从提供的列表中返回错误时,告诉复制线程继续复制。在 MySQL 8.0.26 中已弃用。
  • slave_checkpoint_group:调用 checkpoint作到 updateprogress 状态之前,multithreadedreplica 处理的最大事务数。NDB 群集不支持。在 MySQL 8.0.26 中已废弃。
  • slave_checkpoint_period:在此毫秒数后,将多线程副本的进度状态和 flushrelay 日志信息更新到磁盘。NDB 群集不支持。在 MySQL 8.0.26 中已弃用。
  • slave_compressed_protocol:使用源/副本协议压缩。在 MySQL 8.0.18 中已废弃。
  • slave_load_tmpdir:复制 LOAD DATA 语句时,replica 应放置临时文件的位置。在 MySQL 8.0.26 中已弃用。
  • slave_max_allowed_packet:可从复制源服务器发送到副本的数据包的最大大小(以字节为单位);overridesmax_allowed_packet。在 MySQL 8.0.26 中已弃用。
  • slave_net_timeout:在中止读取之前,等待来自 source/replicaconnection 的更多数据的秒数。在 MySQL 8.0.26 中已弃用。
  • slave_parallel_type:告诉副本使用时间戳信息 (LOGICAL_CLOCK) 或数据库分区 (DATABASE) 来并行化事务。在 MySQL 8.0.26 中已弃用。
  • slave_parallel_workers:并行执行 replicationtransactions 的 applier 线程数;0 或 1 禁用 replicamultithreading。NDB 群集:请参阅文档。在 MySQL 8.0.26 中已废弃。
  • slave_pending_jobs_size_max:保存尚未应用的事件的副本 worker 队列的最大大小。在 MySQL 8.0.26 中已弃用。
  • slave_preserve_commit_order:确保副本 worker 的所有提交都以与源上相同的顺序发生,以便在使用 parallelapplier 线程时保持一致性。在 MySQL 8.0.26 中已弃用。
  • slave_rows_search_algorithms😄 termines 用于副本更新批处理的搜索算法。此列表中的任意 2 或 3:INDEX_SEARCH、TABLE_SCAN、HASH_SCAN。在 MySQL 8.0.18 中已弃用。
  • slave_sql_verify_checksum:导致 replica 在 reads 中读取 relaylog 时检查校验和。在 MySQL 8.0.26 中已弃用。
  • slave_transaction_retries:复制 SQL 线程在事务失败并出现死锁或超时锁等待超时的情况下重试事务的次数,然后放弃和停止。在 MySQL 8.0.26 中已弃用。
  • slave_type_conversions:控制副本的类型转换模式。value 是此列表中零个或多个元素的列表:ALL_LOSSY,ALL_NON_LOSSY。设置为空字符串以禁止源和副本之间的类型转换。在 MySQL8.0.26 中已废弃。
  • sql_slave_skip_counter:副本应跳过的源事件数。与 GTID 复制不兼容。在 MySQL 8.0.26 中已弃用。
  • ssl:开启连接加密。在 MySQL 8.0.26 中已弃用。
  • ssl_fips_mode:服务端是否开启 FIPS 模式。在 MySQL 8.0.34 中已废弃。
  • symbolic-links😛 ermit MyISAM 表的符号链接。在 MySQL8.0.2 中已废弃。
  • sync_master_info:每次 #th 事件后同步源信息。在 MySQL 8.0.26 中已弃用。
  • sync_relay_log_info:每次 #th 事件后 relay.info 文件同步到磁盘。在 MySQL 8.0.34 中已弃用。
  • temptable_use_mmap:D定义 TempTable 存储引擎在达到 temptable_max_ram 阈值时是否分配内存映射文件。在 MySQL 8.0.26 中已弃用。
  • transaction_prealloc_size😛 存储在二进制日志中的事务缓冲区。在 MySQL 8.0.29 中已弃用。
  • transaction_write_set_extraction😄 efines 算法,用于对交易期间提取的写入进行哈希处理。在 MySQL 8.0.26 中已弃用。

MySQL 8.0 中删除的选项和变量

以下系统变量、状态变量和选项已在 MySQL 8.0 中删除。

  • Com_alter_db_upgrade:ALTERDATABASE 的计数...UPGRADE DATA DIRECTORY NAME 语句。在 MySQL 8.0.0 中删除。
  • Innodb_available_undo_logs:InnoDB 回滚 segment 的总数;Different frominnodb_rollback_segments,显示 ActiveRollBack 分段的数量。在 MySQL 8.0.2 中删除。
  • Qcache_free_memory:查询缓存的可用内存量。在 MySQL 8.0.3 中删除。
  • Qcache_hits:查询缓存命中数。在 MySQL 8.0.3 中删除。
  • Qcache_inserts:查询 cacheinserts 的数量。在 MySQL 8.0.3 中删除。
  • Qcache_lowmem_prunes:由于缓存中缺少可用内存而从查询缓存中删除的查询数。在 MySQL 8.0.3 中删除。
  • Qcache_not_cached:非缓存查询的数量(不可缓存,或由于query_cache_typesetting而未缓存)。在 MySQL 8.0.3 中删除。
  • Qcache_queries_in_cache:在查询缓存中注册的查询数。在 MySQL 8.0.3 中删除。
  • Qcache_total_blocks:查询缓存中的块总数。在 MySQL 8.0.3 中删除。
  • Slave_heartbeat_period:副本的复制检测信号间隔(以秒为单位)。在 MySQL8.0.1 中删除。
  • Slave_last_heartbeat:显示何时收到最新的心跳信号,格式为 TIMESTAMP。在 MySQL 8.0.1 中删除。
  • Slave_received_heartbeats:自上次重置以来副本接收的心跳数。在 MySQL 8.0.1 中删除。
  • Slave_retried_transactions:自启动以来,复制 SQL 线程重试事务的总次数。在 MySQL 8.0.1 中删除。
  • Slave_running:此服务器 asreplica 的状态(复制 I/O 线程状态)。在 MySQL8.0.1 中删除。
  • bootstrap:由 mysql installationscripts 使用。在 MySQL 8.0.0 中删除。
  • date_format:DATE 格式(未使用)。在 MySQL 8.0.3 中删除。
  • datetime_format:DATETIME/TIMESTAMP 格式(未使用)。在 MySQL 8.0.3 中删除。
  • des-key-file:从给定文件加载 des_encrypt() 和 des_encrypt 的键。在 MySQL 8.0.3 中删除。
  • group_replication_allow_local_disjoint_gtids_join:允许当前服务器加入组,即使它有 transactionsnot in group。在 MySQL 8.0.4 中删除。
  • have_crypt:crypt() 系统调用的可用性。在 MySQL 8.0.3 中删除。
  • ignore-db-dir:将目录视为非数据库目录。在 MySQL 8.0.0 中删除。
  • ignore_builtin_innodb:忽略 built-inInnoDB。在 MySQL 8.0.3 中删除。
  • ignore_db_dirs:将目录视为非数据库目录。在 MySQL 8.0.0 中删除。
  • innodb_checksums:启用 InnoDB 校验和验证。在 MySQL 8.0.0 中删除。
  • innodb_disable_resize_buffer_pool_debug😄 isables 调整 InnoDB 缓冲池的大小。在 MySQL8.0.0 中删除。
  • innodb_file_format:新 InnoDBtables 的格式。在 MySQL 8.0.0 中删除。
  • innodb_file_format_check:InnoDB 是否执行文件格式兼容性检查。在 MySQL8.0.0 中删除。
  • innodb_file_format_max:共享表空间中的文件格式标签。在 MySQL 8.0.0 中删除。
  • innodb_large_prefix:为列前缀索引启用加长键。在 MySQL 8.0.0 中删除。
  • innodb_locks_unsafe_for_binlog:ForceInnoDB 不使用 next-key 锁定。相反,仅使用行级锁定。在 MySQL 8.0.0 中删除。
  • innodb_scan_directories:定义在 InnoDBrecovery 期间扫描表空间文件的目录。在 MySQL 8.0.4 中删除。
  • innodb_stats_sample_pages:索引分布统计信息要采样的索引页数。在 MySQL 8.0.0 中删除。
  • innodb_support_xa:为 XA 两阶段提交启用 InnoDB 支持。在 MySQL 8.0.0 中删除。
  • innodb_undo_logs:InnoDB 使用的撤消日志(回滚段)的数量;alias forinnodb_rollback_segments。在 MySQL 8.0.2 中删除。
  • internal_tmp_disk_storage_engine:内部临时表的存储引擎。在 MySQL8.0.16 中删除。
  • log-warnings:将一些非关键警告写入日志文件。在 MySQL 8.0.3 中删除。
  • log_builtin_as_identified_by_password:是否以向后兼容的方式记录 CREATE/ALTER USER、GRANT。在 MySQL 8.0.11 中删除。
  • log_error_filter_rules:筛选错误日志记录的规则。在 MySQL 8.0.4 中删除。
  • log_syslog:是否向 syslog 写入错误日志。在 MySQL 8.0.13 中删除。
  • log_syslog_facility:syslog 消息的工具。在 MySQL 8.0.13 中删除。
  • log_syslog_include_pid:syslog 消息中是否包含服务器 PID。在 MySQL 8.0.13 中删除。
  • log_syslog_tag:syslog 消息中服务器标识符的标签。在 MySQL8.0.13 中删除。
  • max_tmp_tables:未使用。在 MySQL8.0.3 中删除。
  • metadata_locks_cache_size:元数据大小会锁定缓存。在 MySQL 8.0.13 中删除。
  • metadata_locks_hash_instances:元数据锁哈希数。在 MySQL 8.0.13 中删除。
  • multi_range_count:在范围选择期间一次发送到表处理程序的最大范围数。在 MySQL 8.0.3 中删除。
  • myisam_repair_threads:修复 MyISAM 表时使用的线程数。1 禁用并行修复。在 MySQL 8.0.30 中删除。
  • old_passwords:为 PASSWORD() 选择密码哈希方法。在 MySQL 8.0.11 中删除。
  • partition:启用 (或禁用) partitioningsupport。在 MySQL 8.0.0 中删除。
  • query_cache_limit:不要缓存大于此值的结果。在 MySQL 8.0.3 中删除。
  • query_cache_min_res_unit:分配结果空间的单元的最小大小(在写入所有结果数据后修剪最后一个单元)。在 MySQL8.0.3 中删除。
  • query_cache_size:分配给 storeresults 的旧查询的内存。在 MySQL 8.0.3 中删除。
  • query_cache_type:查询缓存类型。移动 MySQL 8.0.3。
  • query_cache_wlock_invalidate:在 LOCK 上使查询缓存中的查询无效以进行写入。在 MySQL8.0.3 中删除。
  • secure_auth:禁止对具有旧(4.1 之前)密码的帐户进行身份验证。在 MySQL8.0.3 中删除。
  • show_compatibility_56:SHOW STATUS/VARIABLES.在 MySQL 8.0.1 中删除。
  • skip-partition:不启用用户定义的分区。在 MySQL 8.0.0 中删除。
  • sync_frm:在创建时将 .frm 同步到磁盘。默认启用。在 MySQL 8.0.0 中删除。
  • temp-pool:使用此选项会导致创建的大多数临时文件使用一小组名称,而不是每个新文件的唯一名称。在 MySQL 8.0.1 中删除。
  • time_format:TIME 格式(未使用)。在 MySQL 8.0.3 中删除。
  • tx_isolation:默认事务隔离级别。在 MySQL 8.0.3 中删除。
  • tx_read_only:默认事务 accessmode。在 MySQL 8.0.3 中删除。

1.5 如何报告 Bug 或问题

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

  • 首先在https://dev.mysql.com/doc/ 上搜索 MySQL 在线手册。我们尝试通过经常更新手册来更新新发现的问题。此外,手册随附的发行说明可能特别有用,因为较新的版本很可能包含您问题的解决方案。发行说明可在手册中给出的位置获得。

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

    如果手册涵盖了您正在使用的语法,但您使用的是旧版本的 MySQL Server,您应该检查 MySQL 更改历史记录以查看语法的实现时间。在这种情况下,您可以选择升级到较新版本的 MySQLServer。

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

  • 在http://bugs.mysql.com/ 中搜索 bug 数据库,查看是否已报告和修复该 bug。

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

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

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

在http://bugs.mysql.com/ 的 bug 数据库中发布的 bug 会针对给定版本进行更正,并在发行说明中注明。

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

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

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

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

当 bug 报告中包含对问题的良好描述时,这是最有帮助的。也就是说,请举一个很好的例子来说明您所做的导致问题的所有事情,并准确详细地描述问题本身。最好的报告是那些包含显示如何重现 bug 或问题的完整示例的报告。参见第 7.9 节“调试 MySQL”。

请记住,我们可以响应包含太多信息的报告,但不能响应包含太少的报告。人们经常忽略事实,因为他们认为他们知道问题的原因,并认为某些细节并不重要。要遵循的一个好的原则是,如果您对陈述某事有疑问,请陈述它。如果我们必须要求您提供初始报告中缺少的信息,那么在您的报告中多写几行比等待更长时间等待答案更快、更省事。

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

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

如果程序生成错误消息,那么在报表中包含该消息非常重要。如果我们尝试从档案中搜索某些内容,最好报告的错误消息与程序生成的错误消息完全匹配。(甚至应遵守信件大小写。最好将整个错误消息复制并粘贴到您的报告中。您永远不应该尝试从内存中重现消息。

如果您在使用 Connector/ODBC (MyODBC) 时遇到问题,请尝试生成跟踪文件并将其与报告一起发送。请参阅如何报告 Connector/ODBC 问题或 Bug

如果您的报表包含来自 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 软件的源代码分发,请包括您使用的编译器的名称和版本号。如果您有二进制分配,请包括分配名称。

  • 如果问题发生在编译过程中,请在发生错误的文件中包括 exacterror 消息以及围绕违规代码的几行上下文。

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

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

  • 问题发生时有效的 SQL 模式可能很重要,因此请报告sql_mode 系统变量的值。对于存储过程、存储函数和触发器对象,相关的 sql_mode 值是创建对象时生效的值。对于 storedprocedure 或函数,SHOW CREATE PROCEDURESHOW 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<br /> ...的输出,并且至少包括SELECT 语句生成的行数。您还应该包括所涉及的每个 table 的 SHOW CREATE TABLE<br /> tbl_name 的输出。您提供的有关您的情况的信息越多,就越有可能有人可以帮助您。

    下面是一个非常好的 bug 报告示例。这些语句使用 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 时出现错误或问题,请尝试提供重现异常的输入脚本。此脚本应包含任何必要的源文件。脚本越能重现您的情况越好。如果你能制作一个可复现的测试用例,你应该上传它以附加到 bug 报告中。

    如果您无法提供脚本,则至少应在报告中包括 mysqladmin 变量 extended-statusprocesslist 的输出,以提供有关系统执行情况的一些信息。

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

  • 如果您认为 MySQL 服务器从语句中产生了奇怪的结果,则不仅要包括结果,还要包括您对结果的看法,以及描述您观点基础的解释。

  • 当您提供问题的示例时,最好使用实际情况中存在的表名、变量名等,而不是想出新名称。该问题可能与表或变量的名称有关。这些情况也许很少见,但安全总比后悔好。毕竟,你提供一个符合你实际情况的例子应该更容易,而且对我们来说绝对更好。如果您不希望在 bug 报告中对其他人显示数据,则可以使用 Files (文件) 选项卡上传这些数据,如前所述。如果信息确实是最高机密,而您甚至不想向我们展示,请继续提供使用其他名称的示例,但请将此视为最后的选择。

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

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

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

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

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

  • 在你的 bug 报告中表明你已经检查了 referencemanual 和 mail 存档,以便其他人知道你已经尝试过自己解决问题。

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

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

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

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

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

1.6 MySQL 标准合规性

本节介绍 MySQL 与 ANSI/ISO SQL标准的关系。MySQL Server 对 SQL 标准有许多扩展,在这里你可以了解它们是什么以及如何使用它们。您还可以找到有关 MySQLServer 中缺少的功能以及如何解决一些差异的信息。

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

该产品的主要目标之一是继续努力实现 SQL 标准合规性,但不会牺牲速度或可靠性。我们并不害怕向 SQL 添加扩展或支持非 SQL 功能,如果这大大提高了 MySQL Server 对我们大部分用户群的可用性。HANDLER 接口就是这种策略的一个示例。参见第 15.2.5 节“ HANDLER 语句”。

我们继续支持事务性和非事务性数据库,以满足任务关键型 24/7 使用和 heavyWeb 或日志记录使用。

MySQL Server 最初设计为与小型计算机系统上的中型数据库(10-1 亿行,或每个表约 100MB)一起使用。如今,MySQL Server 可以处理 TB 级数据库。

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

MySQL 支持 ODBC 级别 0 到 3.51。

MySQL 使用NDBCLUSTER 存储引擎支持高可用性数据库集群。参见第 25 章,MySQL NDB Cluster 8.0

我们实现了支持大多数 W3CXPath 标准的 XML 功能。参见第 14.11 节“ XML 函数”。

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

选择 SQL 模式

MySQL 服务器可以在不同的 SQL 模式下运行,并且可以根据 sql_mode systemvariable 的值为不同的 Client 端以不同的方式应用这些模式。DBA 可以设置全局 SQL 模式以匹配站点服务器的作要求,并且每个应用程序都可以根据自己的要求设置其 sessionSQL 模式。

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

有关设置 SQL 模式的更多信息,请参见第 7.1.11 节 “服务器 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 选项还设置了事务隔离级别。

参见第 7.1.7 节 “服务器命令选项”。

1.6.1 标准 SQL 的 MySQL 扩展

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

/*! MySQL-specific code */

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

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

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

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

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

1.6.2 MySQL 与标准 SQL 的区别

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

1.6.2.1 SELECT INTO TABLE 差异

MySQL 服务器不支持 SELECT ... INTO<br /> TABLE Sybase SQL 扩展。相反,MySQL 服务器支持INSERT INTO ... SELECT 标准 SQL 语法,这基本上是一回事。参见第 15.2.7.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 替换为用户定义的变量。相同的语法也可以在使用 cursors 和 local variables 的存储例程中使用。参见第 15.2.13.1 节 “SELECT ...INTO 语句”。

1.6.2.2 UPDATE 差异

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

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

1.6.2.3外键约束差异

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

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

  • 如果ON UPDATE CASCADEON<br /> UPDATE SET NULL递归以更新之前在同一级联期间更新过的同一表,则其行为类似于RESTRICT。这意味着您不能使用自引用ON UPDATE CASCADEON UPDATE SET NULL操作。这是为了防止级联重复出现无限循环。另一方面,自引用ON DELETE SET<br /> NULL是可能的,就像自引用ON DELETE CASCADE一样。级联操作的嵌套深度不得超过15级。

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

  • 没有存储引擎,包括InnoDB,可以识别或强制执行referential-integrity约束定义中使用的MATCH子句。使用显式MATCH子句不会产生指定的效果,它会导致忽略ON<br /> DELETEON UPDATE子句。应避免指定MATCH

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

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

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

    对于UPDATEDELETE<br /> CASCADE等操作,未定义对包含NULL值的非唯一键的外键引用的处理。建议您使用仅引用UNIQUE(包括PRIMARY)和NOT<br /> NULL键的外键。

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

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

    定义列以使用REFERENCES<br /> tbl_name(col_name)子句没有实际效果,仅用作记忆或注释,说明您定期定义的列旨在引用另一个表中的列。使用此语法时必须意识到:

    • MySQL不会执行任何类型的检查来确保col_name实际存在于tbl_name中(或者甚至tbl_name本身存在)。
    • MySQL不会对tbl_name执行任何类型的操作,例如删除行以响应对您正在定义的表中的行执行的操作;换句话说,这种语法不会导致任何ON DELETEON<br /> UPDATE行为。(尽管您可以编写ON DELETEON UPDATE子句作为REFERENCES子句的一部分,但它也被忽略了。)
    • 此语法创建一个;它不会而不是创建任何类型的索引或键。

    您可以使用如此创建的列作为连接列,如show nhere:

    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 TABLEDESCRIBE的输出中:

    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=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    

有关外键约束的信息,请参见第15.1.20.5节,“外键约束”

1.6.2.4'--'作为注释的开头

标准SQL使用C语法/* this is a comment<br /> */进行注释,MySQL服务器也支持这种语法。MySQL还支持对此语法的扩展,使MySQL特定的SQL能够嵌入到注释中;请参阅第11.7节,“注释”。

MySQL Server还使用#作为开始注释字符。这是不标准的。

标准SQL还使用"--"作为astart注释序列。MySQL Server支持--注释样式的变体;--start注释序列被接受,但必须后跟空格或换行符等空格字符。该空格旨在防止使用以下构造生成的SQL查询出现问题,这些构造会更新余额以反映费用:

UPDATE account SET balance=balance-charge
WHERE account_id=user_id

考虑当charge具有负值时会发生什么,例如-1,当金额记入账户时可能会出现这种情况。在这种情况下,生成的语句如下所示:

UPDATE account SET balance=balance--1
WHERE account_id=5752;

balance--1是有效的标准SQL,但是--被解释为acomment的开始,并且表达式的一部分被丢弃。结果是一个与预期含义完全不同的语句:

UPDATE account SET balance=balance
WHERE account_id=5752;

该语句根本不会产生任何值变化。为了防止这种情况发生,MySQL需要--后面的空格字符才能在MySQL Server中被识别为起始注释序列,因此使用balance--1等表达式总是安全的。

1.6.3MySQL如何处理约束

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

基本原理是MySQL Server在解析要执行的语句时试图为它可以检测到的任何东西产生错误,并试图从执行语句时发生的任何错误中恢复。我们在大多数情况下都这样做,但不是所有人都这样做。

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

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

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

1.6.3.1主键和唯一索引约束

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

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

您可以使用mysql_info()C API获取实际插入或更新的行数信息function.You也可以使用SHOW WARNINGS语句。请参阅mysql_info()第15.7.7.42节“SHOW WARNINGS语句”

InnoDBNDB表支持外键。请参阅第1.6.3.2节,“FOREIGN KEY约束”

1.6.3.2外键约束

外键允许您跨稳定对象交叉引用相关数据,外键约束有助于保持此扩展数据的一致性。

MySQL支持CREATE TABLEALTER TABLE语句中的ON UPDATEON<br /> DELETE外键引用。可用的引用操作是RESTRICTCASCADESET NULLNO ACTION(默认值)。

SET DEFAULT也受MySQLServer支持,但目前被InnoDB拒绝为无效。由于MySQL不支持延迟约束检查,NO<br /> ACTION被视为RESTRICT。有关MySQL支持的外键的确切语法,请参阅第15.1.20.5节“FOREIGN KEY约束”

MATCH FULLMATCH<br /> PARTIALMATCH SIMPLE是允许的,但应避免使用它们,因为它们会导致MySQL服务器忽略相同状态中使用的任何ON DELETEON UPDATE子句。MATCH选项在MySQL中没有任何其他效果,这实际上强制了MATCH<br /> SIMPLE语义学全职。

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

您可以从Information SchemaKEY_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_FOREIGNINNODB_FOREIGN_COLS表中找到。

InnoDBNDB表支持外键。

1.6.3.3对无效数据的强制约束

默认情况下,MySQL 8.0拒绝无效或不正确的数据值,并中止发生这些值的语句。可以通过禁用严格SQL模式(参见第7.1.11节“服务器SQL模式”)来更改此行为以更宽容无效值,以便服务器强制它们为数据输入使用有效值,但不建议这样做。

旧版本的MySQL默认使用宽容行为;有关此行为的描述,请参阅对无效数据的约束

1.6.3.4ENUM和SET约束

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

除非禁用严格模式(不推荐,但请参阅第7.1.11节"服务器SQL模式"),否则ENUMSET列的定义将充当输入到列中的约束值。不满足以下条件的值会出错:

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

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

posted @ 2025-09-13 10:09  Samchensir  阅读(31)  评论(0)    收藏  举报