MySQL8-中文参考-一-

MySQL8 中文参考(一)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

前言和法律声明

原文:dev.mysql.com/doc/refman/8.0/en/preface.html

这是 MySQL 数据库系统版本 8.0 的参考手册,直至 8.0.36 版本。MySQL 8.0 的次要版本之间的差异在本文中以发布编号(8.0.x)的形式进行标注。有关许可信息,请参阅法律声明。

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

**许可信息—MySQL 8.0. ** 本产品可能包含根据许可使用的第三方软件。如果您使用的是商业版的 MySQL 8.0,请参阅MySQL 8.0 商业版许可信息用户手册获取许可信息,包括与可能包含在此商业版中的第三方软件相关的许可信息。如果您使用的是社区版的 MySQL 8.0,请参阅MySQL 8.0 社区版许可信息用户手册获取许可信息,包括与可能包含在此社区版中的第三方软件相关的许可信息。

**许可信息—MySQL NDB Cluster 8.0. ** 如果您使用的是商业版的 MySQL NDB Cluster 8.0,请参阅MySQL NDB Cluster 8.0 商业版许可信息用户手册获取许可信息,包括与可能包含在此商业版中的第三方软件相关的许可信息。如果您使用的是社区版的 MySQL NDB Cluster 8.0,请参阅MySQL NDB Cluster 8.0 社区版许可信息用户手册获取许可信息,包括与可能包含在此社区版中的第三方软件相关的许可信息。

法律声明

版权 © 1997 年至 2024 年,Oracle 及/或其关联公司。

许可限制

本软件及相关文档受许可协议保护,包含对使用和披露的限制,并受知识产权法保护。除非您的许可协议明确允许或法律允许,否则您不得使用、复制、翻译、广播、修改、许可、传输、分发、展示、执行、发布或显示任何部分,以任何形式或任何方式。除非法律要求用于互操作性,否则禁止对本软件进行逆向工程、反汇编或解编译。

担保免责声明

此处包含的信息可能会更改,不保证无错误。如果发现任何错误,请以书面形式向我们报告。

受限权利声明

如果这是交付给美国政府或代表美国政府许可的软件、软件文档、数据(如联邦采购条例中定义的)或相关文档,则以下通知适用:

美国政府最终用户:交付给或由美国政府最终用户访问的 Oracle 程序(包括任何操作系统、集成软件、安装在交付硬件上的任何程序以及对这些程序的修改)和 Oracle 计算机文档或其他 Oracle 数据均为“商业计算机软件”,“商业计算机软件文档”或“有限权利数据”,根据适用的联邦采购条例和机构特定的补充规定。因此,对 i)Oracle 程序(包括任何操作系统、集成软件、安装在交付硬件上的任何程序以及对这些程序的修改)、ii)Oracle 计算机文档和/或 iii)其他 Oracle 数据的使用、复制、复制、发布、显示、披露、修改、准备衍生作品和/或适应性,受限于适用合同中包含的许可中指定的权利和限制。美国政府使用 Oracle 云服务的条款由适用于此类服务的合同定义。未授予美国政府其他权利。

危险应用通知

此软件或硬件是为各种信息管理应用程序的一般使用而开发的。它不是为任何本质上危险的应用程序开发或拟定,包括可能造成个人伤害风险的应用程序。如果您在危险应用中使用此软件或硬件,则应负责采取所有适当的故障安全、备份、冗余和其他措施以确保其安全使用。Oracle Corporation 及其关联公司对在危险应用中使用此软件或硬件造成的任何损害不承担任何责任。

商标声明

Oracle,Java,MySQL 和 NetSuite 是 Oracle 及/或其关联公司的注册商标。其他名称可能是其各自所有者的商标。

英特尔和英特尔标志是英特尔公司的商标或注册商标。所有 SPARC 商标均在许可下使用,并且是 SPARC International, Inc.的商标或注册商标。AMD,Epyc 和 AMD 标志是 Advanced Micro Devices 的商标或注册商标。UNIX 是 The Open Group 的注册商标。

第三方内容、产品和服务免责声明

此软件或硬件和文档可能提供对第三方内容、产品和服务的访问或信息。除非另有适用协议中规定,否则 Oracle 公司及其关联公司对第三方内容、产品和服务的所有类型的任何保证均不负责并明确否认。除非另有适用协议中规定,否则 Oracle 公司及其关联公司不会对您访问或使用第三方内容、产品或服务而造成的任何损失、成本或损害负责。

使用此文档

此文档不是根据 GPL 许可证分发的。使用此文档受以下条款约束:

您可以仅为个人使用创建此文档的打印副本。允许转换为其他格式,只要实际内容没有被修改或编辑。您不得以任何形式或媒体发布或分发此文档,除非您以类似于 Oracle 发布方式(即通过网站电子下载软件)或在 CD-ROM 或类似介质上分发文档,但前提是文档与软件一起在同一介质上分发。任何其他用途,如分发印刷副本或在其他出版物中全部或部分使用此文档,需要 Oracle 授权代表的事先书面同意。Oracle 及/或其关联公司保留未明示授予的此文档的任何权利。

文档无障碍功能

有关 Oracle 致力于无障碍功能的信息,请访问 Oracle 无障碍计划网站 www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc

访问 Oracle 支持无障碍功能

已购买支持的 Oracle 客户可通过 My Oracle Support 访问电子支持。有关信息,请访问 www.oracle.com/pls/topic/lookup?ctx=acc&id=info 或访问 [www.oracle.com/pls/topic/lookup?ctx=acc&id=trs](http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)(听力障碍者)。

第一章 一般信息

原文:dev.mysql.com/doc/refman/8.0/en/introduction.html

目录

1.1 关于本手册

1.2 MySQL 数据库管理系统概述

1.2.1 什么是 MySQL?

1.2.2 MySQL 的主要特性

1.2.3 MySQL 的历史

1.3 MySQL 8.0 中的新功能

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

1.5 如何报告错误或问题

1.6 MySQL 的标准合规性

1.6.1 MySQL 对标准 SQL 的扩展

1.6.2 MySQL 与标准 SQL 的不同之处

1.6.3 MySQL 如何处理约束

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

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

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

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

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

  • 有关安装说明,请参见 第二章,“安装 MySQL”。有关升级 MySQL 的信息,请参见 第三章,“升级 MySQL”。

  • 有关 MySQL 数据库服务器的教程介绍,请参见 第五章,“教程”。

  • 有关配置和管理 MySQL 服务器的信息,请参见 第七章,“MySQL 服务器管理”。

  • 有关 MySQL 安全性的信息,请参见 第八章,“安全”。

  • 有关设置复制服务器的信息,请参阅 第十九章,复制

  • 有关 MySQL Enterprise,即具有高级功能和管理工具的商业 MySQL 发行版的信息,请参阅 第三十二章,MySQL Enterprise Edition

  • 有关 MySQL 数据库服务器及其功能的一些常见问题的答案,请参阅 附录 A,MySQL 8.0 常见问题

  • 要了解新功能和错误修复的历史,请参阅 发布说明。

重要提示

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

1.1 关于本手册

原文:dev.mysql.com/doc/refman/8.0/en/manual-info.html

这是 MySQL 数据库系统的参考手册,版本 8.0,直至发布 8.0.36。MySQL 8.0 的次要版本之间的差异在本文中以发布号(8.0.x)的形式进行说明。有关许可信息,请参阅法律声明。

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

因为本手册是作为参考使用的,所以不提供有关 SQL 或关系数据库概念的一般指导。它也不会教您如何使用操作系统或命令行解释器。

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

MySQL 本身的源代码包含使用 Doxygen 编写的内部文档。生成的 Doxygen 内容可从dev.mysql.com/doc/index-other.html获取。还可以使用 MySQL 源代码分发中的说明从本地生成此内容,方法请参见 Section 2.8.10,“生成 MySQL Doxygen 文档内容”。

如果您对使用 MySQL 有疑问,请加入MySQL 社区 Slack。如果您对手册本身的添加或更正有建议,请发送至www.mysql.com/company/contact/

排版和语法约定

本手册使用特定的排版约定:

  • 这种风格的文本用于 SQL 语句;数据库、表和列名称;程序清单和源代码;以及环境变量。例如:“要重新加载授权表,请使用FLUSH PRIVILEGES语句。”

  • 这种风格的文本表示您在示例中键入的输入。

  • 这种风格的文本表示可执行程序和脚本的名称,例如mysql(MySQL 命令行客户端程序)和mysqld(MySQL 服务器可执行文件)。

  • 这种风格的文本用于变量输入,您应该替换为自己选择的值。

  • 这种样式的文本 用于强调。

  • 这种样式的文本 用于表头和传达特别强烈的强调。

  • 这种样式的文本 用于指示影响程序执行方式的程序选项,或提供程序需要以某种方式运行的信息。示例:“--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 命令行客户端中执行。

注意

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

在某些领域,不同的系统可能会区分彼此,以显示命令应在两个不同的环境中执行。例如,在处理复制时,命令可能会以 sourcereplica 为前缀:

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

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

mysql> SELECT *col_name* FROM *db_name*.*tbl_name*;

这意味着,如果您要输入类似的语句,您需要提供自己的数据库、表和列名,可能像这样:

mysql> SELECT author_name FROM biblio_db.author_list;

SQL 关键字不区分大小写,可以以任何大小写形式编写。本手册使用大写。

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

DROP TABLE [IF EXISTS] *tbl_name*

当语法元素由多个备选项组成时,备选项用竖线(“|”)分隔。当必须选择一组选择中的一个成员时,备选项列在方括号(“[”和“]”)中:

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

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

{DESCRIBE | DESC} *tbl_name* [*col_name* | *wild*]

省略号(...)表示省略语句的一部分,通常是为了提供更复杂语法的简短版本。例如,SELECT ... INTO OUTFILESELECT 语句的缩写形式,其后跟有 INTO OUTFILE 子句。

省略号也可以表示语句中前面的语法元素可能重复。在下面的示例中,可以给出多个reset_option值,第一个之后的每个值前面都有逗号:

RESET *reset_option* [,*reset_option*] ...

使用 Bourne shell 语法显示设置 shell 变量的命令。例如,使用 Bourne shell 语法设置CC环境变量并运行configure命令的序列如下:

$> CC=gcc ./configure

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

$> setenv CC gcc
$> ./configure

手册作者

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

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

1.2 MySQL 数据库管理系统概述

原文:dev.mysql.com/doc/refman/8.0/en/what-is.html

1.2.1 MySQL 是什么?

1.2.2 MySQL 的主要特性

1.2.3 MySQL 的历史

1.2.1 什么是 MySQL?

原文:dev.mysql.com/doc/refman/8.0/en/what-is-mysql.html

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

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

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

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

  • MySQL 数据库是关系型的。

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

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

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

  • MySQL 软件是开源的。

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

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

    如果这正是你在寻找的,那么你应该试一试。MySQL 服务器可以轻松地在台式机或笔记本电脑上运行,与其他应用程序、Web 服务器等并存,几乎不需要注意。如果你将一台整机专门用于 MySQL,你可以调整设置以充分利用所有可用的内存、CPU 功率和 I/O 容量。MySQL 也可以扩展到联网的机器集群。

    MySQL 服务器最初是为了比现有解决方案更快地处理大型数据库而开发的,并且在多年来已成功用于高度苛刻的生产环境中。尽管不断开发中,但今天的 MySQL 服务器提供了丰富且有用的功能集。其连接性、速度和安全性使 MySQL 服务器非常适合访问互联网上的数据库。

  • MySQL 服务器适用于客户端/服务器或嵌入式系统。

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

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

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

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

  • MySQL HeatWave。

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

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

1.2.2 MySQL 的主要特性

原文:dev.mysql.com/doc/refman/8.0/en/features.html

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

  • MySQL 8.0:第 1.3 节,“MySQL 8.0 中的新功能”

  • MySQL 5.7:MySQL 5.7 中的新功能

内部结构和可移植性

  • 用 C 和 C++ 编写。

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

  • 可在许多不同平台上运行。参见www.mysql.com/support/supportedplatforms/database.html

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

  • 使用 Purify(一种商业内存泄漏检测器)以及 Valgrind 进行测试,Valgrind 是一个 GPL 工具(valgrind.org/)。

  • 使用具有独立模块的多层服务器设计。

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

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

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

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

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

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

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

  • 使用高度优化的类库实现 SQL 函数,应尽可能快速。通常在查询初始化后根本不需要任何内存分配。

  • 将服务器作为单独的程序提供,用于客户端/服务器网络环境。

数据类型

  • 许多数据类型:有符号/无符号整数,长度分别为 1、2、3、4 和 8 字节,FLOAT - FLOAT, DOUBLE"),DOUBLE - FLOAT, DOUBLE"),CHARVARCHARBINARYVARBINARYTEXTBLOBDATETIMEDATETIMETIMESTAMPYEARSETENUM 和 OpenGIS 空间类型。参见第十三章,数据类型

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

语句和函数

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

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

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

  • 支持标准 SQL 所需的表和列的别名。

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

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

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

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

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

安全性

  • 非常灵活和安全的权限和密码系统,支持基于主机的验证。

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

可扩展性和限制

  • 支持大型数据库。我们使用包含 5000 万条记录的 MySQL 服务器。我们还知道有用户使用具有 20 万个表和约 50 亿行的 MySQL 服务器。

  • 每个表最多支持 64 个索引。每个索引可以由 1 到 16 列或列的部分组成。对于InnoDB表,最大索引宽度为 767 字节或 3072 字节。参见第 17.22 节,“InnoDB 限制”。对于MyISAM表,最大索引宽度为 1000 字节。参见第 18.2 节,“MyISAM 存储引擎”。索引可以使用列的前缀,适用于CHARVARCHARBLOBTEXT列类型。

连接性

  • 客户端可以使用多种协议连接到 MySQL 服务器:

    • 客户端可以在任何平台上使用 TCP/IP 套接字进行连接。

    • 在 Windows 系统上,如果服务器启用了named_pipe系统变量,客户端可以使用命名管道进行连接。如果启用了shared_memory系统变量,Windows 服务器还支持共享内存连接。客户端可以通过使用--protocol=memory选项通过共享内存进行连接。

    • 在 Unix 系统上,客户端可以使用 Unix 域套接字文件进行连接。

  • MySQL 客户端程序可以用许多语言编写。为使用 C 或 C++编写的客户端或提供 C 绑定的任何语言提供了一个用 C 编写的客户端库。

  • 提供了 C、C++、Eiffel、Java、Perl、PHP、Python、Ruby 和 Tcl 的 API,可以使用这些 API 在许多语言中编写 MySQL 客户端。参见第三十一章,连接器和 API

  • Connector/ODBC(MyODBC)接口为使用 ODBC(开放数据库连接)连接的客户端程序提供 MySQL 支持。例如,您可以使用 MS Access 连接到您的 MySQL 服务器。客户端可在 Windows 或 Unix 上运行。Connector/ODBC 源代码可用。支持所有 ODBC 2.5 函数,以及许多其他函数。参见 MySQL Connector/ODBC 开发指南。

  • Connector/J 接口为使用 JDBC 连接的 Java 客户端程序提供 MySQL 支持。客户端可在 Windows 或 Unix 上运行。Connector/J 源代码可用。参见 MySQL Connector/J 8.0 开发指南。

  • 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 字符集等。例如,表和列名中允许使用斯堪的纳维亚字符“å”、“ä”和“ö”。

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

  • 排序和比较根据默认字符集和排序规则进行。在启动 MySQL 服务器时可以更改这一点(参见第 12.3.2 节,“服务器字符集和排序规则”)。要查看非常高级排序的示例,请查看捷克排序代码。MySQL 服务器支持许多不同的字符集,可以在编译时和运行时指定。

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

客户端和工具

  • MySQL 包括几个客户端和实用程序。这些包括命令行程序,如mysqldumpmysqladmin,以及图形程序,如 MySQL Workbench。

  • MySQL 服务器内置支持 SQL 语句来检查、优化和修复表格。这些语句可以通过命令行中的mysqlcheck客户端使用。MySQL 还包括myisamchk,一个非常快速的命令行实用程序,用于在MyISAM表上执行这些操作。参见第六章,MySQL 程序

  • MySQL 程序可以通过--help-?选项调用以获取在线帮助。

1.2.3 MySQL 的历史

原文:dev.mysql.com/doc/refman/8.0/en/history.html

我们最初打算使用mSQL数据库系统,通过我们自己的快速低级(ISAM)例程连接到我们的表。然而,在一些测试之后,我们得出结论,mSQL对我们的需求来说既不够快也不够灵活。这导致了我们数据库的一个新的 SQL 接口,但几乎与mSQL具有相同的 API 接口。这个 API 的设计是为了使为mSQL编写的第三方代码能够轻松地移植到 MySQL 中使用。

MySQL 的名字来源于联合创始人 Monty Widenius 的女儿 My。

MySQL 海豚(我们的标志)的名字是“Sakila”,这个名字是从我们的“给海豚取名”比赛中用户建议的众多名字中选择的。获胜的名字是由来自非洲斯威士兰(前身为斯威士兰)的开源软件开发者 Ambrose Twebaze 提交的。根据 Ambrose 的说法,这个女性名字 Sakila 源自斯威士语,这是斯威士兰的当地语言。Sakila 也是坦桑尼亚阿鲁沙附近的一个城镇的名字,靠近 Ambrose 的祖国乌干达。

1.3 MySQL 8.0 中的新功能

原文:dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

本节总结了 MySQL 8.0 中新增、弃用和删除的内容。一个相关的部分列出了 MySQL 8.0 中新增、弃用或删除的 MySQL 服务器选项和变量;请参见第 1.4 节,“MySQL 8.0 中新增、弃用或删除的服务器和状态变量和选项”。

  • MySQL 8.0 中新增的功能

  • MySQL 8.0 中弃用的功能

  • MySQL 8.0 中删除的功能

MySQL 8.0 中新增的功能

以下功能已添加到 MySQL 8.0 中:

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

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

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

    从 MySQL 8.0.16 开始,服务器执行了之前由 mysql_upgrade 处理的任务。安装新的 MySQL 版本后,服务器现在会在下次启动时自动执行所有必要的升级任务,不再依赖于 DBA 调用 mysql_upgrade。此外,服务器会更新帮助表的内容(之前 mysql_upgrade 没有做)。新的 --upgrade 服务器选项可控制服务器如何执行自动数据字典和服务器升级操作。有关更多信息,请参见 Section 3.4, “What the MySQL Upgrade Process Upgrades”。

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

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

  • 安全性和账户管理。 这些增强功能旨在提高安全性并增强 DBA 在账户管理方面的灵活性:

    • MySQL Enterprise Audit 现在支持使用 scheduler 组件来配置和执行定期任务以刷新内存缓存。有关设置说明,请参见 Enabling the Audit Log Flush Task。

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

    • MySQL Enterprise Edition 现在提供基于组件的数据脱敏和去标识化功能,而不是基于 MySQL 8.0.13 中引入的插件库。MySQL Enterprise Data Masking 和 De-Identification 组件支持多字节字符,将脱敏字典存储在数据库表中,并提供几个新功能。更多信息,请参见 第 8.5.1 节,“数据脱敏组件与数据脱敏插件”。

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

    • mysql 系统数据库中的授权表现在是 InnoDB(事务性)表。以前,这些是 MyISAM(非事务性)表。授权表存储引擎的更改导致了帐户管理语句行为的相应更改。以前,命名多个用户的帐户管理语句(如 CREATE USERDROP USER)可能对某些用户成功,对其他用户失败。现在,每个语句都是事务性的,要么对所有命名用户成功,要么回滚并且如果发生任何错误则不起作用。如果成功,该语句将写入二进制日志,但如果失败则不会;在这种情况下,回滚发生且不会进行任何更改。更多信息,请参见 第 15.1.1 节,“原子数据定义语句支持”。

    • 新的 caching_sha2_password 认证插件现已可用。与 sha256_password 插件类似,caching_sha2_password 实现了 SHA-256 密码哈希,但使用缓存来解决连接时的延迟问题。它还支持更多传输协议,并且不需要针对 RSA 密钥对密码交换功能链接到 OpenSSL。请参见 第 8.4.1.2 节,“缓存 SHA-2 可插拔认证”。

      caching_sha2_passwordsha256_password认证插件提供比mysql_native_password插件更安全的密码加密,而caching_sha2_passwordsha256_password提供更好的性能。由于caching_sha2_password具有更优越的安全性和性能特性,它现在是首选的认证插件,并且默认认证插件不再是mysql_native_password。有关此默认插件更改对服务器操作和服务器与客户端和连接器兼容性的影响的信息,请参见将 caching_sha2_password 作为首选认证插件。

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

    • MySQL 企业版现在支持一种认证方法,允许用户使用 Kerberos 对 MySQL 服务器进行身份验证,前提是适当的 Kerberos 票证可用或可以获取。有关详细信息,请参见 Section 8.4.1.8, “Kerberos 可插拔认证”。

    • MySQL 现在支持角色,即命名的权限集合。角色可以创建和删除。可以向角色授予和撤销权限。可以向用户账户授予和撤销角色。账户的活动适用角色可以从授予该账户的角色中选择,并且可以在该账户的会话期间更改。有关更多信息,请参见 Section 8.2.10, “使用角色”。

    • MySQL 现在引入了用户账户类别的概念,根据是否具有SYSTEM_USER权限来区分系统用户和普通用户。参见 Section 8.2.11, “账户类别”。

    • 以前,不可能授予全局适用的权限,除了某些模式。如果启用了partial_revokes系统变量,则现在可以实现。请参见 Section 8.2.12, “使用部分撤销进行权限限制”。

    • GRANT语句有一个AS *user* [WITH ROLE]子句,用于指定关于用于语句执行的权限上下文的附加信息。尽管这种语法在 SQL 级别可见,但其主要目的是通过在二进制日志中显示这些由部分撤销施加的授权限制,以实现对所有授予权限的节点的统一复制。参见第 15.7.1.6 节,“GRANT 语句”。

    • MySQL 现在维护有关密码历史的信息,从而可以限制重复使用先前密码。数据库管理员可以要求新密码在一定数量的密码更改或一段时间内不从先前密码中选择。可以在全局范围以及按账户基础上建立密码重用策略。

      现在可以要求更改账户密码的尝试通过指定要替换的当前密码进行验证。这使得数据库管理员可以防止用户在未证明知道当前密码的情况下更改密码。可以在全局范围以及按账户基础上建立密码验证策略。

      现在允许账户拥有双密码,这使得在复杂的多服务器系统中无缝执行分阶段密码更改成为可能,而无需停机。

      MySQL 现在允许管理员配置用户账户,以便由于密码错误导致的连续登录失败次数过多时,会导致临时锁定账户。每个账户的所需失败次数和锁定时间都是可配置的。

      这些新功能为数据库管理员提供了更完整的密码管理控制。更多信息,请参见第 8.2.15 节,“密码管理”。

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

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

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

    • MySQL 现在将授予客户端在 Windows 上使用命名管道进行成功通信所需的最低访问控制权限。新版 MySQL 客户端软件可以在不需要任何额外配置的情况下打开命名管道连接。如果旧版客户端软件无法立即升级,可以使用新的named_pipe_full_access_group系统变量来授予 Windows 组打开命名管道连接所需的权限。完全访问组的成员资格应受限制且临时。

    • 以前,MySQL 用户帐户使用单一认证方法对服务器进行身份验证。从 MySQL 8.0.27 开始,MySQL 支持多因素认证(MFA),这使得可以创建具有最多三种认证方法的帐户成为可能。MFA 支持包括以下更改:

      • CREATE USERALTER USER语法已扩展,允许指定多个认证方法。

      • authentication_policy 系统变量通过控制可以使用多少因素以及每个因素允许的认证类型,来建立 MFA 策略。这会对CREATE USERALTER USER语句中与认证相关的子句的使用方式施加限制。

      • 客户端程序现在具有新的--password1--password2--password3命令行选项,用于指定多个密码。对于使用 C API 的应用程序,mysql_options4() C API 函数的新选项 MYSQL_OPT_USER_PASSWORD 可以实现相同的功能。

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

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

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

  • 表加密管理。 现在可以通过定义和强制执行加密默认值来全局管理表加密。default_table_encryption变量为新创建的模式和通用表空间定义了一个加密默认值。创建模式时也可以使用DEFAULT ENCRYPTION子句定义模式的加密默认值。默认情况下,表继承所在模式或通用表空间的加密。通过启用table_encryption_privilege_check变量来强制执行加密默认值。当创建或更改具有与default_table_encryption设置不同的加密设置的模式或通用表空间,或者创建或更改具有与默认模式加密不同的加密设置的表时,将进行权限检查。当启用table_encryption_privilege_check时,TABLE_ENCRYPTION_ADMIN权限允许覆盖默认加密设置。有关更多信息,请参阅为模式和通用表空间定义加密默认值。

  • InnoDB 增强。 添加了以下InnoDB增强功能:

    • 每次值更改时,当前最大自动增量计数器值都会写入重做日志,并在每次检查点时保存到引擎私有系统表中。这些更改使得当前最大自动增量计数器值在服务器重新启动时持久化。此外:

      • 服务器重新启动不再取消AUTO_INCREMENT = N表选项的效果。如果您将自动增量计数器初始化为特定值,或者将自动增量计数器值更改为更大的值,则新值将在服务器重新启动时持久化。

      • ROLLBACK操作后立即重新启动服务器不再导致自动增量值被回滚事务分配的重复使用。

      • 如果您将AUTO_INCREMENT列值修改为大于当前最大自动增量值(例如,在UPDATE操作中),新值将被持久化,并且随后的INSERT操作将从新的更大值开始分配自动增量值。

      欲了解更多信息,请参阅 第 17.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理” 和 InnoDB AUTO_INCREMENT 计数器初始化。

    • 当遇到索引树损坏时,InnoDB 会向重做日志写入损坏标志,使损坏标志具有崩溃安全性。InnoDB 还会将内存中的损坏标志数据写入每个检查点上的引擎私有系统表。在恢复过程中,InnoDB 从两个位置读取损坏标志并在标记内存表和索引对象为损坏之前合并结果。

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

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

    • 新的信息模式 INNODB_CACHED_INDEXES 表报告了每个索引在 InnoDB 缓冲池中缓存的索引页数。

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

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

    • InnoDB 支持 SELECT ... FOR SHARESELECT ... FOR UPDATE 锁定读语句的 NOWAITSKIP LOCKED 选项。NOWAIT 会导致语句立即返回,如果请求的行被另一个事务锁定。SKIP LOCKED 会从结果集中移除被锁定的行。请参阅 使用 NOWAIT 和 SKIP LOCKED 进行锁定读并发。

      SELECT ... FOR SHARE替代了SELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE仍然可用以保持向后兼容性。这两个语句是等效的。然而,FOR UPDATEFOR SHARE支持NOWAITSKIP LOCKEDOF *tbl_name*选项。参见第 15.2.13 节,“SELECT 语句”。

      OF *tbl_name*将锁定查询应用于命名表。

    • ADD PARTITIONDROP PARTITIONCOALESCE PARTITIONREORGANIZE PARTITIONREBUILD PARTITION ALTER TABLE选项由本机分区内部 API 支持,并且可以与ALGORITHM={COPY|INPLACE}LOCK子句一起使用。

      使用ALGORITHM=INPLACEDROP PARTITION会删除存储在分区中的数据并且删除该分区。然而,使用ALGORITHM=COPYold_alter_table=ONDROP PARTITION会重建分区表,并尝试将被删除分区的数据移动到具有兼容PARTITION ... VALUES定义的另一个分区中。无法移动到另一个分区的数据将被删除。

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

    • mysql系统表和数据字典表现在创建在 MySQL 数据目录中名为mysql.ibd的单个InnoDB表空间文件中。以前,这些表是在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};
        

        在 Information Schema INNODB_TABLESPACES表中添加了显示表空间状态的STATE列。在删除之前,撤销表空间必须处于empty状态。

      • innodb_undo_log_truncate变量默认启用。

      • innodb_rollback_segments 变量定义了每个撤销表空间的回滚段数。以前,innodb_rollback_segments 指定了 MySQL 实例的总回滚段数。此更改增加了可用于并发事务的回滚段数。更多的回滚段增加了并发事务使用不同回滚段进行撤销日志的可能性,从而减少资源争用。

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

      • innodb_max_dirty_pages_pct_lwm 的默认值现在是 10。以前的默认值为 0,禁用了缓冲池预刷。当缓冲池中脏页的百分比超过 10% 时,值为 10 会启用预刷。启用预刷可以提高性能的一致性。

      • innodb_max_dirty_pages_pct 的默认值从 75 增加到 90。InnoDB 试图从缓冲池中刷新数据,以使脏页的百分比不超过此值。增加的默认值允许缓冲池中有更大比例的脏页。

    • 默认的 innodb_autoinc_lock_mode 设置现在是 2(交错)。交错锁模式允许并行执行多行插入,提高了并发性和可伸缩性。新的 innodb_autoinc_lock_mode 默认设置反映了从基于语句的复制更改为基于行的复制作为 MySQL 5.7 中默认复制类型的变化。基于语句的复制需要连续的自增锁模式(以前的默认值)来确保自增值按照可预测和可重复的顺序分配给给定序列的 SQL 语句,而基于行的复制不受 SQL 语句执行顺序的影响。更多信息,请参见 InnoDB AUTO_INCREMENT Lock Modes。

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

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

    • 新的innodb_dedicated_server变量,默认情况下已禁用,可用于根据服务器检测到的内存量自动配置以下选项:

      • innodb_buffer_pool_size

      • innodb_log_file_size

      • innodb_flush_method

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

    • 新的信息模式INNODB_TABLESPACES_BRIEF视图为InnoDB表空间提供空间、名称、路径、标志和空间类型数据。

    • MySQL 捆绑的zlib 库版本从 1.2.3 提升到 1.2.11。MySQL 借助 zlib 库实现压缩。

      如果使用InnoDB压缩表,请参阅第 3.5 节,“MySQL 8.0 中的更改”以获取相关升级影响。

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

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

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

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

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

      • 用户线程现在可以并发写入日志缓冲区而无需同步写入。

      • 用户线程现在可以以松弛顺序将脏页添加到刷新列表中。

      • 现在有一个专用的日志线程负责将日志缓冲区写入系统缓冲区,将系统缓冲区刷新到磁盘,通知用户线程已写入和刷新的重做,维护松弛刷新列表顺序所需的延迟,并写入检查点。

      • 系统变量已添加以配置用户线程在等待刷新重做时使用自旋延迟:

        • innodb_log_wait_for_flush_spin_hwm: 定义了平均日志刷新时间的最大值,超过这个值时,用户线程不再在等待刷新重做时自旋。

        • innodb_log_spin_cpu_abs_lwm: 定义了 CPU 使用率的最小值,低于此值时,用户线程在等待刷新重做时不再自旋。

        • innodb_log_spin_cpu_pct_hwm: 定义了 CPU 使用率的最大值,高于此值时,用户线程在等待刷新重做时不再自旋。

      • innodb_log_buffer_size变量现在是动态的,允许在服务器运行时调整日志缓冲区的大小。

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

    • 截至 MySQL 8.0.12,对大对象(LOB)数据进行小更新支持撤销日志记录,这提高了大小为 100 字节或更小的 LOB 更新的性能。以前,LOB 更新的最小大小为一个 LOB 页,这对于可能只修改几个字节的更新来说不太理想。此增强功能建立在 MySQL 8.0.4 中对 LOB 数据的部分更新支持之上。

    • 截至 MySQL 8.0.12,ALGORITHM=INSTANT支持以下ALTER TABLE操作:

      • 添加列。此功能也被称为“即时ADD COLUMN”。有一些限制。请参见第 17.12.1 节,“在线 DDL 操作”。

      • 添加或删除虚拟列。

      • 添加或删除列的默认值。

      • 修改ENUMSET列的定义。

      • 更改索引类型。

      • 重命名表。

      仅支持ALGORITHM=INSTANT的操作仅修改数据字典中的元数据。表上不会获取元数据锁,表数据也不受影响,使操作瞬间完成。如果未明确指定,支持ALGORITHM=INSTANT的操作将默认使用它。如果指定了ALGORITHM=INSTANT但不支持,操作将立即失败并显示错误。

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

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

    • 截至 MySQL 8.0.13,InnoDB数据静止加密功能支持通用表空间。以前,只有文件表表空间可以加密。为了支持通用表空间的加密,CREATE TABLESPACEALTER TABLESPACE语法被扩展以包括一个ENCRYPTION子句。

      信息模式INNODB_TABLESPACES表现在包括一个ENCRYPTION列,指示表空间是否加密。

      添加了stage/innodb/alter tablespace (encryption)性能模式阶段工具,以允许监视通用表空间加密操作。

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

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

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

      INNODB_SESSION_TEMP_TABLESPACES表提供有关会话临时表空间的元数据。

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

    • 从 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 存储引擎开始从磁盘分配内存映射临时文件。从 MySQL 8.0.16 开始,此行为由temptable_use_mmap变量控制。禁用temptable_use_mmap会导致 TempTable 存储引擎使用InnoDB磁盘上的内部临时表,而不是内存映射文件作为其溢出机制。有关更多信息,请参见内部临时表存储引擎。

    • 自 MySQL 8.0.16 起,InnoDB数据静态加密功能支持对mysql系统表空间进行加密。mysql系统表空间包含mysql系统数据库和 MySQL 数据字典表。更多信息,请参见第 17.13 节,“InnoDB 数据静态加密”。

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

    • InnoDB大数据集并行读取线程性能在 MySQL 8.0.17 中得到改善,通过更好地利用读取线程,减少在并行扫描期间发生的预取活动的读取线程 I/O,并支持对分区进行并行扫描。

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

    • innodb_idle_flush_pct变量,自 MySQL 8.0.18 起引入,允许在空闲时期限制页面刷新,有助于延长固态存储设备的寿命。请参见限制空闲时期的缓冲刷新。

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

    • 自 MySQL 8.0.20 起,双写缓冲存储区位于双写文件中。在之前的版本中,存储区位于系统表空间中。将存储区移出系统表空间可以减少写入延迟,增加吞吐量,并提供关于双写缓冲页放置的灵活性。以下系统变量用于高级双写缓冲配置:

      • innodb_doublewrite_dir

        定义双写缓冲文件目录。

      • innodb_doublewrite_files

        定义双写文件的数量。

      • innodb_doublewrite_pages

        定义了每个批次写入的最大双写页数。

      • innodb_doublewrite_batch_size

        定义一批中要写入的双写页数。

      更多信息,请参见第 17.6.4 节,“双写缓冲区”。

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

      先进先出(FIFO)算法,之前也用于事务调度,已被移除。FIFO 算法被 CATS 算法增强所取代。之前由 FIFO 算法执行的事务调度现在由 CATS 算法执行。

      INFORMATION_SCHEMA.INNODB_TRX表中添加了一个TRX_SCHEDULE_WEIGHT列,允许查询 CATS 算法分配的事务调度权重。

      用于监视代码级事务调度事件的以下INNODB_METRICS计数器被添加:

      • lock_rec_release_attempts

        释放记录锁的尝试次数。

      • lock_rec_grant_attempts

        授予记录锁的尝试次数。

      • lock_schedule_refreshes

        分析等待图以更新事务调度权重的次数。

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

    • 截至 MySQL 8.0.21,为了改善需要访问表和行资源的锁队列的操作的并发性,锁系统互斥体(lock_sys->mutex)被分片锁替代,并且锁队列被分组为表和页面锁队列分片,每个分片由专用互斥体保护。以前,单个锁系统互斥体保护所有锁队列,在高并发系统上是一个争用点。新的分片实现允许更精细地访问锁队列。

      锁系统互斥体(lock_sys->mutex)被以下分片锁替代:

      • 全局分片锁(lock_sys->latches.global_latch)由 64 个读写锁对象(rw_lock_t)组成。访问单个锁队列需要一个共享全局锁和一个锁队列分片的锁。需要访问所有锁队列的操作需要一个独占的全局锁,该锁锁定所有表和页面锁队列分片。

      • 表分片锁(lock_sys->latches.table_shards.mutexes),实现为一个包含 512 个互斥体的数组,每个互斥体专用于 512 个表锁队列分片中的一个。

      • 页面分片锁(lock_sys->latches.page_shards.mutexes),实现为一个包含 512 个互斥体的数组,每个互斥体专用于 512 个页面锁队列分片中的一个。

      用于监控单个锁系统互斥体的性能模式wait/synch/mutex/innodb/lock_mutex仪器已被替换为用于监控新的全局、表分片和页面分片闩锁的仪器:

      • 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表会删除现有的表空间并创建一个新的表空间。从 MySQL 8.0.21 开始,如果当前表空间目录未知,InnoDB会在默认位置创建新的表空间,并在错误日志中写入警告。要使TRUNCATE TABLE在当前位置创建表空间,请在运行TRUNCATE TABLE之前将目录添加到innodb_directories设置中。

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

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

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

      参见禁用重做日志记录。

    • 在启动时,InnoDB会校验已知表空间文件的路径与数据字典中存储的表空间文件路径是否匹配,以防表空间文件已移动到不同位置。新引入的innodb_validate_tablespace_paths变量允许禁用表空间路径验证。此功能适用于表空间文件未移动的环境。禁用表空间路径验证可以提高在具有大量表空间文件的系统上的启动时间。

      更多信息,请参见第 17.6.3.7 节,“禁用表空间路径验证”。

    • 截至 MySQL 8.0.21 版本,在支持原子 DDL 的存储引擎上,当使用基于行的复制时,CREATE TABLE ... SELECT语句将作为一个事务记录在二进制日志中。以前,它被记录为两个事务,一个用于创建表,另一个用于插入数据。通过这个改变,CREATE TABLE ... SELECT语句现在对于基于行的复制是安全的,并且允许与基于 GTID 的复制一起使用。更多信息,请参见第 15.1.1 节,“原子数据定义语句支持”。

    • 在繁忙系统上截断撤销表空间可能会影响性能,因为相关的刷新操作会从缓冲池中移除旧的撤销表空间页面,并将新撤销表空间的初始页面刷新到磁盘。为了解决这个问题,从 MySQL 8.0.21 开始移除了刷新操作。

      旧的撤销表空间页面在变得最近未使用时被被动释放,或者在下一个完整检查点时被移除。新撤销表空间的初始页面现在被重做日志记录,而不是在截断操作期间刷新到磁盘,这也提高了撤销表空间截断操作的耐久性。

      为了防止由过多的撤销表空间截断操作引起的潜在问题,现在在检查点之间对同一撤销表空间的截断操作被限制为 64 次。如果超过限制,撤销表空间仍然可以被设置为非活动状态,但直到下一个检查点之后才会被截断。

      与废弃的撤销截断刷新操作相关的INNODB_METRICS计数器已被移除。移除的计数器包括:undo_truncate_sweep_countundo_truncate_sweep_usecundo_truncate_flush_countundo_truncate_flush_usec

      请参见第 17.6.3.4 节,“撤销表空间”。

    • 截至 MySQL 8.0.22 版本,新的innodb_extend_and_initialize变量允许配置InnoDB在 Linux 上为文件表和通用表空间分配空间的方式。默认情况下,当操作需要在表空间中分配额外空间时,InnoDB会为表空间分配页面并在这些页面上物理写入 NULL。如果频繁分配新页面,这种行为会影响性能。您可以在 Linux 系统上禁用innodb_extend_and_initialize以避免在新分配的表空间页面上物理写入 NULL。当禁用innodb_extend_and_initialize时,空间使用posix_fallocate()调用进行分配,该调用保留空间而不进行物理写入 NULL。

      posix_fallocate()操作不是原子性的,这使得在为表空间文件分配空间和更新文件元数据之间发生故障的可能性。这种故障可能会导致新分配的页面处于未初始化状态,当InnoDB尝试访问这些页面时会失败。为了防止这种情况发生,InnoDB在分配新表空间页面之前写入重做日志记录。如果页面分配操作被中断,操作将在恢复期间从重做日志记录中重放。

    • 截至 MySQL 8.0.23 版本,InnoDB支持对属于加密表空间的双写文件页进行加密。这些页面使用相关表空间的加密密钥进行加密。更多信息,请参见第 17.13 节,“InnoDB 数据静态加密”。

    • MySQL 8.0.23 版本引入的temptable_max_mmap变量定义了 TempTable 存储引擎允许从内存映射(MMAP)文件分配的最大内存量,然后才开始将内部临时表数据存储在磁盘上。设置为 0 会禁用从 MMAP 文件分配。更多信息,请参见第 10.4.4 节,“MySQL 中的内部临时表使用”。

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

      在 Information Schema INNODB_TABLESPACES 表中添加了一个 AUTOEXTEND_SIZE 大小列。

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

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

    • 截至 MySQL 8.0.28 版本,tmp_table_size 变量定义了由 TempTable 存储引擎创建的任何单个内存内部临时表的最大大小。适当的大小限制可以防止单个查询消耗过多的全局 TempTable 资源。参见 内部临时表存储引擎。

    • 从 MySQL 8.0.28 开始,innodb_open_files 变量,定义了 InnoDB 可以同时打开的文件数,可以通过使用 SELECT 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支持使用ALGORITHM=INSTANT进行ALTER TABLE ... RENAME COLUMN操作。

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

    • 从 MySQL 8.0.29 开始,InnoDB支持使用ALGORITHM=INSTANT进行ALTER TABLE ... DROP COLUMN操作。

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

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

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

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

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

      随着这一变化,重做日志文件的数量及其默认位置也发生了变化。从 MySQL 8.0.30 开始,InnoDB在数据目录中的#innodb_redo目录中维护 32 个重做日志文件。以前,InnoDB默认在数据目录中创建两个重做日志文件,并且重做日志文件的数量和大小由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)。

      提供了几个状态变量用于监视重做日志和重做日志调整大小操作。

      有关更多信息,请参见第 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,这是 MySQL 中第一个针对 Unicode 的日语特定排序规则。有关更多信息,请参见第 12.10.1 节,“Unicode 字符集”。

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

    • 添加了->>(内联路径)运算符,等效于对JSON_EXTRACT()的结果调用JSON_UNQUOTE()

      这是 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() 以列或表达式作为其参数,并将结果聚合为单个 JSON 数组。表达式可以评估为任何 MySQL 数据类型;这不必是一个 JSON 值。JSON_OBJECTAGG() 接受两个列或表达式,它将其解释为键和值;它将结果作为单个 JSON 对象返回。有关更多信息和示例,请参阅第 14.19 节,“聚合函数”。

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

      这个函数还可以处理可以解析为 JSON 值的字符串。

      欲了解更详细信息和示例,请参阅第 14.17.8 节,“JSON 实用函数”。

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

      • 现在更有效地使用排序缓冲区空间,因此文件排序不需要像固定长度排序键那样早或频繁地刷新到磁盘。这意味着更多的数据可以在内存中排序,避免不必要的磁盘访问。

      • 较短的键比较起来比较长的键更快,这在性能上有明显的改善。这对于完全在内存中执行的排序以及需要写入和从磁盘读取的排序都是适用的。

    • 在 MySQL 8.0.2 中添加了对JSON列值的部分、原地更新的支持,这比完全删除现有 JSON 值并在其位置写入新值更有效,以前更新任何JSON列时都是这样做的。要应用此优化,更新必须使用JSON_SET()JSON_REPLACE()JSON_REMOVE()。无法向正在更新的 JSON 文档添加新元素;文档内的值不能比更新前占用更多空间。有关要求的详细讨论,请参阅 JSON 值的部分更新。

      JSON 文档的部分更新可以写入二进制日志,占用的空间比记录完整的 JSON 文档少。当使用基于语句的复制时,部分更新总是被记录为这样。要使其与基于行的复制一起工作,必须首先设置binlog_row_value_options=PARTIAL_JSON;有关更多信息,请参阅此变量的描述。

    • 添加了 JSON 实用函数JSON_STORAGE_SIZE()JSON_STORAGE_FREE()JSON_STORAGE_SIZE()返回在进行任何部分更新之前用于 JSON 文档的二进制表示的存储空间(请参阅上一条)。JSON_STORAGE_FREE()显示了在使用JSON_SET()JSON_REPLACE()部分更新表列类型为JSON后剩余的空间量;如果新值的二进制表示比先前值的小,则此值大于零。

      这些函数还接受 JSON 文档的有效字符串表示。对于这样的值,JSON_STORAGE_SIZE()返回其转换为 JSON 文档后的二进制表示所使用的空间。对于包含 JSON 文档字符串表示的变量,JSON_STORAGE_FREE()返回零。如果其(非空)参数无法解析为有效的 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]返回数组中倒数第二个元素。有关更多信息和示例,请参见搜索和修改 JSON 值。

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

      • 第一个对象的每个成员,在第二个对象中没有具有相同键的成员。

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

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

      作为这项工作的一部分,JSON_MERGE()函数已重命名为JSON_MERGE_PRESERVE()。在 MySQL 8.0 中,JSON_MERGE()仍然被识别为JSON_MERGE_PRESERVE()的别名,但现已被弃用,并可能在将来的 MySQL 版本中被移除。

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

    • 实现了“最后重复键胜出”的重复键规范化,与RFC 7159和大多数 JavaScript 解析器保持一致。这种行为的示例如下,只保留具有键x的最右边成员:

      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)
      

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

      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 先前版本不兼容的更改,在这种情况下使用了“第一个重复键胜出”的算法。

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

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

      此函数的语法为JSON_TABLE(*expr*, *path* COLUMNS *column_list*) [AS] *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 表函数”。

  • 数据类型支持。 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条件在准备阶段被移除,而不是在优化过程中。在处理过程中较早地移除条件使得可以简化具有琐碎条件的外连接查询的连接,例如这样一个:

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

      优化器现在在准备阶段发现0 = 1始终为假,使得OR 0 = 1变得多余,并将其移除,留下如下内容:

      SELECT * FROM t1 LEFT JOIN t2 ON *condition_1* where *condition_2*
      

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

      SELECT * FROM t1 LEFT JOIN t2 WHERE *condition_1* AND *condition_2*
      

      更多信息,请参阅 Section 10.2.1.9, “Outer Join Optimization”。

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

      更多信息,请参阅 Section 10.2.1.14, “Constant-Folding Optimization”。

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

      更多信息,请参阅 Section 10.2.2.1, “Optimizing IN and EXISTS Subquery Predicates with Semijoin Transformations”。

    • 截至 MySQL 8.0.17,服务器在上下文化阶段内部将任何不完整的 SQL 谓词(即形式为WHERE *value*的谓词,其中value是列名或常量表达式且未使用比较运算符)重写为WHERE *value* <> 0,以便查询解析器、查询优化器和查询执行器只需处理完整的谓词。

      这一变化的一个显著效果是,对于布尔值,EXPLAIN输出现在显示truefalse,而不是10

      此变化的另一个效果是,在 SQL 布尔上下文中对 JSON 值的评估执行隐式比较与 JSON 整数 0。考虑如下所示创建和填充的表:

      mysql> CREATE TABLE test (id INT, col JSON);
      
      mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}');
      

      以前,服务器在将提取的truefalse值在 SQL 布尔上下文中进行比较时,尝试将其转换为 SQL 布尔值,如下面使用IS TRUE的查询所示:

      mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
      +------+---------------+--------------+
      | id   | col           | col->"$.val" |
      +------+---------------+--------------+
      |    1 | {"val": true} | true         |
      +------+---------------+--------------+
      

      在 MySQL 8.0.17 及更高版本中,提取值与 JSON 整数 0 的隐式比较会导致不同的结果:

      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 8.0.21 开始,您可以在执行测试之前对提取的值使用JSON_VALUE()进行类型转换,如下所示:

      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         |
      +------+---------------+--------------+
      

      同样从 MySQL 8.0.21 开始,服务器提供警告:在 SQL 布尔上下文中评估 JSON 值会隐式与 JSON 整数 0 进行比较;如果这不是您想要的,请考虑在这种方式中比较提取值时,使用 JSON_VALUE RETURNING 将 JSON 转换为 SQL 数值类型。

    • 在 MySQL 8.0.17 及更高版本中,具有NOT IN (*子查询*)NOT EXISTS (*子查询*)WHERE条件在内部转换为反连接。 (反连接返回表中没有与连接条件匹配的行的表中的所有行。)这会删除子查询,可以加快查询执行速度,因为现在子查询的表在顶层处理。

      这类似于并重用了现有的外连接的IS NULLNot exists)优化;请参阅 EXPLAIN Extra Information。

    • 从 MySQL 8.0.21 开始,单表UPDATEDELETE语句现在在许多情况下可以使用半连接转换或子查询材料化。这适用于以下形式的语句:

      • 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)

      这可以用于满足以下条件的单表UPDATEDELETE

      • UPDATEDELETE语句使用具有[NOT] IN[NOT] EXISTS谓词的子查询。

      • 该语句没有ORDER BY子句,也没有LIMIT子句。

        UPDATEDELETE的多表版本不支持ORDER BYLIMIT。)

      • 目标表不支持读取前写入删除(仅适用于NDB表)。

      • 基于子查询中包含的任何提示和optimizer_switch的值,允许半连接或子查询材料化。

      当半连接优化用于符合条件的单表DELETEUPDATE时,在优化器跟踪中可见:对于多表语句,跟踪中有一个join_optimization对象,而对于单表语句则没有。转换也可在EXPLAIN FORMAT=TREEEXPLAIN ANALYZE的输出中看到;单表语句显示<not executable by iterator executor>,而多表语句报告完整计划。

      从 MySQL 8.0.21 开始,使用InnoDB表的多表UPDATE语句支持半一致性读取,适用于弱于REPEATABLE READ的事务隔离级别。

    • 改进的哈希连接性能。 MySQL 8.0.23 重新实现了用于哈希连接的哈希表,从而改进了哈希连接性能。这项工作包括修复了一个问题(Bug #31516149, Bug #99933),即哈希连接只能使用约分配给连接缓冲区(join_buffer_size)的 2/3 内存。

      新的哈希表通常比旧的更快,并且在对齐、键/值以及存在许多相等键的情况下使用更少的内存。此外,当哈希表的大小增加时,服务器现在可以释放旧内存。

  • 公共表达式。 MySQL 现在支持公共表达式,包括非递归和递归。公共表达式使得可以使用命名的临时结果集,通过允许在SELECT语句和某些其他语句之前使用WITH")子句来实现。有关更多信息,请参见 Section 15.2.20, “WITH (公共表达式)”")。

    截至 MySQL 8.0.19,递归公共表达式(CTE)的SELECT部分支持LIMIT子句。还支持带有OFFSETLIMIT。有关更多信息,请参见递归公共表达式。

  • 窗口函数。 MySQL 现在支持窗口函数,对于查询的每一行,执行使用与该行相关的行的计算。这些函数包括RANK()LAG()NTILE()等函数。此外,现在几个现有的聚合函数也可以用作窗口函数(例如,SUM()AVG())。有关更多信息,请参见 Section 14.20, “窗口函数”。

  • Lateral 派生表。 现在,派生表前面可以加上LATERAL关键字,以指定允许引用(依赖)同一FROM子句中之前表的列。Lateral 派生表使得某些 SQL 操作成为可能,这些操作无法使用非 Lateral 派生表完成,或者需要使用效率较低的变通方法。请参见 Section 15.2.15.9, “Lateral 派生表”。

  • 单表 DELETE 语句中的别名。 在 MySQL 8.0.16 及更高版本中,单表DELETE语句支持使用表别名。

  • 正则表达式支持。 以前,MySQL 使用 Henry Spencer 正则表达式库来支持正则表达式操作符(REGEXP, RLIKE)。现在,正则表达式支持已经重新实现,使用了提供完整 Unicode 支持且支持多字节的 International Components for Unicode (ICU)。REGEXP_LIKE()函数以REGEXPRLIKE操作符的方式执行正则表达式匹配,这两者现在是该函数的同义词。此外,REGEXP_INSTR()REGEXP_REPLACE()REGEXP_SUBSTR()函数可用于查找匹配位置以及执行子字符串替换和提取。regexp_stack_limitregexp_time_limit系统变量可控制匹配引擎的资源消耗。更多信息,请参见第 14.8.2 节,“正则表达式”。关于使用正则表达式的应用程序可能受到实现更改影响的信息,请参见正则表达式兼容性注意事项。

    这一变化的一个影响是,在 MySQL 8.0 中,[a-zA-Z][0-9]的性能比[[:alpha:]][[:digit:]]要好得多。已经使用模式匹配中的字符类的现有应用程序应升级为使用范围。

  • 内部临时表。 TempTable存储引擎取代了MEMORY存储引擎,成为内存中临时表的默认引擎。TempTable存储引擎为VARCHARVARBINARY列提供高效的存储。internal_tmp_mem_storage_engine会话变量定义了内存中临时表的存储引擎。允许的值为TempTable(默认)和MEMORYtemptable_max_ram变量定义了TempTable存储引擎在数据存储到磁盘之前可以使用的最大内存量。

  • 日志记录。 这些增强功能旨在改进日志记录:

    • 错误日志已重写以使用 MySQL 组件架构。传统错误日志使用内置组件实现,使用系统日志进行记录则使用可加载组件实现。此外,还提供了可加载的 JSON 日志写入器。更多信息,请参见 Section 7.4.2, “The Error Log”。

    • 从 MySQL 8.0.30 开始,在InnoDB存储引擎可用之前,错误日志组件可以在启动时隐式加载。这种新的加载错误日志组件的方法会加载并启用由log_error_services变量定义的组件。

      以前,必须首先使用INSTALL COMPONENT安装错误日志组件,并且只能在InnoDB完全可用后加载,因为要加载的组件列表是从mysql.components表中读取的,该表是一个InnoDB表。

      隐式加载错误日志组件具有以下优点:

      • 日志组件在启动序列中较早加载,使记录的信息更早可用。

      • 在启动过程中发生故障时,有助于避免缓冲日志信息的丢失。

      • 不需要使用INSTALL COMPONENT加载日志组件,简化了错误日志配置。

      使用INSTALL COMPONENT显式加载日志组件的方法仍然受支持,以确保向后兼容性。

      更多信息,请参见 Section 7.4.2.1, “Error Log Configuration”。

  • 备份锁。 新的备份锁类型允许在线备份期间进行 DML 操作,同时阻止可能导致不一致快照的操作。新的备份锁由LOCK INSTANCE FOR BACKUPUNLOCK INSTANCE语法支持。需要BACKUP_ADMIN权限才能使用这些语句。

  • 复制。 MySQL 复制功能已进行以下增强:

    • MySQL 复制现在支持使用紧凑的二进制格式对 JSON 文档的部分更新进行二进制日志记录,相比记录完整的 JSON 文档,可以节省日志空间。当使用基于语句的日志记录时,此类紧凑日志记录会自动执行,并且可以通过将新的binlog_row_value_options系统变量设置为PARTIAL_JSON来启用。更多信息,请参见 Partial Updates of JSON Values,以及binlog_row_value_options的描述。
  • 连接管理。 MySQL 服务器现在允许为管理连接专门配置 TCP/IP 端口。这提供了一种替代方案,即使已经建立了 max_connections 连接,也可以在用于普通连接的网络接口上配置单个管理连接。请参阅 Section 7.1.12.1, “Connection Interfaces”。

    MySQL 现在提供了更多控制压缩以减少发送到服务器的字节数的功能。以前,给定连接要么未经压缩,要么使用 zlib 压缩算法。现在,还可以使用 zstd 算法,并为 zstd 连接选择压缩级别。允许在服务器端配置压缩算法,以及在客户端程序发起的连接和参与源/副本复制或组复制的服务器端的连接发起端配置压缩算法。有关更多信息,请参阅 Section 6.2.8, “Connection Compression Control”。

  • 配置。 MySQL 中主机名的最大允许长度已从先前的 60 个字符提高到 255 个 ASCII 字符。例如,数据字典、mysql 系统模式、性能模式、INFORMATION_SCHEMAsys 模式中与主机名相关的列;CHANGE MASTER TO 语句中的 MASTER_HOST 值;SHOW PROCESSLIST 语句输出中的 Host 列;帐户名称中的主机名(例如在帐户管理语句和 DEFINER 属性中使用);以及与主机名相关的命令选项和系统变量。

    注意事项:

    • 允许的主机名长度增加可能会影响具有主机名列索引的表。例如,现在在索引主机名的 mysql 系统模式中的表具有显式的 ROW_FORMAT 属性为 DYNAMIC,以容纳更长的索引值。

    • 一些文件名值配置设置可能基于服务器主机名构建。允许的值受基础操作系统的限制,可能不允许文件名足够长以包含 255 个字符的主机名。这会影响 general_log_filelog_errorpid_filerelay_logslow_query_log_file 系统变量及相应选项。如果基于主机名的值对于操作系统来说太长,则必须提供显式较短的值。

    • 尽管服务器现在支持 255 字符的主机名,但使用--ssl-mode=VERIFY_IDENTITY选项建立到服务器的连接受 OpenSSL 支持的最大主机名长度的限制。主机名匹配涉及 SSL 证书的两个字段,其最大长度如下:通用名称:最大长度 64;主题备用名称:根据 RFC#1034 的最大长度。

  • 插件。 以前,MySQL 插件可以用 C 或 C++ 编写。现在插件使用的 MySQL 头文件包含 C++ 代码,这意味着插件必须用 C++ 而不是 C 编写。

  • C API。 MySQL C API 现在支持用于与 MySQL 服务器进行非阻塞通信的异步函数。每个函数都是现有同步函数的异步对应项。如果从服务器连接读取或写入必须等待,则同步函数会阻塞。异步函数使应用程序能够检查服务器连接上的工作是否准备好继续。如果没有准备好,应用程序可以在稍后再次检查之前执行其他工作。请参阅 C API 异步接口。

  • 强制转换的附加目标类型。 函数CAST()CONVERT()现在支持转换为类型DOUBLEFLOATREAL。在 MySQL 8.0.17 中添加。请参阅第 14.10 节,“强制转换函数和运算符”。

  • JSON 模式验证。 MySQL 8.0.17 添加了两个函数JSON_SCHEMA_VALID()JSON_SCHEMA_VALIDATION_REPORT()用于验证 JSON 文档是否符合 JSON 模式。JSON_SCHEMA_VALID()如果文档符合模式则返回 TRUE(1),否则返回 FALSE(0)。JSON_SCHEMA_VALIDATION_REPORT()返回一个包含验证结果详细信息的 JSON 文档。以下声明适用于这两个函数:

    • 模式必须符合 JSON Schema 规范的 Draft 4 版本。

    • 支持required属性。

    • 不支持外部资源和$ref关键字。

    • 支持正则表达式模式;无效模式会被静默忽略。

    有关更多信息和示例,请参阅第 14.17.7 节,“JSON 模式验证函数”。

  • 多值索引。 从 MySQL 8.0.17 开始,InnoDB支持创建多值索引,这是在存储值数组的JSON列上定义的二级索引,对于单个数据记录可以有多个索引记录。这样的索引使用类似于CAST(data->'$.zipcode' AS UNSIGNED ARRAY)的键部分定义。MySQL 优化器会自动为适当的查询使用多值索引,可以在EXPLAIN输出中查看。

    作为这项工作的一部分,MySQL 添加了一个新函数JSON_OVERLAPS()和一个新的MEMBER OF()运算符,用于处理JSON文档,并通过在下面的列表中描述的新ARRAY关键字扩展了CAST()函数:

    • JSON_OVERLAPS()比较两个JSON文档。如果它们包含任何共同的键值对或数组元素,则函数返回 TRUE(1);否则返回 FALSE(0)。如果两个值都是标量,函数执行简单的相等性测试。如果一个参数是 JSON 数组,另一个是标量,则标量被视为数组元素。因此,JSON_OVERLAPS()作为JSON_CONTAINS()的补充。

    • MEMBER OF()测试第一个操作数(标量或 JSON 文档)是否是作为第二个操作数传递的 JSON 数组的成员,如果是,则返回 TRUE(1),否则返回 FALSE(0)。不执行操作数的类型转换。

    • CAST(expressionAStype ARRAY)允许通过将位于json_path中的 JSON 文档中的 JSON 数组转换为 SQL 数组来创建一个功能性索引。类型说明符仅限于CAST()已支持的类型,但不包括BINARY(不支持)。CAST()(和ARRAY关键字)仅由InnoDB支持,并且仅用于创建多值索引。

    有关多值索引的详细信息,包括示例,请参见多值索引。第 14.17.3 节,“搜索 JSON 值的函数”提供了有关JSON_OVERLAPS()MEMBER OF()的信息,以及使用示例。

  • 可提示的 time_zone。 截至 MySQL 8.0.17,time_zone会话变量可以使用SET_VAR进行提示。

  • 重做日志归档。 截至 MySQL 8.0.17 版本,InnoDB支持重做日志归档。备份工具复制重做日志记录时,有时可能无法跟上重做日志生成的速度,导致在备份操作进行时丢失重做日志记录,因为这些记录被覆盖。重做日志归档功能通过将重做日志记录顺序写入归档文件来解决此问题。备份工具可以根据需要从归档文件中复制重做日志记录,从而避免数据的潜在丢失。有关更多信息,请参见重做日志归档。

  • 克隆插件。 截至 MySQL 8.0.17 版本,MySQL 提供了一个克隆插件,允许在本地或从远程 MySQL 服务器实例克隆InnoDB数据。本地克隆操作将克隆数据存储在 MySQL 实例运行的同一服务器或节点上。远程克隆操作将克隆数据通过网络从捐赠 MySQL 服务器实例传输到启动克隆操作的接收服务器或节点。

    克隆插件支持复制。除了克隆数据外,克隆操作还从捐赠端提取并传输复制坐标,并在接收端应用这些坐标,从而使得可以使用克隆插件为配置组复制成员和副本提供服务。使用克隆插件进行配置比复制大量事务要快得多且更有效。组复制成员还可以配置为使用克隆插件作为恢复的替代方法,以便成员自动选择从种子成员检索组数据的最有效方式。

    有关更多信息,请参见 Section 7.6.7, “克隆插件”,以及 Section 20.5.4.2, “用于分布式恢复的克隆”。

    截至 MySQL 8.0.27 版本,克隆操作进行时,允许在捐赠 MySQL 服务器实例上进行并发 DDL 操作。以前,在克隆操作期间会持有备份锁,阻止在捐赠端进行并发 DDL。要恢复到在克隆操作期间阻止捐赠端进行并发 DDL 的先前行为,请启用clone_block_ddl变量。参见 Section 7.6.7.4, “克隆和并发 DDL”。

    从 MySQL 8.0.29 开始,clone_delay_after_data_drop变量允许在远程克隆操作开始时在接收方 MySQL 服务器实例上删除现有数据后立即指定延迟时间。延迟旨在在从捐赠方 MySQL 服务器实例克隆数据之前为接收方主机上的文件系统释放足够的空间。某些文件系统会异步释放空间。在这些文件系统上,在删除现有数据后太快克隆数据可能导致由于空间不足而克隆操作失败。最大延迟时间为 3600 秒(1 小时)。默认设置为 0(无延迟)。

    从 MySQL 8.0.37 开始,克隆允许在不同的点发布版本之间进行。换句话说,以前必须匹配点发布号,现在只需要主版本号和次版本号匹配。

    例如,克隆功能现在允许将 8.0.37 克隆到 8.0.41 或 8.0.51 克隆到 8.0.39。对于早于 8.0.37 的版本仍然存在先前的限制,因此不允许克隆 8.0.36 到 8.0.42 或反之亦不允许。

  • 哈希连接优化。 从 MySQL 8.0.18 开始,只要连接中的每对表都包含至少一个等值连接条件,并且没有索引适用于任何连接条件,就会使用哈希连接。哈希连接不需要索引,尽管它可以与仅适用于单表谓词的索引一起使用。在大多数情况下,哈希连接比块嵌套循环算法更有效率。这种连接可以通过这种方式进行优化:

    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)
    

    哈希连接也可以用于笛卡尔积——也就是在没有指定连接条件时。

    你可以通过EXPLAIN FORMAT=TREEEXPLAIN ANALYZE来查看特定查询中是否使用了哈希连接优化。(在 MySQL 8.0.20 及更高版本中,也可以使用EXPLAIN,省略FORMAT=TREE。)

    哈希连接可用的内存量受join_buffer_size值的限制。如果哈希连接需要的内存超过这么多,则在磁盘上执行;磁盘哈希连接可以使用的磁盘文件数量受open_files_limit的限制。

    截至 MySQL 8.0.19 版本,MySQL 8.0.18 中引入的hash_join优化器开关不再受支持(hash_join=on 仍然作为 optimizer_switch 值的一部分,但设置它不再产生任何效果)。HASH_JOINNO_HASH_JOIN优化提示也不再受支持。该开关和提示现已被弃用;预计它们将在未来的 MySQL 版本中被移除。在 MySQL 8.0.18 及更高版本中,可以使用NO_BNL优化器开关来禁用哈希连接。

    在 MySQL 8.0.20 及更高版本中,MySQL 服务器不再使用块嵌套循环,而是在以前会使用块嵌套循环的任何时候都使用哈希连接,即使查询不包含等值连接条件。这适用于内部非等值连接、半连接、反连接、左外连接和右外连接。block_nested_loop标志用于optimizer_switch系统变量,以及BNLNO_BNL优化提示仍然受支持,但从现在开始仅控制哈希连接的使用。此外,内部和外部连接(包括半连接和反连接)现在都可以使用批量键访问(BKA),该方法逐步分配连接缓冲区内存,以便个别查询不必使用实际上并不需要的大量资源来解决问题。从 MySQL 8.0.18 开始,仅支持内部连接的 BKA。

    MySQL 8.0.20 还用迭代器执行器替换了先前版本 MySQL 中使用的执行器。此工作包括替换了旧的索引子查询引擎,该引擎控制形式为WHERE *value* IN (SELECT *column* FROM *table* WHERE ...)的查询,对于那些未被优化为半连接的IN查询,以及以相同形式材料化的查询,这些查询以前依赖于旧执行器。

    欲了解更多信息和示例,请参阅第 10.2.1.4 节,“哈希连接优化”。另请参阅批量键访问连接。

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

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

    查看使用 EXPLAIN ANALYZE 获取信息,获取更多信息。

  • 查询转换注入。 在版本 8.0.18 及更高版本中,MySQL 将转换操作注入到表达式和条件中的查询项树中,其中参数的数据类型与预期数据类型不匹配。这不会影响查询结果或执行速度,但使得执行的查询等效于符合 SQL 标准的查询,同时保持与之前版本的 MySQL 的向后兼容性。

    这种隐式转换现在在时间类型(DATE, DATETIME, TIMESTAMP, TIME) 和数值类型(SMALLINT, TINYINT, MEDIUMINT, INT/INTEGER, BIGINT; DECIMAL/NUMERIC; FLOAT, DOUBLE, REAL; BIT) 之间以及它们使用任何标准数值比较运算符(=, >=, >, <, <=, <>/!=, 或 <=>) 进行比较时执行。在这种情况下,任何不是DOUBLE的值都会被转换为DOUBLE。现在还会对DATETIME值与DATETIME值之间的比较执行转换注入,其中在必要时将参数转换为DATETIME

    从 MySQL 8.0.21 开始,当将字符串类型与其他类型进行比较时,也会执行这种转换。进行转换的字符串类型包括CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET。将字符串类型的值与数值类型或YEAR进行比较时,字符串转换为DOUBLE;如果另一个参数的类型不是FLOATDOUBLEREAL,则也将其转换为DOUBLE。将字符串类型与DATETIMETIMESTAMP值进行比较时,字符串转换为DATETIME;将字符串类型与DATE进行比较时,字符串转换为DATE

    可以通过查看EXPLAIN ANALYZEEXPLAIN FORMAT=JSON或者如下所示的EXPLAIN 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)
    

    还可以通过执行EXPLAIN [FORMAT=TRADITIONAL]来查看这种转换,此时还需要在执行EXPLAIN语句后发出SHOW WARNINGS

  • TIMESTAMP 和 DATETIME 的时区支持。 从 MySQL 8.0.19 开始,服务器接受插入日期时间(TIMESTAMPDATETIME)值的时区偏移量。此偏移量使用与设置time_zone系统变量时使用的相同格式,只是当偏移量的小时部分小于 10 时需要前导零,并且不允许'-00:00'。包含时区偏移量的日期时间文字示例包括'2019-12-11 10:40:30-05:00''2003-04-14 03:30:00+10:00''2020-01-01 15:35:45+05:30'

    选择日期时间值时,不显示时区偏移量。

    可以将包含时区偏移量的日期时间文字用作预备语句参数值。

    作为这项工作的一部分,用于设置time_zone系统变量的值现在也限制在-13:59+14:00的范围内(仍然可以将名称值分配给time_zone,例如'EST''Posix/Australia/Brisbane''Europe/Stockholm'到这个变量,前提是 MySQL 时区表已加载;参见填充时区表)。

    有关更多信息和示例,请参见第 7.1.15 节,“MySQL 服务器时区支持”,以及第 13.2.2 节,“DATE、DATETIME 和 TIMESTAMP 类型”。

  • JSON 模式 CHECK 约束失败的精确信息。 当使用JSON_SCHEMA_VALID()指定CHECK约束时,MySQL 8.0.19 及更高版本提供有关此类约束失败原因的精确信息。

    有关示例和更多信息,请参见 JSON_SCHEMA_VALID()和 CHECK 约束和 CHECK 约束")。另请参见第 15.1.20.6 节,“CHECK 约束”。

  • 带有 ON DUPLICATE KEY UPDATE 的行和列别名。 从 MySQL 8.0.19 开始,可以使用别名引用要插入的行,以及可选地引用其列。考虑在具有列ab的表t上执行以下INSERT语句:

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

    使用别名new表示新行,并且在某些情况下,使用别名mn表示此行的列,INSERT语句可以以许多不同的方式重写,以下是一些示例:

    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;
    

    有关更多信息和示例,请参见第 15.2.7.2 节,“INSERT ... ON DUPLICATE KEY UPDATE 语句”。

  • SQL 标准明确的表子句和表值构造函数。 根据 SQL 标准添加了表值构造函数和明确的表子句。这些分别在 MySQL 8.0.19 中实现为TABLE语句和VALUES语句。

    TABLE语句的格式为TABLE *table_name*,等同于SELECT * FROM *table_name*。它支持ORDER BYLIMIT子句(后者带有可选的OFFSET),但不允许选择单个表列。TABLE可以在任何需要等效SELECT语句的地方使用;这包括连接、联合、INSERT ... SELECTREPLACECREATE TABLE ... SELECT语句和子查询。例如:

    • TABLE t1 UNION TABLE t2等同于SELECT * FROM t1 UNION SELECT * FROM t2

    • CREATE TABLE t2 TABLE t1等同于CREATE TABLE t2 SELECT * FROM t1

    • SELECT a FROM t1 WHERE b > ANY (TABLE t2)等同于SELECT a FROM t1 WHERE b > ANY (SELECT * FROM t2)

    VALUES 可用于向 INSERTREPLACESELECT 语句提供表值,由 VALUES 关键字后跟一系列由逗号分隔的行构造函数 (ROW()) 组成。例如,语句 INSERT INTO t1 VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9) 提供了一个符合 SQL 标准的等效于 MySQL 特定的 INSERT INTO t1 VALUES (1,2,3), (4,5,6), (7,8,9)。您也可以像操作表一样从 VALUES 表值构造函数中选择,但请记住在这样做时必须提供表别名,并像操作其他表一样使用这个 SELECT;这包括连接、联合和子查询。

    有关 TABLEVALUES 的更多信息,以及它们的使用示例,请参阅本文档的以下部分:

    • 第 15.2.16 节,“TABLE 语句”

    • 第 15.2.19 节,“VALUES 语句”

    • 第 15.1.20.4 节,“CREATE TABLE ... SELECT 语句”

    • 第 15.2.7.1 节,“INSERT ... SELECT 语句”

    • 第 15.2.13.2 节,“JOIN 子句”

    • 第 15.2.15 节,“子查询”

    • 第 15.2.18 节,“UNION 子句”

  • FORCE INDEX、IGNORE INDEX 的优化器提示。 MySQL 8.0 引入了索引级别的优化器提示,作为传统索引提示的类似物,如 第 10.9.4 节,“索引提示” 中所述。新提示在此列出,以及它们的 FORCE INDEXIGNORE INDEX 等效项:

    • GROUP_INDEX:等同于 FORCE INDEX FOR GROUP BY

      NO_GROUP_INDEX:等同于 IGNORE INDEX FOR GROUP BY

    • JOIN_INDEX:等同于 FORCE INDEX FOR JOIN

      NO_JOIN_INDEX:等同于 IGNORE INDEX FOR JOIN

    • ORDER_INDEX:等同于 FORCE INDEX FOR ORDER BY

      NO_ORDER_INDEX:等同于 IGNORE INDEX FOR ORDER BY

    • INDEX:与GROUP_INDEXJOIN_INDEXORDER_INDEX相同;相当于没有修饰符的FORCE INDEX

      NO_INDEX:与NO_GROUP_INDEXNO_JOIN_INDEXNO_ORDER_INDEX相同;相当于没有修饰符的IGNORE INDEX

    例如,以下两个查询是等效的:

    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;
    

    先前列出的优化提示遵循与现有索引级别优化提示相同的基本语法和用法规则。

    这些优化提示旨在取代FORCE INDEXIGNORE INDEX,我们计划在未来的 MySQL 版本中弃用,并随后从 MySQL 中删除。它们不实现USE INDEX的单个精确等效项;相反,你可以使用NO_INDEXNO_JOIN_INDEXNO_GROUP_INDEXNO_ORDER_INDEX中的一个或多个来实现相同的效果。

    欲了解更多信息和使用示例,请参阅索引级别优化提示。

  • JSON_VALUE()函数。 MySQL 8.0.21 实现了一个新函数JSON_VALUE(),旨在简化对JSON列的索引。在其最基本形式中,它接受一个 JSON 文档和指向该文档中单个值的 JSON 路径作为参数,还允许你使用RETURNING关键字指定返回类型(可选)。JSON_VALUE(*json_doc*, *path* RETURNING *type*)等效于这个:

    CAST(
        JSON_UNQUOTE( JSON_EXTRACT(*json_doc*, *path*) )
        AS *type*
    );
    

    你还可以指定ON EMPTYON ERROR或两者子句,类似于与JSON_TABLE()一起使用的方式。

    你可以使用JSON_VALUE()来在JSON列上创建表达式索引,就像这样:

    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;
    

    在许多情况下,这比从JSON列创建生成列,然后在生成列上创建索引更简单。

    有关更多信息和示例,请参阅JSON_VALUE()的描述。

  • 用户评论和用户属性。 MySQL 8.0.21 引入了在创建或更新用户帐户时设置用户评论和用户属性的功能。用户评论由作为CREATE USERALTER USER语句中使用的COMMENT子句的参数传递的任意文本组成。用户属性由作为这两个语句之一中使用的ATTRIBUTE子句的参数传递的 JSON 对象形式的数据组成。属性可以包含 JSON 对象表示法中的任何有效键值对。在单个CREATE USERALTER USER语句中只能使用COMMENTATTRIBUTE中的一个。

    用户评论和用户属性在内部一起存储为 JSON 对象,评论文本作为具有comment作为其键的元素的值。此信息可以从 Information Schema USER_ATTRIBUTES表的ATTRIBUTE列中检索;由于它是以 JSON 格式,您可以使用 MySQL 的 JSON 函数和运算符来解析其内容(参见第 14.17 节,“JSON 函数”)。对用户属性的连续更改与其当前值合并,就像使用JSON_MERGE_PATCH()函数一样。

    示例:

    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系统变量,如下列表所述:

    • prefer_ordering_index标志

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

      此标志的默认值为on

    • subquery_to_derived标志

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

      这种优化可以应用于子查询,该子查询是SELECTWHEREJOINHAVING子句的一部分;包含一个或多个聚合函数但没有GROUP BY子句;不是相关的;并且不使用任何非确定性函数。

      该优化也可以应用于作为INNOT INEXISTSNOT EXISTS参数的表子查询,并且不包含GROUP BY。例如,查询SELECT * FROM t1 WHERE t1.b < 0 OR t1.a IN (SELECT t2.a + 1 FROM t2)被重写为SELECT a, b FROM t1 LEFT JOIN (SELECT DISTINCT 1 AS e1, t2.a AS e2 FROM t2) d ON t1.a + 1 = 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 t2.a=t1.a) > 0这样的查询可以重写为SELECT t1.* FROM t1 LEFT OUTER JOIN (SELECT a, COUNT(*) AS ct FROM t2 GROUP BY a) AS derived ON t1.a = derived.a WHERE derived.a > 0。MySQL 执行基数检查,以确保子查询不会返回多于一行(ER_SUBQUERY_NO_1_ROW)。更多信息请参见第 15.2.15.7 节,“相关子查询”。

      这种优化通常是禁用的,因为在大多数情况下它并不会带来明显的性能优势;该标志默认设置为off

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

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

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

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

    更多信息,请参阅CONVERT()函数的描述。

  • 以 UTC 检索 TIMESTAMP 值。 MySQL 8.0.22 及更高版本支持将系统时区的TIMESTAMP列值转换为 UTC DATETIME进行检索,使用CAST(*value* AT TIME ZONE *specifier* AS DATETIME),其中 specifier 是 [INTERVAL] '+00:00''UTC' 中的一个。如果需要,可以指定转换返回的DATETIME值的精度高达 6 位小数。此结构不支持ARRAY关键字。

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

    更多信息和示例,请参阅CAST()函数的描述。

  • 转储文件输出同步。 MySQL 8.0.22 及更高版本支持通过SELECT INTO DUMPFILESELECT INTO OUTFILE语句写入文件时的定期同步。可以通过将select_into_disk_sync系统变量设置为ON来启用此功能;写入缓冲区的大小由select_into_buffer_size设置的值确定;默认值为 131072(2¹⁷)字节。

    在同步到磁盘后,可以使用select_into_disk_sync_delay设置可选的延迟;默认情况下没有延迟(0 毫秒)。

    更多信息,请参阅此项中先前引用的变量的描述。

  • 语句的单次准备。 从 MySQL 8.0.22 开始,准备好的语句只需准备一次,而不是每次执行时都准备。这是在执行PREPARE时完成的。对于存储过程中的任何语句也是如此;当首次执行存储过程时,语句将被准备一次。

    这种变化的一个结果是,准备语句中使用的动态参数解析方式也发生了变化,具体列在以下方式中:

    • 准备语句参数在准备语句时被分配一个数据类型;该类型将持续存在于语句的每次后续执行中(除非语句被重新准备;请参见下文)。

      使用不同的数据类型为准备好的语句中的给定参数或用户变量,在第一次执行后的后续执行可能导致语句被重新准备;因此,建议在重新执行准备好的语句时使用相同的数据类型。

    • 为了与 SQL 标准保持一致,不再接受以下使用窗口函数的构造:

      • NTILE(NULL)

      • NTH_VALUE(*expr*, NULL)

      • LEAD(*expr*, *nn*)LAG(*expr*, *nn*),其中nn是一个负数

      这有助于更好地符合 SQL 标准。有关更多详细信息,请参阅各个函数描述。

    • 在准备语句中引用的用户变量现在在准备语句时确定其数据类型;该类型将持续存在于语句的每次后续执行中。

    • 在存储过程中出现的语句引用的用户变量现在在第一次执行语句时确定其数据类型;该类型将持续存在于包含存储过程的任何后续调用中。

    • 当执行形式为SELECT *expr1*, *expr2*, ... FROM *table* ORDER BY ?的准备语句时,为参数传递整数值N不再导致结果按照选择列表中的第N个表达式排序;结果不再排序,如在ORDER BY *constant*中所预期的那样。

    仅在存储过程中使用的准备好的语句只需准备一次,可以增强语句的性能,因为它消除了重复准备的额外成本。这样做还可以避免可能的多次回滚准备结构,这是 MySQL 中许多问题的根源。

    有关更多信息,请参阅第 15.5.1 节,“准备语句”。

  • 将 RIGHT JOIN 视为 LEFT JOIN 处理。 截至 MySQL 8.0.22,服务器在内部将所有RIGHT JOIN实例处理为LEFT JOIN,消除了在解析时未执行完全转换的一些特殊情况。

  • 派生条件下推优化。 MySQL 8.0.22(及更高版本)为具有物化派生表的查询实现了派生条件下推。对于诸如SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > *constant*这样的查询,现在在许多情况下可以将外部WHERE条件下推到派生表,这种情况下结果为SELECT * FROM (SELECT i, j FROM t1 WHERE i > *constant*) AS dt

    以前,如果派生表被物化而不是合并,MySQL 会将整个表物化,然后使用WHERE条件限定行。使用派生条件下推优化将WHERE条件移动到子查询中,通常可以减少必须处理的行数,从而减少执行查询所需的时间。

    外部WHERE条件可以直接下推到一个物化派生表,当派生表不使用任何聚合或窗口函数时。当派生表具有GROUP BY并且不使用任何窗口函数时,外部WHERE条件可以作为HAVING条件下推到派生表。当派生表使用窗口函数且外部WHERE引用窗口函数的PARTITION子句中使用的列时,WHERE条件也可以下推。

    派生条件下推优化默认启用,由optimizer_switch系统变量的derived_condition_pushdown标志指示。该标志在 MySQL 8.0.22 中添加,默认设置为on;要禁用特定查询的优化,可以使用NO_DERIVED_CONDITION_PUSHDOWN优化提示(也在 MySQL 8.0.22 中添加)。如果由于derived_condition_pushdown设置为off而禁用优化,可以使用DERIVED_CONDITION_PUSHDOWN为给定查询启用它。

    派生条件下推优化不能用于包含LIMIT子句的派生表。在 MySQL 8.0.29 之前,当查询包含UNION时,优化也无法使用。在 MySQL 8.0.29 及更高版本中,条件在大多数情况下可以下推到联合的两个查询块;有关更多信息,请参见 Section 10.2.2.5,“派生条件下推优化”。

    此外,一个使用子查询的条件本身无法被下推,而一个 WHERE 条件也无法被下推到作为外连接的内连接的派生表。有关更多信息和示例,请参阅 Section 10.2.2.5, “派生条件下推优化”。

  • MySQL 授权表上的非锁定读取。 截至 MySQL 8.0.22 版本,为了允许在 MySQL 授权表上进行并发的 DML 和 DDL 操作,先前在 MySQL 授权表上获取行锁的读取操作现在作为非锁定读取执行。

    现在在 MySQL 授权表上作为非锁定读取执行的操作包括:

    • 通过连接列表和子查询从授权表读取数据的 SELECT 语句和其他只读语句,包括使用任何事务隔离级别的 SELECT ... FOR SHARE 语句。

    • 从授权表读取数据的 DML 操作(通过连接列表或子查询),但不修改它们,使用任何事务隔离级别。

    欲了解更多信息,请参阅 授权表并发性。

  • FROM_UNIXTIME()、UNIX_TIMESTAMP()、CONVERT_TZ() 的 64 位支持。 截至 MySQL 8.0.28 版本,函数 FROM_UNIXTIME()UNIX_TIMESTAMP()CONVERT_TZ() 在支持它们的平台上处理 64 位值。这包括 Linux、MacOS 和 Windows 的 64 位版本。

    在兼容的平台上,UNIX_TIMESTAMP() 现在处理的值可达到 '3001-01-18 23:59:59.999999' UTC,而 FROM_UNIXTIME() 可以将值转换为自 Unix 纪元以来的 32536771199.999999 秒;CONVERT_TZ() 现在在转换后接受不超过 '3001-01-18 23:59:59.999999' UTC 的值。

    这些函数在 32 位平台上的行为不受这些更改的影响。TIMESTAMP 类型的行为也不受影响(在任何平台上);若要处理 '2038-01-19 03:14:07.999999' UTC 之后的日期时间,请改用 DATETIME 类型。

    欲了解更多信息,请参阅刚刚讨论的各个函数的描述,在 Section 14.7, “日期和时间函数”。

  • 资源分配控制。 从 MySQL 8.0.28 开始,您可以通过检查Global_connection_memory状态变量来查看所有常规用户发出的查询使用的内存量。(此总数不包括系统用户(如 MySQL root)使用的资源。它还不包括由InnoDB缓冲池占用的任何内存。)

    要启用对Global_connection_memory的更新,需要设置global_connection_memory_tracking = 1;默认情况下为0(关闭)。您可以通过设置connection_memory_chunk_size来控制多久更新一次Global_connection_memory

    还可以通过设置以下列出的系统变量中的一个或两个,或两者同时,在会话或全局级别为普通用户设置内存使用限制:

    • connection_memory_limit:为每个连接分配的内存量。每当任何用户超出此限制时,来自该用户的新查询将被拒绝。

    • global_connection_memory_limit:为所有连接分配的内存量。每当超出此限制时,来自任何常规用户的新查询将被拒绝。

    这些限制不适用于系统进程或管理帐户。

    有关更多信息,请参阅所引用变量的描述。

  • 分离的 XA 事务。 MySQL 8.0.29 增加了对 XA 事务的支持,一旦准备就绪,就不再与发起连接相关联。这意味着它们可以由另一个连接提交或回滚,并且当前会话可以立即开始另一个事务。

    系统变量xa_detach_on_prepare控制 XA 事务是否分离;默认值为ON,导致所有 XA 事务被分离。在此情况下,禁止对 XA 事务使用临时表。

    更多信息,请参见第 15.3.8.2 节,“XA 事务状态”。

  • 自动二进制日志清除控制。 MySQL 8.0.29 增加了binlog_expire_logs_auto_purge系统变量,提供了一个单一接口来启用和禁用二进制日志的自动清除。默认情况下启用(ON);要禁用二进制日志文件的自动清除,请将此变量设置为OFF

    binlog_expire_logs_auto_purge必须为ON,才能自动清除二进制日志文件;此变量的值优先于任何其他服务器选项或变量,包括(但不限于)binlog_expire_logs_seconds

    binlog_expire_logs_auto_purge的设置对PURGE BINARY LOGS没有影响。

  • 条件例程和触发器创建语句。 从 MySQL 8.0.29 开始,以下语句支持IF NOT EXISTS选项:

    • CREATE FUNCTION

    • CREATE PROCEDURE

    • CREATE TRIGGER

    对于CREATE FUNCTION用于创建存储函数和CREATE PROCEDURE时,此选项可防止出现同名例程的错误。对于CREATE FUNCTION用于创建可加载函数时,该选项可防止出现同名可加载函数的错误。对于CREATE TRIGGER,该选项可防止出现同名触发器的错误,如果在同一模式和同一表中已经存在同名触发器。

    此增强功能使这些语句的语法更接近于CREATE DATABASECREATE TABLECREATE USERCREATE EVENT(这些语句已经支持IF NOT EXISTS),并且补充了DROP PROCEDUREDROP FUNCTIONDROP TRIGGER语句支持的IF EXISTS选项。

    欲了解更多信息,请参阅指定 SQL 语句的描述,以及函数名称解析。另请参阅第 19.5.1.7 节,“复制 CREATE TABLE ... SELECT 语句”。

  • 包含 FIDO 库升级。 MySQL 8.0.30 将fido2库(与authentication_fido插件一起使用)从版本 1.5.0 升级到版本 1.8.0。

    查看第 8.4.1.11 节,“FIDO 可插拔认证”,获取更多信息。

  • 字符集:特定语言排序规则。 以前,当多种语言具有完全相同的排序规则定义时,MySQL 仅为其中一种语言实现了排序规则,这意味着某些语言仅由其他语言特定的utf8mb4 Unicode 9.0 排序规则覆盖。MySQL 8.0.30(及更高版本)通过为以前仅由其他语言特定排序规则覆盖的语言提供特定语言排序规则来解决此类问题。新排序规则覆盖的语言列在此处:

    • 挪威语(新挪威语)

      挪威语(书面挪威语)

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

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

    • 保加利亚语

    • 加利西亚语

    • 蒙古语(西里尔字母)

    MySQL 为每种语言提供了*_as_cs*_ai_ci排序规则。

    欲了解更多信息,请参阅特定语言排序规则。

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

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

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

    IGNORE UNKNOWN USER 导致未成功的REVOKE引发警告,而不是错误,当语句中指定的目标用户或角色找不到时。

    欲了解更多信息和示例,请参阅第 15.7.1.8 节“REVOKE 语句”。

  • 生成的隐形主键。 从 MySQL 8.0.30 开始,可以运行一个复制源服务器,使得在创建没有显式主键的InnoDB表时,会添加一个生成的隐形主键(GIPK)。添加到这样一个表的生成键列定义等同于这里显示的内容:

    my_row_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT INVISIBLE PRIMARY KEY
    

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

    生成的不可见主键通常在诸如 SHOW CREATE TABLESHOW INDEX 这样的语句的输出中可见,以及在 MySQL 信息模式表中,如 COLUMNSSTATISTICS 表中。您可以通过将 show_gipk_in_create_table_and_information_schema 设置为 OFF 来在这些情况下隐藏它们。

    作为这项工作的一部分,为 mysqldumpmysqlpump 添加了一个新的 --skip-generated-invisible-primary-key 选项,用于在输出中排除生成的不可见主键、列和列值。

    GIPKs 和表之间的复制,无论是否有主键。 在 MySQL 复制中,副本实际上会忽略源端的 sql_generate_invisible_primary_key 设置,因此对复制表没有影响。MySQL 8.0.32 及更高版本使得副本可以向任何 InnoDB 表中添加一个生成的不可见主键,即使该表在复制时没有主键。您可以通过在副本上调用 CHANGE REPLICATION SOURCE TO ... REQUIRE_TABLE_PRIMARY_KEY_CHECK = GENERATE 来实现这一点。

    REQUIRE_TABLE_PRIMARY_KEY_CHECK = GENERATE 与 MySQL Group Replication 不兼容。

    欲了解更多信息,请参阅 第 15.1.20.11 节,“生成的不可见主键”。

  • 崩溃安全的 XA 事务。 以前,XA 事务在意外停止时对于二进制日志并不完全具有弹性,如果这种情况发生在服务器执行 XA PREPAREXA COMMITXA ROLLBACK 时,服务器不能保证能够恢复到正确的状态,可能会导致二进制日志中存在未应用的额外 XA 事务,或者缺少一个或多个已应用的 XA 事务。从 MySQL 8.0.30 开始,这不再是一个问题,无论出于何种原因,从复制拓扑中掉出的服务器都可以在重新加入时始终被带回一致的 XA 事务状态。

    已知问题:当相同的事务 XID 用于顺序执行 XA 事务,并且在执行XA COMMIT ... ONE PHASE期间发生中断时,再次使用此相同的 XID,在此事务在存储引擎中准备好之后,可能不再可能在二进制日志和存储引擎之间同步状态。

    欲了解更多信息,请参阅第 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 标准语义,因此外部较高限制不能覆盖内部较低限制。例如,(SELECT ... LIMIT 5) LIMIT 10 最多只能返回五行。

    MySQL 优化器的解析器在执行任何简化或合并操作后,才会施加 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 的线程(例如复制应用程序线程)发出的可重写语句不会被 Rewriter 插件重写。默认值为 ON,这意味着这些语句会被重写。

    欲了解更多信息,请参阅第 7.6.4 节,“Rewriter 查询重写插件”。

  • XA 语句的复制过滤。 以前,当使用--replicate-do-db--replicate-ignore-db时,默认数据库会过滤掉XA STARTXA ENDXA COMMITXA ROLLBACK语句,这可能导致遗漏的事务。从 MySQL 8.0.31 开始,在这种情况下,这些语句不会被过滤,无论binlog_format的值是什么。

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

    因为过滤行上的权限检查不再会导致复制停止,所以副本现在可以仅接受给定用户已被授予访问权限的数据库部分;只要对数据库的此部分的更新仅以行格式进行复制。

    当从一个使用表进行管理或其他用途的本地或云服务迁移到 MySQL HeatWave 服务时,此功能也可能对于入站复制用户无法访问的情况有所帮助。

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

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

    • *a* INTERSECT *b*仅包括同时出现在结果集 ab 中的行。

    • *a* EXCEPT *b*仅返回结果集 a 中那些不同时出现在 b 中的行。

    INTERSECT DISTINCTINTERSECT ALLEXCEPT 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*'
    

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

    SELECT HISTOGRAM FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
      WHERE TABLE_NAME='*tbl_name*' 
      AND COLUMN_NAME='*col_name*';
    

    返回的列值应与先前 ANALYZE TABLE 语句中使用的json_data相同。

    在直方图采样过程中,可能会错过被视为重要的值。当发生这种情况时,您可能希望修改直方图或根据完整数据集设置自己的直方图。此外,对大型用户数据集进行采样并构建直方图是消耗资源的操作,可能会影响用户查询。通过这种增强,直方图生成可以从(主)服务器转移到副本上执行;然后将生成的直方图分配给源服务器上的适当表列。

    有关更多信息和示例,请参见直方图统计分析。

  • 服务器构建 ID(Linux)。 MySQL 8.0.31 为 Linux 系统添加了只读build_id 系统变量,其中在编译时生成一个 160 位的 SHA1 签名;build_id 的值是生成的值转换为十六进制字符串的值,为构建提供了唯一标识符。

    每次 MySQL 启动时,build_id 都会写入服务器日志。

    如果您从源代码构建 MySQL,您会观察到每次重新编译服务器时此值会更改。有关更多信息,请参见第 2.8 节,“从源代码安装 MySQL”。

    此变量不支持 Linux 以外的平台。

  • 默认 EXPLAIN 输出格式。 MySQL 8.0.32 添加了一个系统变量explain_format,用于确定在没有任何FORMAT选项的情况下获取查询执行计划的EXPLAIN语句输出格式。例如,如果explain_format的值为TREE,那么任何这样的EXPLAIN输出都使用类似树状的格式,就像语句已经指定了FORMAT=TREE一样。

    此行为将被FORMAT选项中设置的值覆盖。假设explain_format设置为TREE;即使如此,EXPLAIN FORMAT=JSON *stmt* 也会使用 JSON 输出格式显示结果。

    有关更多信息和示例,请参阅 explain_format 系统变量的描述,以及 获取执行计划信息。对于 EXPLAIN ANALYZE 的行为也有影响;请参阅 使用 EXPLAIN ANALYZE 获取信息。

  • ST_TRANSFORM() 支持笛卡尔坐标系。 在 MySQL 8.0.30 之前,ST_TRANSFORM() 函数不支持笛卡尔空间参考系统。在 MySQL 8.0.30 及更高版本中,此函数支持流行的可视化伪墨卡托(EPSG 1024)投影方法,用于 WGS 84 伪墨卡托(SRID 3857)。MySQL 8.0.32 及更高版本支持除 EPSG 1042、EPSG 1043、EPSG 9816 和 EPSG 9826 之外的所有笛卡尔空间参考系统。

MySQL 8.0 中已弃用的特性

以下功能在 MySQL 8.0 中已弃用,并可能在未来的系列中被移除。如果显示了替代方案,则应更新应用程序以使用它们。

对于在 MySQL 8.0 中使用已弃用功能的应用程序,在更高版本的 MySQL 系列中已移除的情况下,从 MySQL 8.0 源到更高系列的复制时可能会导致语句失败,或者在源和副本上产生不同的效果。为避免此类问题,应修订使用 8.0 中已弃用功能的应用程序,尽可能使用替代方案。

  • 数据库授权中的通配符字符。 在 MySQL 8.0.35 中,使用 %_ 作为数据库授权中的通配符已被弃用。您应该预期通配符功能在未来的 MySQL 版本中被移除,并且这些字符始终被视为文字,就像在 partial_revokes 服务器系统变量的值为 ON 时一样。

    此外,当检查权限时,服务器将 % 视为 localhost 的处理方式在 MySQL 8.0.35 中也已弃用,因此可能在未来的 MySQL 版本中被移除。

  • MySQL 8.0.35 及更高版本中已弃用可插拔的 FIDO 认证。

  • --character-set-client-handshake 选项最初用于从非常旧版本的 MySQL 进行升级,现在在 MySQL 8.0.35 及更高版本中已弃用,使用时会发出警告。您应该预期此选项在未来的 MySQL 版本中被移除;依赖此选项的应用程序应尽快迁移。

  • 在 MySQL 8.0 版本中,开始于 MySQL 8.0.35,oldnew 服务器系统变量及相关服务器选项已被弃用。每当设置或读取这些变量时,现在会发出警告。由于这些变量将在未来的 MySQL 版本中被移除,依赖于它们的应用程序应尽快开始迁移。

  • MySQL 8.0.34 版本开始,传统审计日志过滤模式已被弃用。传统审计日志过滤系统变量现在会发出新的弃用警告。这些弃用的变量要么是只读的,要么是动态的。

    (只读) audit_log_policy 现在在服务器启动时,当值不为 ALL(默认值)时,会向 MySQL 服务器错误日志写入警告消息。

    (动态) audit_log_include_accountsaudit_log_exclude_accountsaudit_log_statement_policy,以及 audit_log_connection_policy。动态变量基于使用情况打印警告消息:

    • 在 MySQL 服务器启动期间向 audit_log_include_accountsaudit_log_exclude_accounts 传递非 NULL 值现在会向服务器错误日志写入警告消息。

    • 在 MySQL 服务器启动期间传递非默认值给 audit_log_statement_policyaudit_log_connection_policy 现在会向服务器错误日志写入警告消息。ALL 是这两个变量的默认值。

    • 在 MySQL 客户端会话期间使用 SET 语法更改现有值现在会向客户端日志写入警告消息。

    • 在 MySQL 客户端会话期间使用 SET PERSIST 语法持久化变量现在会向客户端日志写入警告消息。

  • 在 MySQL 8.0.34 及更高版本中,mysql_native_password 认证插件已被弃用,如果账户尝试使用 mysql_native_password 进行认证,现在会在服务器错误日志中产生弃用警告。

  • ssl_fips_mode 服务器系统变量,--ssl-fips-mode 客户端选项,以及 MYSQL_OPT_SSL_FIPS_MODE 选项已被弃用,并将在未来的 MySQL 版本中被移除。

  • keyring_filekeyring_encrypted_file插件已从 MySQL 8.0.34 开始弃用。这些密钥环插件已被component_keyring_filecomponent_keyring_encrypted_file组件取代。有关密钥环组件和插件的简明比较,请参见第 8.4.4.1 节,“密钥环组件与密钥环插件比较”。

  • 从 MySQL 8.0.31 开始,keyring_oci插件已被弃用,并可能在未来的 MySQL 版本中被移除。相反,考虑使用component_keyring_oci组件来存储密钥环数据(参见第 8.4.4.11 节,“使用 Oracle Cloud 基础设施 Vault 密钥环组件”)。

  • utf8mb3字符集已被弃用。请改用utf8mb4

  • 以下字符集已被弃用:

    • ucs2 (参见第 12.9.4 节,“ucs2 字符集(UCS-2 Unicode 编码)”)

    • macromanmacce (参见第 12.10.2 节,“西欧字符集”,以及第 12.10.3 节,“中欧字符集”)

    • dec (参见第 12.10.2 节,“西欧字符集”)

    • hp8 (参见第 12.10.2 节,“西欧字符集”)

    在 MySQL 8.0.28 及更高版本中,任何这些字符集或它们的排序在以下任一方式中使用时会产生弃用警告:

    • 在启动 MySQL 服务器时使用--character-set-server--collation-server

    • 在任何 SQL 语句中指定时,包括但不限于CREATE TABLECREATE DATABASESET NAMESALTER TABLE

    你应该使用utf8mb4而不是之前列出的任何字符集。

    用户自定义排序已被弃用。从 MySQL 8.0.33 开始,以下任一情况都会导致警告写入日志:

    • 在任何 SQL 语句中与用户自定义排序的名称一起使用COLLATE

    • collation_servercollation_database,或collation_connection的值中使用用户自定义排序的名称。

    你应该预计在未来的 MySQL 版本中将删除对用户定义排序规则的支持。

  • 因为caching_sha2_password是 MySQL 8.0 中的默认身份验证插件,并提供了sha256_password身份验证插件功能的超集,sha256_password已被弃用;预计在未来的 MySQL 版本中将被移除。使用sha256_password进行身份验证的 MySQL 账户应该迁移到使用caching_sha2_password

  • validate_password插件已被重新实现以使用组件基础架构。validate_password插件形式仍然可用,但现在已被弃用;预计在未来的 MySQL 版本中将被移除。使用该插件的 MySQL 安装应该过渡到使用组件。参见第 8.4.3.3 节,“过渡到密码验证组件”。

  • ALTER TABLESPACEDROP TABLESPACE语句的ENGINE子句已被弃用。

  • PAD_CHAR_TO_FULL_LENGTH SQL 模式已被弃用。

  • AUTO_INCREMENT支持已被弃用于FLOAT - FLOAT, DOUBLE")和DOUBLE - FLOAT, DOUBLE")(以及任何同义词)类型的列。考虑从这些列中移除AUTO_INCREMENT属性,或将它们转换为整数类型。

  • UNSIGNED属性已被弃用于FLOAT - FLOAT, DOUBLE")、DOUBLE - FLOAT, DOUBLE")和DECIMAL - DECIMAL, NUMERIC")(以及任何同义词)类型的列。考虑为这些列使用简单的CHECK约束代替。

  • FLOAT(*M*,*D*)DOUBLE(*M*,*D*)语法用于指定FLOAT - FLOAT, DOUBLE")和DOUBLE - FLOAT, DOUBLE")(以及任何同义词)类型列的数字位数,这是 MySQL 的非标准扩展。此语法已被弃用。

  • ZEROFILL属性已被弃用于数值数据类型,整数数据类型的显示宽度属性也是如此。考虑使用其他方法来实现这些属性的效果。例如,应用程序可以使用LPAD()函数将数字零填充到所需的宽度,或者它们可以将格式化的数字存储在CHAR列中。

  • 对于字符串数据类型,BINARY属性是一个非标准的 MySQL 扩展,用于指定列字符集的二进制(_bin)排序规则(如果未指定列字符集,则使用表默认字符集)。在 MySQL 8.0 中,这种非标准用法的BINARY是模棱两可的,因为utf8mb4字符集有多个_bin排序规则,所以BINARY属性已被弃用;应调整应用程序以使用显式的_bin排序规则。

    使用BINARY指定数据类型或字符集的做法保持不变。

  • 之前的 MySQL 版本支持非标准的简写表达式ASCIIUNICODE,分别用于CHARACTER SET latin1CHARACTER SET ucs2ASCIIUNICODE已被弃用(MySQL 8.0.28 及更高版本),现在会产生警告。在这两种情况下,请改用CHARACTER SET

  • 作为标准 SQL 的ANDORNOT运算符的非标准 C 风格的&&||!运算符已被弃用。使用非标准运算符的应用程序应调整为使用标准运算符。

    注意

    除非启用了PIPES_AS_CONCAT SQL 模式,否则使用||已被弃用(在这种情况下,||表示 SQL 标准的字符串连接运算符)。

  • JSON_MERGE()函数已被弃用。请改用JSON_MERGE_PRESERVE()

  • SQL_CALC_FOUND_ROWS查询修饰符和相应的FOUND_ROWS()函数已被弃用。请查看FOUND_ROWS()的描述以获取替代策略的信息。

  • 截至 MySQL 8.0.13,对于CREATE TEMPORARY TABLETABLESPACE = innodb_file_per_tableTABLESPACE = innodb_temporary子句已被弃用。

  • 对于SELECT语句,在FROM之后但不是在SELECT的末尾使用INTO已被弃用,截至 MySQL 8.0.20。最好将INTO放在语句的末尾。

    对于UNION语句,截至 MySQL 8.0.20,这两个包含INTO的变体已被弃用:

    • 在查询表达式的尾部查询块中,在FROM之前使用INTO

    • 在查询表达式的括号尾部块中,无论INTO相对于FROM的位置如何,都要使用。

    请参阅第 15.2.13.1 节,“SELECT ... INTO 语句”和第 15.2.18 节,“UNION 子句”。

  • 自 MySQL 8.0.23 起,FLUSH HOSTS已被弃用。取而代之的是截断性能模式host_cache表:

    TRUNCATE TABLE performance_schema.host_cache;
    

    TRUNCATE TABLE操作需要表的DROP权限。

  • 因为其升级系统模式中的系统表和其他模式中的对象的能力已被移至 MySQL 服务器,所以已弃用mysql_upgrade客户端。请参阅第 3.4 节,“MySQL 升级过程升级了什么”。

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

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

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

  • 由于优化器的更改使其过时且无效,max_length_for_sort_data系统变量现已被弃用。

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

  • 使用MYSQL_PWD环境变量指定 MySQL 密码已被弃用。

  • 从 MySQL 8.0.20 开始,使用VALUES()来访问INSERT ... ON DUPLICATE KEY UPDATE中的新行值已被弃用。改为使用新行和列的别名。

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

  • 具有索引前缀的列从未作为表的分区键的一部分得到支持;以前,在创建、修改或升级分区表时允许这样做,但被排除在表的分区函数之外,并且服务器没有发出发生这种情况的警告。这种宽容的行为现在已被弃用,并且在将来的 MySQL 版本中,如果在分区键中使用任何这些列,将导致拒绝CREATE TABLEALTER TABLE语句。

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

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

  • 截至 MySQL 8.0.22,InnoDB memcached 插件已被弃用;预计在将来的 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 中引入的多因素认证功能。详情请参见默认认证插件。

  • --abort-slave-event-count--disconnect-slave-event-count服务器选项,由 MySQL 测试套件使用,通常不在生产中使用,从 MySQL 8.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 开始,服务器在文字值包含以下内容时会引发弃用警告:

    • 一个或多个非标准分隔符字符

    • 多余的分隔符字符

    • 除了空格字符(' ',0x20)之外的空白字符

    • 多余的空格字符

    每个时间值发出一个弃用警告,即使它有多个问题。在严格模式下,此警告不会升级为错误,因此在严格模式下执行这样一个值的INSERT仍然成功。

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

    有关更多信息和示例,请参见日期和时间上下文中的字符串和数字文字。

  • replica_parallel_type系统变量及其相关的服务器选项--replica-parallel-type从 MySQL 8.0.29 开始已被弃用。从这个版本开始,读取或设置此值会引发弃用警告;请预期它将在未来的 MySQL 版本中被移除。

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

  • --skip-host-cache服务器选项从 MySQL 8.0.30 开始已被弃用;预计在未来的 MySQL 版本中将被移除。请使用host_cache_size系统变量代替。

  • --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 INT)这样的语句现在会引发警告(ER_WARN_DEPRECATED_TO_BE_REMOVED_IDENT_FULL)。为了防止这种情况发生,更改名称或者像这里所示一样用反引号括起来(```sql):

    
    CREATE TABLE `full` (c1 INT, c2 INT);
    
    ```sql
    
    For more information, see Section 11.3, “Keywords and Reserved Words”.
    
    
  • Beginning with MySQL 8.0.32, the use of the dollar sign ($) as the leading character of an unquoted identifier is deprecated and produces a warning. Such usage is subject to removal in a future release of MySQL. This includes identifiers used as names of databases, tables, views, columns, or stored programs, as well as aliases for any of these. The dollar sign may still be used as the first character of a quoted identifier. See Section 11.2, “Schema Object Names”, for more information.

  • The binlog_format server system variable is deprecated as of MySQL 8.0.34, and is subject to being removed in a future release. Changing the binary logging format, is also deprecated, with the expectation that the removal of binlog_format will leave row-based binary logging, already the default in MySQL 8.0, as the only binary logging format used or supported by MySQL. For this reason, new MySQL installations should use only row-based binary logging; existing replication setups using binlog_format=STATEMENT or binlog_format=MIXED logging format should be migrated to the row-based format.

    The system variables log_bin_trust_function_creators and log_statements_unsafe_for_binlog, are used exclusively for statement-based logging and replication. For this reason, they are now also deprecated, and subject to removal in a future version of MySQL.

    Setting or selecting the value of binlog_format, log_bin_trust_function_creators, or log_statements_unsafe_for_binlog raises a warning in MySQL 8.0.34 and later.

  • The mysqlpump client utility program is deprecated beginning with MySQL 8.0.34, and produces a deprecation warning when invoked. This program is subject to removal in a future version of MySQL. Since MySQL provides other means of performing database dumps and backups with the same or additional functionality, including mysqldump and MySQL Shell, this program is now considered redundant.

    The associated lz4_decompress and zlib_decompress utilities are also deprecated as of MySQL 8.0.34.

  • The use of a version number without a whitespace character following (or end of comment) is deprecated as of MySQL 8.0.34, and raises a warning. This statement raises a warning in MySQL 8.0.34 or later, as shown here:

    
    mysql> CREATE TABLE t1(a INT, KEY (a)) /*!50110KEY_BLOCK_SIZE=1024*/ ENGINE=MYISAM;
    
    查询成功,影响行数为 0,警告数为 1(0.01 秒)
    
    mysql> SHOW WARNINGS\G
    
    *************************** 1\. 行 ***************************
    
    级别:警告
    
    代码:4164
    
    消息:立即在版本号后开始版本注释
    
    已弃用并可能在未来版本中更改行为。请插入
    
    版本号后的空格字符。
    
    1 行受影响(0.00 秒)
    
    ```sql
    
    To avoid such warnings, insert one or more whitespace characters after the version number, like this:
    
    

    mysql> CREATE TABLE t2(a INT, KEY (a)) /!50110 KEY_BLOCK_SIZE=1024/ ENGINE=MYISAM;

    查询成功,影响行数为 0(0.00 秒)

    
    See also Section 11.7, “Comments”.
    
    
  • As of MySQL 8.0.34, the sync_relay_log_info system variable is deprecated, along with its equivalent server startup option --sync-relay-log-info. You should expect support for this variable, and for storing replication applier metadata in a file, to be removed in a future version of MySQL. You are advised to update any of your MySQL applications which may depend on it before this occurs.

  • The binlog_transaction_dependency_tracking server system variable is deprecated as of MySQL 8.0.35, and subject to removal in a future version of MySQL. Referencing this variable or the equivalent mysqld startup option --binlog-transaction-dependency-tracking now triggers a warning. There are no plans to replace this variable or its functionality, which is expected later to be made internal to the server.

Features Removed in MySQL 8.0

The following items are obsolete and have been removed in MySQL 8.0. Where alternatives are shown, applications should be updated to use them.

For MySQL 5.7 applications that use features removed in MySQL 8.0, statements may fail when replicated from a MySQL 5.7 source to a MySQL 8.0 replica, or may have different effects on source and replica. To avoid such problems, applications that use features removed in MySQL 8.0 should be revised to avoid them and use alternatives when possible.

  • The innodb_locks_unsafe_for_binlog system variable was removed. The READ COMMITTED isolation level provides similar functionality.

  • The information_schema_stats variable, introduced in MySQL 8.0.0, was removed and replaced by information_schema_stats_expiry in MySQL 8.0.3.

    information_schema_stats_expiry defines an expiration setting for cached INFORMATION_SCHEMA table statistics. For more information, see Section 10.2.3, “Optimizing INFORMATION_SCHEMA Queries”.

  • Code related to obsolete InnoDB system tables was removed in MySQL 8.0.3. INFORMATION_SCHEMA views based on InnoDB system tables were replaced by internal system views on data dictionary tables. Affected InnoDB INFORMATION_SCHEMA views were renamed:

    Table 1.1 Renamed InnoDB Information Schema Views

    | Old Name | New Name |
    | 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 |

    After upgrading to MySQL 8.0.3 or later, update any scripts that reference previous InnoDB INFORMATION_SCHEMA view names.

  • The following features related to account management are removed:

    • Using GRANT to create users. Instead, use CREATE USER. Following this practice makes the NO_AUTO_CREATE_USER SQL mode immaterial for GRANT statements, so it too is removed, and an error now is written to the server log when the presence of this value for the sql_mode option in the options file prevents mysqld from starting.

    • Using GRANT to modify account properties other than privilege assignments. This includes authentication, SSL, and resource-limit properties. Instead, establish such properties at account-creation time with CREATE USER or modify them afterward with ALTER USER.

    • IDENTIFIED BY PASSWORD '*auth_string*' syntax for CREATE USER and GRANT. Instead, use IDENTIFIED WITH *auth_plugin* AS '*auth_string*' for CREATE USER and ALTER USER, where the '*auth_string*' value is in a format compatible with the named plugin.

      Additionally, because IDENTIFIED BY PASSWORD syntax was removed, the log_builtin_as_identified_by_password system variable is superfluous and was removed.

    • The PASSWORD() function. Additionally, PASSWORD() removal means that SET PASSWORD ... = PASSWORD('*auth_string*') syntax is no longer available.

    • The old_passwords system variable.

  • The query cache was removed. Removal includes these items:

    • The FLUSH QUERY CACHE and RESET QUERY CACHE statements.

    • These system variables: query_cache_limit, query_cache_min_res_unit, query_cache_size, query_cache_type, query_cache_wlock_invalidate.

    • These status variables: Qcache_free_blocks, Qcache_free_memory, Qcache_hits, Qcache_inserts, Qcache_lowmem_prunes, Qcache_not_cached, Qcache_queries_in_cache, Qcache_total_blocks.

    • These thread states: checking privileges on cached query, checking query cache for query, invalidating query cache entries, sending cached result to client, storing result in query cache, Waiting for query cache lock.

    • The SQL_CACHE SELECT modifier.

    These deprecated query cache items remain deprecated, but have no effect; expect them to be removed in a future MySQL release:

    • The SQL_NO_CACHE SELECT modifier.

    • The ndb_cache_check_time system variable.

    The have_query_cache system variable remains deprecated, and always has a value of NO; expect it to be removed in a future MySQL release.

  • The data dictionary provides information about database objects, so the server no longer checks directory names in the data directory to find databases. Consequently, the --ignore-db-dir option and ignore_db_dirs system variables are extraneous and are removed.

  • The DDL log, also known as the metadata log, has been removed. Beginning with MySQL 8.0.3, this functionality is handled by the data dictionary innodb_ddl_log table. See Viewing DDL Logs.

  • The tx_isolation and tx_read_only system variables have been removed. Use transaction_isolation and transaction_read_only instead.

  • The sync_frm system variable has been removed because .frm files have become obsolete.

  • The secure_auth system variable and --secure-auth client option have been removed. The MYSQL_SECURE_AUTH option for the mysql_options() C API function was removed.

  • The multi_range_count system variable is removed.

  • The log_warnings system variable and --log-warnings server option have been removed. Use the log_error_verbosity system variable instead.

  • The global scope for the sql_log_bin system variable was removed. sql_log_bin has session scope only, and applications that rely on accessing @@GLOBAL.sql_log_bin should be adjusted.

  • The metadata_locks_cache_size and metadata_locks_hash_instances system variables are removed.

  • The unused date_format, datetime_format, time_format, and max_tmp_tables system variables are removed.

  • These deprecated compatibility SQL modes are removed: DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS. They can no longer be assigned to the sql_mode system variable or used as permitted values for the mysqldump --compatible option.

    Removal of MAXDB means that the TIMESTAMP data type for CREATE TABLE or ALTER TABLE is treated as TIMESTAMP, and is no longer treated as DATETIME.

  • The deprecated ASC or DESC qualifiers for GROUP BY clauses are removed. Queries that previously relied on GROUP BY sorting may produce results that differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.

  • The EXTENDED and PARTITIONS keywords for the EXPLAIN statement have been removed. These keywords are unnecessary because their effect is always enabled.

  • These encryption-related items are removed:

    • The ENCODE() and DECODE() functions.

    • The ENCRYPT() function.

    • The DES_ENCRYPT(), and DES_DECRYPT() functions, the --des-key-file option, the have_crypt system variable, the DES_KEY_FILE option for the FLUSH statement, and the HAVE_CRYPT CMake option.

    In place of the removed encryption functions: For ENCRYPT(), consider using SHA2() instead for one-way hashing. For the others, consider using AES_ENCRYPT() and AES_DECRYPT() instead.

  • In MySQL 5.7, several spatial functions available under multiple names were deprecated to move in the direction of making the spatial function namespace more consistent, the goal being that each spatial function name begin with ST_ if it performs an exact operation, or with MBR if it performs an operation based on minimum bounding rectangles. In MySQL 8.0, the deprecated functions are removed to leave only the corresponding ST_ and MBR functions:

    • These functions are removed in favor of the MBR names: Contains(), Disjoint(), Equals(), Intersects(), Overlaps(), Within().

    • These functions are removed in favor of the ST_ names: 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(), MultiPointFromText(), MultiPointFromWKB(), MultiPolygonFromText(), MultiPolygonFromWKB(), NumGeometries(), NumInteriorRings(), NumPoints(), PointFromText(), PointFromWKB(), PointN(), PolyFromText(), PolyFromWKB(), PolygonFromText(), PolygonFromWKB(), SRID(), StartPoint(), Touches(), X(), Y().

    • GLength() is removed in favor of ST_Length().

  • The functions described in Section 14.16.4, “Functions That Create Geometry Values from WKB Values” previously accepted either WKB strings or geometry arguments. Geometry arguments are no longer permitted and produce an error. See that section for guidelines for migrating queries away from using geometry arguments.

  • The parser no longer treats \N as a synonym for NULL in SQL statements. Use NULL instead.

    This change does not affect text file import or export operations performed with LOAD DATA or SELECT ... INTO OUTFILE, for which NULL continues to be represented by \N. See Section 15.2.9, “LOAD DATA Statement”.

  • PROCEDURE ANALYSE() syntax is removed.

  • The client-side --ssl and --ssl-verify-server-cert options have been removed. Use --ssl-mode=REQUIRED instead of --ssl=1 or --enable-ssl. Use --ssl-mode=DISABLED instead of --ssl=0, --skip-ssl, or --disable-ssl. Use --ssl-mode=VERIFY_IDENTITY instead of --ssl-verify-server-cert options. (The server-side --ssl option is still available, but is deprecated as of MySQL 8.0.26 and subject to removal in a future MySQL version.)

    For the C API, MYSQL_OPT_SSL_ENFORCE and MYSQL_OPT_SSL_VERIFY_SERVER_CERT options for mysql_options() correspond to the client-side --ssl and --ssl-verify-server-cert options and are removed. Use MYSQL_OPT_SSL_MODE with an option value of SSL_MODE_REQUIRED or SSL_MODE_VERIFY_IDENTITY instead.

  • The --temp-pool server option was removed.

  • The ignore_builtin_innodb system variable is removed.

  • The server no longer performs conversion of pre-MySQL 5.1 database names containing special characters to 5.1 format with the addition of a #mysql50# prefix. Because these conversions are no longer performed, the --fix-db-names and --fix-table-names options for mysqlcheck, the UPGRADE DATA DIRECTORY NAME clause for the ALTER DATABASE statement, and the Com_alter_db_upgrade status variable are removed.

    Upgrades are supported only from one major version to another (for example, 5.0 to 5.1, or 5.1 to 5.5), so there should be little remaining need for conversion of older 5.0 database names to current versions of MySQL. As a workaround, upgrade a MySQL 5.0 installation to MySQL 5.1 before upgrading to a more recent release.

  • The mysql_install_db program has been removed from MySQL distributions. Data directory initialization should be performed by invoking mysqld with the --initialize or --initialize-insecure option instead. In addition, the --bootstrap option for mysqld that was used by mysql_install_db was removed, and the INSTALL_SCRIPTDIR CMake option that controlled the installation location for mysql_install_db was removed.

  • The generic partitioning handler was removed from the MySQL server. In order to support partitioning of a given table, the storage engine used for the table must now provide its own (“native”) partitioning handler. The --partition and --skip-partition options are removed from the MySQL Server, and partitioning-related entries are no longer shown in the output of SHOW PLUGINS or in the Information Schema PLUGINS table.

    Two MySQL storage engines currently provide native partitioning support: InnoDB and NDB. Of these, only InnoDB is supported in MySQL 8.0. Any attempt to create partitioned tables in MySQL 8.0 using any other storage engine fails.

    **Ramifications for upgrades. ** The direct upgrade of a partitioned table using a storage engine other than InnoDB (such as MyISAM) from MySQL 5.7 (or earlier) to MySQL 8.0 is not supported. There are two options for handling such a table:

    • Remove the table's partitioning, using ALTER TABLE ... REMOVE PARTITIONING.

    • Change the storage engine used for the table to InnoDB, with ALTER TABLE ... ENGINE=INNODB.

    At least one of the two operations just listed must be performed for each partitioned non-InnoDB table prior to upgrading the server to MySQL 8.0. Otherwise, such a table cannot be used following the upgrade.

    Due to the fact that table creation statements that would result in a partitioned table using a storage engine without partitioning support now fail with an error (ER_CHECK_NOT_IMPLEMENTED), you must make sure that any statements in a dump file (such as that written by mysqldump) from an older version of MySQL that you wish to import into a MySQL 8.0 server that create partitioned tables do not also specify a storage engine such as MyISAM that has no native partitioning handler. You can do this by performing either of the following:

    • Remove any references to partitioning from CREATE TABLE statements that use a value for the STORAGE ENGINE option other than InnoDB.

    • Specifying the storage engine as InnoDB, or allow InnoDB to be used as the table's storage engine by default.

    For more information, see Section 26.6.2, “Partitioning Limitations Relating to Storage Engines”.

  • System and status variable information is no longer maintained in the INFORMATION_SCHEMA. These tables are removed: GLOBAL_VARIABLES, SESSION_VARIABLES, GLOBAL_STATUS, SESSION_STATUS. Use the corresponding Performance Schema tables instead. See Section 29.12.14, “Performance Schema System Variable Tables”, and Section 29.12.15, “Performance Schema Status Variable Tables”. In addition, the show_compatibility_56 system variable was removed. It was used in the transition period during which system and status variable information in INFORMATION_SCHEMA tables was moved to Performance Schema tables, and is no longer needed. These status variables are removed: Slave_heartbeat_period, Slave_last_heartbeat, Slave_received_heartbeats, Slave_retried_transactions, Slave_running. The information they provided is available in Performance Schema tables; see Migrating to Performance Schema System and Status Variable Tables.

  • The Performance Schema setup_timers table was removed, as was the TICK row in the performance_timers table.

  • The libmysqld embedded server library is removed, along with:

    • The mysql_options() MYSQL_OPT_GUESS_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, MYSQL_OPT_USE_REMOTE_CONNECTION, and MYSQL_SET_CLIENT_IP options

    • The mysql_config --libmysqld-libs, --embedded-libs, and --embedded options

    • The CMake WITH_EMBEDDED_SERVER, WITH_EMBEDDED_SHARED_LIBRARY, and INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR options

    • The (undocumented) mysql --server-arg option

    • The mysqltest --embedded-server, --server-arg, and --server-file options

    • The mysqltest_embedded and mysql_client_test_embedded test programs

  • The mysql_plugin utility was removed. Alternatives include loading plugins at server startup using the --plugin-load or --plugin-load-add option, or at runtime using the INSTALL PLUGIN statement.

  • The resolveip utility is removed. nslookup, host, or dig can be used instead.

  • The resolve_stack_dump utility is removed. Stack traces from official MySQL builds are always symbolized, so there is no need to use resolve_stack_dump.

  • The following server error codes are not used and have been removed. Applications that test specifically for any of these errors should be updated.

    
    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表已被移除。请改用性能模式data_locksdata_lock_waits表。

    Note

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

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

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

    通过这个改变,在服务器离线时通过手动修改.isl文件来移动远程表空间不再受支持。现在通过innodb_directories选项支持移动远程表空间文件。参见第 17.6.3.6 节,“服务器离线时移动表空间文件”。

  • 已移除以下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信息模式表中移除。

  • 已移除innodb_support_xa系统变量,该变量启用 XA 事务中的两阶段提交支持。InnoDB对 XA 事务中的两阶段提交始终启用。

  • 不再支持 DTrace。

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

  • MySQL 8.0.13 版本中移除了将表分区放置在共享 InnoDB 表空间中的支持。共享表空间包括 InnoDB 系统表空间和通用表空间。有关识别共享表空间中的分区并将其移动到每个表的文件表空间的信息,请参见 Section 3.6, “Preparing Your Installation for Upgrade”。

  • MySQL 8.0.13 版本中弃用了在除 SET 之外的语句中设置用户变量的功能。此功能可能在 MySQL 8.4 中移除。

  • --ndb 选项已被移除。请改用 ndb_perror 实用程序。

  • innodb_undo_logs 变量已被移除。innodb_rollback_segments 变量执行相同功能,应该代替使用。

  • Innodb_available_undo_logs 状态变量已被移除。每个表空间可用的回滚段数量可以通过 SHOW VARIABLES LIKE 'innodb_rollback_segments'; 获取。

  • 截至 MySQL 8.0.14 版本,先前弃用的 innodb_undo_tablespaces 变量不再可配置。更多信息,请参见 Section 17.6.3.4, “Undo Tablespaces”。

  • 已移除对 ALTER TABLE ... UPGRADE PARTITIONING 语句的支持。

  • 截至 MySQL 8.0.16 版本,已移除对 internal_tmp_disk_storage_engine 系统变量的支持;磁盘上的内部临时表现在始终使用 InnoDB 存储引擎。更多信息,请参见 Storage Engine for On-Disk Internal Temporary Tables。

  • 未使用的 DISABLE_SHARED CMake 选项已被移除。

  • myisam_repair_threads 系统变量已在 MySQL 8.0.30 版本中移除。

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

原文:dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html

  • MySQL 8.0 中新增的选项和变量

  • MySQL 8.0 中已弃用的选项和变量

  • MySQL 8.0 中已删除的选项和变量

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

MySQL 8.0 中新增的选项和变量

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

  • 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: 写入的审计事件的总大小。MySQL 8.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 语句的计数。MySQL 8.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 语句的计数。MySQL 8.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: UNINSTALL COMPONENT 语句的计数。MySQL 8.0.0 版本中添加。

  • Compression_algorithm: 当前连接的压缩算法。MySQL 8.0.18 版本中添加。

  • Compression_level: 当前连接的压缩级别。MySQL 8.0.18 版本中添加。

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

  • Current_tls_ca: ssl_ca 系统变量的当前值。MySQL 8.0.16 版本中添加。

  • 当前 _tls_ca 路径: ssl_capath 系统变量的当前值。MySQL 8.0.16 中添加。

  • 当前 _tls 证书: ssl_cert 系统变量的当前值。MySQL 8.0.16 中添加。

  • 当前 _tls 密码: ssl_cipher 系统变量的当前值。MySQL 8.0.16 中添加。

  • 当前 _tls 密码套件: tsl_ciphersuites 系统变量的当前值。MySQL 8.0.16 中添加。

  • 当前 _tls_crl: ssl_crl 系统变量的当前值。MySQL 8.0.16 中添加。

  • 当前 _tls_crl 路径: ssl_crlpath 系统变量的当前值。MySQL 8.0.16 中添加。

  • 当前 _tls 密钥: ssl_key 系统变量的当前值。MySQL 8.0.16 中添加。

  • 当前 _tls 版本: tls_version 系统变量的当前值。MySQL 8.0.16 中添加。

  • 错误日志缓冲字节: error_log 表中使用的字节数。MySQL 8.0.22 中添加。

  • 错误日志缓冲事件: error_log 表中的事件数量。MySQL 8.0.22 中添加。

  • 错误日志过期事件: 从 error_log 表中丢弃的事件数量。MySQL 8.0.22 中添加。

  • 错误日志最新写入时间: 写入 error_log 表的最后时间。MySQL 8.0.22 中添加。

  • 防火墙访问被拒绝: MySQL 企业防火墙拒绝的语句数量。MySQL 8.0.11 中添加。

  • 防火墙访问已授权: MySQL 企业防火墙接受的语句数量。MySQL 8.0.11 中添加。

  • 防火墙缓存条目: MySQL 企业防火墙记录的语句数量。MySQL 8.0.11 中添加。

  • 全局连接内存: 当前所有用户线程使用的内存量。MySQL 8.0.28 中添加。

  • Innodb 缓冲池调整状态代码: InnoDB 缓冲池调整状态代码。MySQL 8.0.31 中添加。

  • Innodb 缓冲池调整状态进度: InnoDB 缓冲池调整状态进度。MySQL 8.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: 刷新到磁盘的重做日志 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: 重做日志调整大小状态。MySQL 8.0.30 中添加。

  • Innodb_redo_log_uuid: 重做日志 UUID。MySQL 8.0.30 中添加。

  • Innodb_system_rows_deleted: 从系统模式表中删除的行数。MySQL 8.0.19 中添加。

  • Innodb_system_rows_inserted: 插入到系统模式表中的行数。MySQL 8.0.19 中添加。

  • Innodb_system_rows_read: 从系统模式表中读取的行数。MySQL 8.0.19 中添加。

  • Innodb_undo_tablespaces_active: 活跃的撤销表空间数量。MySQL 8.0.14 中添加。

  • Innodb_undo_tablespaces_explicit: 用户创建的撤销表空间数量。MySQL 8.0.14 中添加。

  • Innodb_undo_tablespaces_implicit: InnoDB 创建的撤销表空间数量。MySQL 8.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: 作为压缩消息负载发送的字节数,压缩后测量。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: 调用时间函数时源端失败的次数。在 MySQL 8.0.26 中添加。

  • Rpl_semi_sync_source_tx_avg_wait_time: 每个事务源端等待的平均时间。在 MySQL 8.0.26 中添加。

  • Rpl_semi_sync_source_tx_wait_time: 源端等待事务的总时间。在 MySQL 8.0.26 中添加。

  • Rpl_semi_sync_source_tx_waits: 源端等待事务的总次数。在 MySQL 8.0.26 中添加。

  • Rpl_semi_sync_source_wait_pos_backtraverse: 源端等待具有比之前等待的事件更低的二进制坐标的总次数。在 MySQL 8.0.26 中添加。

  • Rpl_semi_sync_source_wait_sessions: 当前正在等待复制回复的会话数。在 MySQL 8.0.26 中添加。

  • Rpl_semi_sync_source_yes_tx: 成功确认的提交次数。在 MySQL 8.0.26 中添加。

  • Secondary_engine_execution_count: 转移到辅助引擎的查询数量。在 MySQL 8.0.13 中添加。

  • Ssl_session_cache_timeout: 缓存中当前 SSL 会话超时值。在 MySQL 8.0.29 中添加。

  • Telemetry_traces_supported: 是否支持服务器遥测跟踪。在 MySQL 8.0.33 中添加。

  • Tls_library_version: 使用的 OpenSSL 库的运行时版本。在 MySQL 8.0.30 中添加。

  • activate_all_roles_on_login: 是否在连接时激活所有用户角色。在 MySQL 8.0.2 中添加。

  • admin-ssl: 启用连接加密。在 MySQL 8.0.21 中添加。

  • admin_address: 用于管理接口连接的绑定 IP 地址。在 MySQL 8.0.14 中添加。

  • admin_port: 用于管理接口连接的 TCP/IP 号码。在 MySQL 8.0.14 中添加。

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

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

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

  • admin_ssl_cipher: 连接加密的允许密码。在 MySQL 8.0.21 中添加。

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

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

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

  • admin_tls_ciphersuites: 加密连接的允许 TLSv1.3 密码套件。在 MySQL 8.0.21 中添加。

  • admin_tls_version: 加密连接的允许 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: 存储审计表的模式。在 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: 是否执行内存缓存的定期刷新。在 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 审计日志文件的组合大小限制。在 MySQL 8.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: 在达到此大小时关闭并重新打开审计日志文件。在 MySQL 8.0.11 中添加。

  • audit_log_statement_policy: 与语句相关事件的审计日志策略。在 MySQL 8.0.11 中添加。

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

  • authentication_fido_rp_id: 用于 FIDO 多因素认证的 Relying party ID。在 MySQL 8.0.27 中添加。

  • authentication_kerberos_service_key_tab: 包含用于认证 TGS 票证的 Kerberos 服务密钥的文件。在 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 服务器根绑定密码。在 MySQL 8.0.11 中添加。

  • authentication_ldap_sasl_ca_path: LDAP 服务器证书颁发机构文件名。在 MySQL 8.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 服务器初始连接池大小。在 MySQL 8.0.11 中添加。

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

  • authentication_ldap_sasl_max_pool_size: LDAP 服务器最大连接池大小。在 MySQL 8.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 服务器根绑定密码。在 MySQL 8.0.11 中添加。

  • authentication_ldap_simple_ca_path: LDAP 服务器证书颁发机构文件名。在 MySQL 8.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 服务器初始连接池大小。在 MySQL 8.0.11 中添加。

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

  • authentication_ldap_simple_max_pool_size: LDAP 服务器最大连接池大小。在 MySQL 8.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: 多因素认证插件。在 MySQL 8.0.27 中添加。

  • authentication_windows_log_level: Windows 认证插件日志级别。在 MySQL 8.0.11 中添加。

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

  • binlog_encryption: 启用此服务器上二进制日志文件和中继日志文件的加密。MySQL 8.0.14 中添加。

  • binlog_expire_logs_auto_purge: 控制二进制日志文件的自动清理;当启用时,可以通过将 binlog_expire_logs_seconds 和 expire_logs_days 都设置为 0 来覆盖。MySQL 8.0.29 中添加。

  • binlog_expire_logs_seconds: 在此多少秒后清除二进制日志。MySQL 8.0.1 中添加。

  • binlog_rotate_encryption_master_key_at_startup: 在服务器启动时旋转二进制日志主密钥。MySQL 8.0.14 中添加。

  • binlog_row_metadata: 在使用基于行的日志记录时,是否记录所有或仅最小的与表相关的元数据到二进制日志中。MySQL 8.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: 用于评估哪些事务可以由副本的多线程应用程序并行执行的依赖信息来源(提交时间戳或事务写入集)。MySQL 8.0.1 中添加。

  • build_id: 在编译时生成的唯一构建 ID(仅限 Linux)。MySQL 8.0.31 中添加。

  • caching_sha2_password_auto_generate_rsa_keys: 是否自动生成 RSA 密钥对文件。MySQL 8.0.4 中添加。

  • caching_sha2_password_digest_rounds: caching_sha2_password 认证插件的哈希轮数。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 中添加。

  • clone_autotune_concurrency: 启用动态生成线程以进行远程克隆操作。MySQL 8.0.17 中添加。

  • clone_block_ddl: 在克隆操作期间启用独占备份锁。MySQL 8.0.27 中添加。

  • clone_buffer_size: 定义在捐赠者 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: 指定公钥证书文件的路径。MySQL 8.0.14 中添加。

  • clone_ssl_key: 指定私钥文件的路径。MySQL 8.0.14 中添加。

  • clone_valid_donor_list: 定义远程克隆操作的捐赠主机地址。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: 服务器响应失败连接尝试的最大延迟时间(毫秒)。MySQL 8.0.1 中添加。

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

  • connection_memory_chunk_size: 仅当用户内存使用量变化达到或超过此数量时才更新 Global_connection_memory;0 表示禁用更新。MySQL 8.0.28 中添加。

  • connection_memory_limit: 任何用户连接可以消耗的最大内存量,在此之前该用户的所有查询都将被拒绝。不适用于 MySQL root 等系统用户。MySQL 8.0.28 中添加。

  • create_admin_listener_thread: 是否使用专用监听线程处理管理接口上的连接。MySQL 8.0.14 中添加。

  • cte_max_recursion_depth: 公共表达式的最大递归深度。MySQL 8.0.3 中添加。

  • ddl-rewriter: 是否激活 ddl_rewriter 插件。MySQL 8.0.16 中添加。

  • default_collation_for_utf8mb4: utf8mb4 字符集的默认排序规则;仅供 MySQL 复制内部使用。MySQL 8.0.11 中添加。

  • default_table_encryption: 默认模式和表空间加密设置。MySQL 8.0.16 中添加。

  • dragnet.Status: 最近一次对 dragnet.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 企业加密生成的 RSA 密钥的最大大小。在 MySQL 8.0.30 中添加。

  • enterprise_encryption.rsa_support_legacy_padding: 解密和验证传统的 MySQL 企业加密内容。在 MySQL 8.0.30 中添加。

  • explain_format: 决定 EXPLAIN 语句使用的默认输出格式。在 MySQL 8.0.32 中添加。

  • generated_random_password_length: 生成密码的最大长度。在 MySQL 8.0.18 中添加。

  • global_connection_memory_limit: 所有用户连接可以消耗的最大内存总量。当 Global_connection_memory 超出时,所有常规用户的查询都将被拒绝。不适用于 MySQL root 等系统用户。在 MySQL 8.0.28 中添加。

  • global_connection_memory_tracking: 是否计算全局连接内存使用情况(如 Global_connection_memory 所示);默认为禁用。在 MySQL 8.0.28 中添加。

  • group_replication_advertise_recovery_endpoints: 分布式恢复提供的连接。在 MySQL 8.0.21 中添加。

  • group_replication_autorejoin_tries: 成员自动重新加入组的尝试次数。在 MySQL 8.0.16 中添加。

  • group_replication_clone_threshold: 捐赠者和接收者之间的事务编号差距,超过该差距时,将使用远程克隆操作进行状态传输。在 MySQL 8.0.17 中添加。

  • group_replication_communication_debug_options: Group Replication 组件的调试消息级别。在 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: 组提供的事务一致性保证类型。在 MySQL 8.0.14 中添加。

  • group_replication_exit_state_action: 实例在非自愿离开组时的行为。在 MySQL 8.0.12 中添加。

  • group_replication_flow_control_hold_percent: 保留未使用的组配额的百分比。在 MySQL 8.0.2 中添加。

  • group_replication_flow_control_max_quota: 组的最大流控配额。在 MySQL 8.0.2 中添加。

  • group_replication_flow_control_member_quota_percent: 计算配额时成员应该假定可用于自身的配额百分比。在 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: 定义流控迭代之间等待的秒数。在 MySQL 8.0.2 中添加。

  • group_replication_flow_control_release_percent: 当流控不再需要限制写入成员时,应如何释放组配额。在 MySQL 8.0.2 中添加。

  • group_replication_ip_allowlist: 允许连接到组的主机列表(MySQL 8.0.22 及更高版本)。在 MySQL 8.0.22 中添加。

  • group_replication_member_expel_timeout: 成员被怀疑失败和被从组中驱逐之间的时间,导致组成员重新配置。在 MySQL 8.0.13 中添加。

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

  • group_replication_message_cache_size: 组通信引擎消息缓存(XCom)的最大内存。在 MySQL 8.0.16 中添加。

  • group_replication_paxos_single_leader: 在单主模式中使用单一共识领导者。在 MySQL 8.0.27 中添加。

  • group_replication_recovery_compression_algorithms: 用于传出恢复连接的允许压缩算法。在 MySQL 8.0.18 中添加。

  • group_replication_recovery_get_public_key: 是否接受从捐赠者获取公钥的偏好。在 MySQL 8.0.4 中添加。

  • group_replication_recovery_public_key_path: 接受公钥信息。在 MySQL 8.0.4 中添加。

  • group_replication_recovery_tls_ciphersuites: 当 TLSv1.3 用于与此实例作为客户端(加入成员)连接加密时,允许的密码套件。在 MySQL 8.0.19 中添加。

  • group_replication_recovery_tls_version: 作为客户端(加入成员)连接加密的允许 TLS 协议。在 MySQL 8.0.19 中添加。

  • group_replication_recovery_zstd_compression_level: 用于使用 zstd 压缩的恢复连接的压缩级别。在 MySQL 8.0.18 中添加。

  • group_replication_tls_source: Group Replication 的 TLS 材料来源。在 MySQL 8.0.21 中添加。

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

  • group_replication_view_change_uuid: 视图更改事件 GTIDs 的 UUID。在 MySQL 8.0.26 中添加。

  • histogram_generation_max_mem_size: 创建直方图统计信息的最大内存。在 MySQL 8.0.2 中添加。

  • immediate_server_version: 作为即时复制源的服务器的 MySQL 服务器发布号。在 MySQL 8.0.14 中添加。

  • information_schema_stats_expiry: 缓存表统计信息的过期设置。在 MySQL 8.0.3 中添加。

  • init_replica: 当副本连接到源时执行的语句。在 MySQL 8.0.26 中添加。

  • innodb_buffer_pool_debug: 当缓冲池小于 1GB 时,允许多个缓冲池实例。MySQL 8.0.0 中添加。

  • innodb_buffer_pool_in_core_file: 控制将缓冲池页面写入核心文件。MySQL 8.0.14 中添加。

  • innodb_checkpoint_disabled: 禁用检查点,以便故意服务器退出始终启动恢复。MySQL 8.0.2 中添加。

  • innodb_ddl_buffer_size: DDL 操作的最大缓冲区大小。MySQL 8.0.27 中添加。

  • innodb_ddl_log_crash_reset_debug: 重置 DDL 日志崩溃注入计数器的调试选项。MySQL 8.0.3 中添加。

  • innodb_ddl_threads: 用于索引创建的最大并行线程数。MySQL 8.0.27 中添加。

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

  • innodb_dedicated_server: 启用缓冲池大小、日志文件大小���刷新方法的自动配置。MySQL 8.0.3 中添加。

  • innodb_directories: 定义在启动时扫描表空间数据文件的目录。MySQL 8.0.4 中添加。

  • innodb_doublewrite_batch_size: 每批写入的双写页数。MySQL 8.0.20 中添加。

  • innodb_doublewrite_dir: 双写缓冲文件目录。MySQL 8.0.20 中添加。

  • innodb_doublewrite_files: 双写文件数。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/O 操作。MySQL 8.0.18 中添加。

  • innodb_log_checkpoint_fuzzy_now: 强制 InnoDB 写入模糊检查点的调试选项。MySQL 8.0.13 中添加。

  • innodb_log_spin_cpu_abs_lwm: 在等待刷新的重做时,用户线程不再自旋的最低 CPU 使用量。MySQL 8.0.11 中添加。

  • innodb_log_spin_cpu_pct_hwm: 在等待刷新的重做时,用户线程不再自旋的最大 CPU 使用量。MySQL 8.0.11 中添加。

  • innodb_log_wait_for_flush_spin_hwm: 超过平均日志刷新时间的最大值时,用户线程不再自旋等待刷新的重做。MySQL 8.0.11 中添加。

  • innodb_log_writer_threads: 启用专用的日志写入线程来写入和刷新重做日志。MySQL 8.0.22 中添加。

  • innodb_parallel_read_threads: 并行索引读取线程数。MySQL 8.0.14 中添加。

  • innodb_print_ddl_logs: 是否将 DDL 日志打印到错误日志中。MySQL 8.0.3 中添加。

  • innodb_redo_log_archive_dirs: 标记的重做日志归档目录。MySQL 8.0.17 中添加。

  • innodb_redo_log_capacity: 重做日志文件的大小限制。MySQL 8.0.30 中添加。

  • innodb_redo_log_encrypt: 控制加密表空间的重做日志数据的加密。MySQL 8.0.1 中添加。

  • innodb_scan_directories: 定义在 InnoDB 恢复期间扫描表空间文件的目录。MySQL 8.0.2 中添加。

  • innodb_segment_reserve_factor: 作为空页保留的表空间文件段页面的百分比。MySQL 8.0.26 中添加。

  • innodb_spin_wait_pause_multiplier: 用于确定自旋等待循环中 PAUSE 指令数量的乘数值。MySQL 8.0.16 中添加。

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

  • innodb_temp_tablespaces_dir: 会话临时表空间路径。MySQL 8.0.13 中添加。

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

  • innodb_undo_log_encrypt: 控制加密表空间的撤销日志数据的加密。MySQL 8.0.1 中添加。

  • innodb_use_fdatasync: 当刷新数据到操作系统时,InnoDB 是否使用 fdatasync() 而不是 fsync()。在 MySQL 8.0.26 中添加。

  • innodb_validate_tablespace_paths: 启用启动时的表空间路径验证。在 MySQL 8.0.21 中添加。

  • internal_tmp_mem_storage_engine: 用于内部内存临时表的存储引擎。在 MySQL 8.0.2 中添加。

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

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

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

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

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

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

  • keyring-migration-to-component: 密钥迁移是从插件到组件。在 MySQL 8.0.24 中添加。

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

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

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

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

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

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

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

  • keyring_hashicorp_auth_path: HashiCorp Vault AppRole 认证路径。在 MySQL 8.0.18 中添加。

  • keyring_hashicorp_ca_path: keyring_hashicorp CA 文件路径。在 MySQL 8.0.18 中添加。

  • keyring_hashicorp_caching: 是否启用 keyring_hashicorp 缓存。在 MySQL 8.0.18 中添加。

  • keyring_hashicorp_commit_auth_path: 使用的 keyring_hashicorp_auth_path 值。在 MySQL 8.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 值。在 MySQL 8.0.18 中添加。

  • keyring_hashicorp_commit_store_path: 使用的 keyring_hashicorp_store_path 值。在 MySQL 8.0.18 中添加。

  • keyring_hashicorp_role_id: HashiCorp Vault AppRole 认证角色 ID。在 MySQL 8.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 证书文件。在 MySQL 8.0.22 中添加。

  • keyring_oci_compartment: OCI compartment 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_secrets_endpoint: OCI 秘密服务器端点。在 MySQL 8.0.22 中添加。

  • keyring_oci_tenancy: 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 工具。在 MySQL 8.0.17 中添加。

  • lock_order_debug_loop: 当 LOCK_ORDER 工具遇到标记为循环的依赖关系时,是否引发调试断言。在 MySQL 8.0.17 中添加。

  • lock_order_debug_missing_arc: 当 LOCK_ORDER 工具遇到未声明的依赖关系时,是否引发调试断言。在 MySQL 8.0.17 中添加。

  • lock_order_debug_missing_key: 当 LOCK_ORDER 工具遇到未正确使用性能模式进行仪器化的对象时,是否引发调试断言。在 MySQL 8.0.17 中添加。

  • lock_order_debug_missing_unlock: 当 LOCK_ORDER 工具遇到仍在持有的锁被销毁时,是否引发调试断言。在 MySQL 8.0.17 中添加。

  • lock_order_dependencies: lock_order_dependencies.txt 文件的路径。在 MySQL 8.0.17 中添加。

  • lock_order_extra_dependencies: 第二个依赖文件的路径。在 MySQL 8.0.17 中添加。

  • lock_order_output_directory: LOCK_ORDER 工具写入日志的目录。在 MySQL 8.0.17 中添加。

  • lock_order_print_txt: 是否执行锁定顺序图分析并打印文本报告。在 MySQL 8.0.17 中添加。

  • lock_order_trace_loop: 当 LOCK_ORDER 工具遇到标记为循环的依赖关系时,是否打印日志文件跟踪。在 MySQL 8.0.17 中添加。

  • lock_order_trace_missing_arc: 当 LOCK_ORDER 工具遇到未声明的依赖关系时,是否打印日志文件跟踪。在 MySQL 8.0.17 中添加。

  • lock_order_trace_missing_key: 当 LOCK_ORDER 工具遇到未正确使用性能模式进行仪表化的对象时,是否打印日志文件跟踪。在 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: 是否应该将副本的复制 SQL 线程执行的更新记录到自己的二进制日志中。在 MySQL 8.0.26 中添加。

  • log_slow_extra: 是否向慢查询日志文件写入额外信息。在 MySQL 8.0.14 中添加。

  • log_slow_replica_statements: 导致副本执行的慢查询被写入慢查询日志。在 MySQL 8.0.26 中添加。

  • mandatory_roles: 自动授予所有用户的角色。在 MySQL 8.0.2 中添加。

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

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

  • mysqlx: X 插件是否已初始化。在 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: X 协议连接上 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: X 协议连接上 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: X 协议连接上 zstd 算法的最大允许压缩级别。MySQL 8.0.20 中添加。

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

  • no-dd-upgrade: 防止启动时自动升级数据字典表。MySQL 8.0.4 中添加。

  • no-monitor: 不要为 RESTART 需要的监视进程分叉。MySQL 8.0.12 中添加。

  • original_commit_timestamp: 事务在原始源上提交的时间。MySQL 8.0.1 中添加。

  • original_server_version: 事务最初提交的 MySQL 服务器发布版本号。MySQL 8.0.14 中添加。

  • partial_revokes: 是否启用部分撤销。MySQL 8.0.16 中添加。

  • password_history: 在重复使用密码之前需要更改的次数。MySQL 8.0.3 中添加。

  • password_require_current: 密码更改是否需要当前密码验证。MySQL 8.0.13 中添加。

  • password_reuse_interval: 在重复使用密码之前需要经过的天数。MySQL 8.0.3 中添加。

  • performance-schema-consumer-events-statements-cpu: 配置语句 CPU 使用情况消费者。MySQL 8.0.28 中添加。

  • performance_schema_max_digest_sample_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,以十六进制打印包含不可打印字符的哈希值。MySQL 8.0.17 中添加。

  • protocol_compression_algorithms: 用于传入连接的允许压缩算法。MySQL 8.0.18 中添加。

  • pseudo_replica_mode: 供内部服务器使用。MySQL 8.0.26 中添加。

  • regexp_stack_limit: 正则表达式匹配堆栈大小限制。MySQL 8.0.4 中添加。

  • regexp_time_limit: 正则表达式匹配超时时间。MySQL 8.0.4 中添加。

  • replica_checkpoint_group: 多线程复制处理的最大事务数,在调用检查点操作以更新进度状态之前。不支持 NDB Cluster。MySQL 8.0.26 中添加。

  • replica_checkpoint_period: 更新多线程复制的进度状态,并在此毫秒数后将中继日志信息刷新到磁盘。不受 NDB Cluster 支持。在 MySQL 8.0.26 中添加。

  • replica_compressed_protocol: 使用源/复制协议的压缩。在 MySQL 8.0.26 中添加。

  • replica_exec_mode: 允许在 IDEMPOTENT 模式(键和一些其他错误被抑制)和 STRICT 模式之间切换复制线程;STRICT 模式是默认的,除了 NDB Cluster,在那里始终使用 IDEMPOTENT。在 MySQL 8.0.26 中添加。

  • replica_load_tmpdir: 复制时复制应该将其临时文件放置的位置 LOAD DATA 语句。在 MySQL 8.0.26 中添加。

  • replica_max_allowed_packet: 可以从复制源服务器发送到复制品的数据包的最大大小(以字节为单位);覆盖 max_allowed_packet。在 MySQL 8.0.26 中添加。

  • replica_net_timeout: 等待来自源/复制连接的更多数据的秒数,然后中止读取。在 MySQL 8.0.26 中添加。

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

  • replica_parallel_workers: 用于执行复制事务的应用程序线程数;当为 0 或 1 时,只有一个应用程序线程。NDB Cluster:请参阅文档。在 MySQL 8.0.26 中添加。

  • replica_pending_jobs_size_max: 持有尚未应用的事件的复制工作者队列的最大大小。在 MySQL 8.0.26 中添加。

  • replica_preserve_commit_order: 确保复制工作者的所有提交按照源上的顺序发生,以保持一致性在使用并行应用程序线程时。在 MySQL 8.0.26 中添加。

  • replica_skip_errors: 告诉复制线程在查询从提供的列表返回错误时继续复制。在 MySQL 8.0.26 中添加。

  • replica_sql_verify_checksum: 导致复制在从中继日志读取时检查校验和。在 MySQL 8.0.26 中添加。

  • replica_transaction_retries: 在事务由于死锁或超时而失败时,复制 SQL 线程重试事务的次数,然后放弃并停止。MySQL 8.0.26 中添加。

  • replica_type_conversions: 控制副本上的类型转换模式。值是以下列表中零个或多个元素的列表:ALL_LOSSY,ALL_NON_LOSSY。设置为空字符串以禁止源端和副本之间的类型转换。MySQL 8.0.26 中添加。

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

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

  • require_row_format: 供内部服务器使用。MySQL 8.0.19 中添加。

  • resultset_metadata: 服务器是否返回结果集元数据。MySQL 8.0.3 中添加。

  • rewriter_enabled_for_threads_without_privilege_checks: 如果设置为 OFF,则对于执行时禁用权限检查的复制线程(PRIVILEGE_CHECKS_USER 为 NULL)跳过重写。MySQL 8.0.31 中添加。

  • rpl_read_size: 从二进制日志文件和中继日志文件中读取的最小数据量(以字节为单位)。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: 是否源在没有副本的情况下等待超时。在 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: 可以在字典对象缓存中保留的模式定义对象的数量。在 MySQL 8.0.0 中添加。

  • secondary_engine_cost_threshold: 查询转移到辅助引擎的优化器成本阈值。在 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 导出文件缓冲区后的延迟时间(以毫秒为单位),否则不起作用。在 MySQL 8.0.22 中添加。

  • show-replica-auth-info: 在此源上的 SHOW REPLICAS 中显示用户名和密码。在 MySQL 8.0.26 中添加。

  • show_create_table_skip_secondary_engine: 是否从 SHOW CREATE 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 表中显示生成的不可见主键。在 MySQL 8.0.30 中添加。

  • skip-replica-start: 如果设置,则在副本服务器启动时不会自动启动复制。在 MySQL 8.0.26 中添加。

  • source_verify_checksum: 导致源在从二进制日志读取时检查校验和。在 MySQL 8.0.26 中添加。

  • sql_generate_invisible_primary_key: 是否为在此服务器上创建的任何没有显式主键的 InnoDB 表生成不可见主键。MySQL 8.0.30 中添加。

  • sql_replica_skip_counter: 复制应跳过的源事件数量。与 GTID 复制不兼容。MySQL 8.0.26 中添加。

  • sql_require_primary_key: 表是否必须有主键。MySQL 8.0.13 中添加。

  • ssl_fips_mode: 是否在服务器端启用 FIPS 模式。MySQL 8.0.11 中添加。

  • ssl_session_cache_mode: 是否启用服务器生成会话票据。MySQL 8.0.29 中添加。

  • ssl_session_cache_timeout: SSL 会话超时值(秒)。MySQL 8.0.29 中添加。

  • sync_source_info: 每 # 个事件后同步源信息。MySQL 8.0.26 中添加。

  • syseventlog.facility: syslog 消息的设施。MySQL 8.0.13 中添加。

  • syseventlog.include_pid: 是否在 syslog 消息中包含服务器 PID。MySQL 8.0.13 中添加。

  • syseventlog.tag: syslog 消息中服务器标识符的标记。MySQL 8.0.13 中添加。

  • table_encryption_privilege_check: 启用 TABLE_ENCRYPTION_ADMIN 权限检查。MySQL 8.0.16 中添加。

  • tablespace_definition_cache: 可以保存在字典对象缓存中的表空间定义对象的数量。MySQL 8.0.0 中添加。

  • temptable_max_mmap: TempTable 存储引擎可以从内存映射临时文件中分配的最大内存量。MySQL 8.0.23 中添加。

  • temptable_max_ram: 定义在数据存储在磁盘之前 TempTable 存储引擎可以占用的最大内存量。MySQL 8.0.2 中添加。

  • temptable_use_mmap: 定义当达到 temptable_max_ram 阈值时,TempTable 存储引擎是否分配内存映射文件。MySQL 8.0.16 中添加。

  • terminology_use_previous: 在不兼容更改的情况下使用指定版本之前的术语。MySQL 8.0.26 中添加。

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

  • thread_pool_dedicated_listeners: 在每个线程组中专门指定一个监听线程以监听网络事件。MySQL 8.0.23 中添加。

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

  • thread_pool_max_active_query_threads: 每个组的活动查询线程的最大允许数量。MySQL 8.0.19 中添加。

  • thread_pool_max_transactions_limit: 线程池操作期间允许的最大事务数。MySQL 8.0.23 中添加。

  • thread_pool_max_unused_threads: 最大允许的未使用线程数。MySQL 8.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: 语句被定义为停滞之前的时间。MySQL 8.0.11 中添加。

  • thread_pool_transaction_delay: 线程池执行新事务之前的延迟时间。MySQL 8.0.31 中添加。

  • tls_ciphersuites: 用于加密连接的 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: 是否检查密码与用户名是否匹配。MySQL 8.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 要求的密码长度。在 MySQL 8.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: 客户端连接是否在客户端/服务器协议中使用压缩。在 MySQL 8.0.18 中已弃用。

  • 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 中已弃用。

  • audit_log_policy: 审计日志策略。在 MySQL 8.0.34 中已弃用。

  • audit_log_statement_policy: 语句相关事件的审计日志策略。在 MySQL 8.0.34 中已弃用。

  • authentication_fido_rp_id: FIDO 多因素认证的 Relying party ID。在 MySQL 8.0.35 中已弃用。

  • binlog_format: 指定二进制日志的格式。在 MySQL 8.0.34 中已弃用。

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

  • character-set-client-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: 包含实现 InnoDB memcached 插件的共享库的目录。在 MySQL 8.0.22 中已弃用。

  • daemon_memcached_option: 在启动时传递给底层 memcached 守护程序的以空格分隔的选项。在 MySQL 8.0.22 中已弃用。

  • daemon_memcached_r_batch_size: 在开始新事务之前执行多少个 memcached 读操作。在 MySQL 8.0.22 中已弃用。

  • daemon_memcached_w_batch_size: 在开始新事务之前执行多少个 memcached 写操作。在 MySQL 8.0.22 中已弃用。

  • default_authentication_plugin: 默认认证插件。在 MySQL 8.0.27 中已弃用。

  • disconnect-slave-event-count: 用于调试和测试复制的 mysql-test 选项。在 MySQL 8.0.29 中已弃用。

  • expire_logs_days: 在这么多天后清除二进制日志。在 MySQL 8.0.3 中已弃用。

  • group_replication_ip_whitelist: 允许连接到组的主机列表。在 MySQL 8.0.22 中已弃用。

  • group_replication_primary_member: 当组以单主模式运行时的主要成员 UUID。如果组以多主模式运行,则为空字符串。在 MySQL 8.0.4 中已弃用。

  • group_replication_recovery_complete_at: 在状态传输后处理缓存事务时的恢复策略。在 MySQL 8.0.34 中已弃用。

  • have_openssl: mysqld 是否支持 SSL 连接。在 MySQL 8.0.26 中已弃用。

  • have_ssl: mysqld 是否支持 SSL 连接。在 MySQL 8.0.26 中已弃用。

  • init_slave: 当复制连接到源时执行的语句。在 MySQL 8.0.26 中已弃用。

  • innodb_api_bk_commit_interval: 多久自动提交使用 InnoDB memcached 接口的空��连接,单位为秒。在 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 插件使用的表,以防止通过 SQL 接口的 DDL 删除或更改。在 MySQL 8.0.22 中已弃用。

  • innodb_api_trx_level: 允许控制由 memcached 接口处理的查询的事务隔离级别。在 MySQL 8.0.22 中已弃用。

  • innodb_log_file_size: 日志组中每个日志文件的大小。在 MySQL 8.0.30 中已弃用。

  • innodb_log_files_in_group: 日志组中的 InnoDB 日志文件数。在 MySQL 8.0.30 中已弃用。

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

  • keyring_encrypted_file_data: keyring_encrypted_file 插件数据文件。在 MySQL 8.0.34 中已弃用。

  • keyring_encrypted_file_password: keyring_encrypted_file 插件密码。在 MySQL 8.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 私钥文件指纹。在 MySQL 8.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 秘密服务器端点。在 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 vaults 服务器端点。在 MySQL 8.0.31 中已弃用。

  • keyring_oci_virtual_vault: OCI 保险库 OCID。在 MySQL 8.0.31 中已弃用。

  • log_bin_trust_function_creators: 如果等于 0(默认值),那么当使用 --log-bin 时,只有具有 SUPER 特权的用户才允许存储函数创建,并且只有在创建的函数不会破坏二进制日志记录时才允许。在 MySQL 8.0.34 中已弃用。

  • log_bin_use_v1_row_events: 服务器是否使用版本 1 的二进制日志行事件。在 MySQL 8.0.18 中已弃用。

  • log_slave_updates: 复制是否应该将其复制 SQL 线程执行的更新记录到自己的二进制日志中。在 MySQL 8.0.26 中已弃用。

  • log_slow_slave_statements: 导致副本执行的慢查询被写入慢查询日志。在 MySQL 8.0.26 中已弃用。

  • log_statements_unsafe_for_binlog: 禁用写入错误日志的错误 1592 警告。在 MySQL 8.0.34 中已弃用。

  • log_syslog: 是否将错误日志写入 syslog。在 MySQL 8.0.2 中已弃用。

  • master-info-file: 记录源和 I/O 复制线程在源二进制日志中位置的文件位置和名称。在 MySQL 8.0.18 中已弃用。

  • master_info_repository: 是否将连接元数据存储库写入文件或表,其中包含源信息和源二进制日志中复制 I/O 线程位置。在 MySQL 8.0.23 中已弃用。

  • master_verify_checksum: 导致源在读取二进制日志时检查校验和。在 MySQL 8.0.26 中已弃用。

  • max_length_for_sort_data: 排序记录中的最大字节数。在 MySQL 8.0.20 中已弃用。

  • myisam_repair_threads: 修复 MyISAM 表时要使用的线程数。1 表示禁用并行修复。在 MySQL 8.0.29 中已弃用。

  • new: 使用非常新的,可能是“不安全”的功能。在 MySQL 8.0.35 中已弃用。

  • no-dd-upgrade: 防止在启动时自动升级数据字典表。在 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 的实现。在 MySQL 8.0.35 中已弃用。

  • pseudo_slave_mode: 供内部服务器使用。在 MySQL 8.0.26 中已弃用。

  • query_prealloc_size: 用于查询解析和执行的持久缓冲区。在 MySQL 8.0.29 中已弃用。

  • relay_log_info_file: 应用程序元数据存储库的文件名,副本在其中记录有关中继日志的信息。在 MySQL 8.0.18 中已弃用。

  • relay_log_info_repository: 是否将复制 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: 不允许没有对 mysql.user 表具有写权限的用户创建新用户;此选项已弃用并被忽略。在 MySQL 8.0.11 中已弃用。

  • show-slave-auth-info: 在此源上在 SHOW REPLICAS 和 SHOW SLAVE HOSTS 中显示用户名和密码。在 MySQL 8.0.26 中已弃用。

  • skip-character-set-client-handshake: 在握手期间忽略客户���端发送的字符集值。在 MySQL 8.0.35 中已弃用。

  • skip-host-cache: 不缓存主机名。在 MySQL 8.0.30 中已弃用。

  • skip-new: 不使用新的、可能错误的例程。在 MySQL 8.0.35 中已弃用。

  • skip-slave-start: 如果设置,当复制服务器启动时不会自动启动复制。在 MySQL 8.0.26 中已弃用。

  • slave-skip-errors: 告诉复制线程在查询从提供的列表返回错误时继续复制。在 MySQL 8.0.26 中已弃用。

  • slave_checkpoint_group: 在调用检查点操作更新进度状态之前,多线程复制处理的最大事务数。不支持 NDB Cluster。在 MySQL 8.0.26 中已弃用。

  • slave_checkpoint_period: 在此毫秒数后更新多线程复制的进度状态,并将中继日志信息刷新到磁盘。不支持 NDB Cluster。在 MySQL 8.0.26 中已弃用。

  • slave_compressed_protocol: 使用源/复制协议的压缩。在 MySQL 8.0.18 中已弃用。

  • slave_load_tmpdir: 复制 LOAD DATA 语句时,复制应将临时文件放置的位置。在 MySQL 8.0.26 中已弃用。

  • slave_max_allowed_packet: 可以从复制源服务器发送到复制品的数据包的最大大小(以字节为单位);覆盖 max_allowed_packet。在 MySQL 8.0.26 中已弃用。

  • slave_net_timeout: 等待源/复制连接中更多数据的秒数,然后中止读取。在 MySQL 8.0.26 中已弃用。

  • slave_parallel_type: 告诉复制使用时间戳信息(LOGICAL_CLOCK)或数据库分区(DATABASE)来并行化事���。在 MySQL 8.0.26 中已弃用。

  • slave_parallel_workers: 用于并行执行复制事务的应用程序线程数;0 或 1 禁用复制多线程。NDB Cluster:请参阅文档。在 MySQL 8.0.26 中已弃用。

  • slave_pending_jobs_size_max: 持有尚未应用的事件的复制工作者队列的最大大小。在 MySQL 8.0.26 中已弃用。

  • slave_preserve_commit_order: 确保复制工作者的所有提交按照源上的顺序发生,以保持一致性,当使用并行应用程序线程时。在 MySQL 8.0.26 中已弃用。

  • slave_rows_search_algorithms: 确定用于复制更新批处理的搜索算法。从此列表中选择任意 2 或 3 个:INDEX_SEARCH,TABLE_SCAN,HASH_SCAN。在 MySQL 8.0.18 中已弃用。

  • slave_sql_verify_checksum: 导致复制时从中继日志读取时检查校验和。在 MySQL 8.0.26 中已弃用。

  • slave_transaction_retries: 复制 SQL 线程在事务失败(死锁或已过锁等待超时)时重试事务的次数,然后放弃并停止。在 MySQL 8.0.26 中已弃用。

  • slave_type_conversions: 控制复制上的类型转换模式。值是此列表中零个或多个元素:ALL_LOSSY,ALL_NON_LOSSY。设置为空字符串以禁止源和复制之间的类型转换。在 MySQL 8.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: 允许 MyISAM 表使用符号链接。在 MySQL 8.0.2 中已弃用。

  • sync_master_info: 每第#个事件后同步源信息。在 MySQL 8.0.26 中已弃用。

  • sync_relay_log_info: 每第#个事件后将 relay.info 文件同步到磁盘。在 MySQL 8.0.34 中已弃用。

  • temptable_use_mmap: 当 temptable_max_ram 阈值达到时,TempTable 存储引擎是否分配内存映射文件。在 MySQL 8.0.26 中已弃用。

  • transaction_prealloc_size: 用于存储二进制日志中事务的持久缓冲区。在 MySQL 8.0.29 中已弃用。

  • transaction_write_set_extraction: 定义在事务期间提取的写入哈希算法。在 MySQL 8.0.26 中已弃用。

在 MySQL 8.0 中已移除的选项和变量

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

  • Com_alter_db_upgrade: ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME 语句的计数。在 MySQL 8.0.0 中已移除。

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

  • Qcache_free_blocks: 查询缓存中的空闲内存块数。在 MySQL 8.0.3 中已移除。

  • Qcache_free_memory: 查询缓存的空闲内存量。在 MySQL 8.0.3 中已移除。

  • Qcache_hits: 查询缓存命中次数。在 MySQL 8.0.3 中已移除。

  • Qcache_inserts: 查询缓存插入次数。在 MySQL 8.0.3 中已移除。

  • Qcache_lowmem_prunes: 由于缓存中内存不足而从查询缓存中删除的查询数量。在 MySQL 8.0.3 中已移除。

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

  • Qcache_queries_in_cache: 查询缓存中注册的查询数量。在 MySQL 8.0.3 中已移除。

  • Qcache_total_blocks: 查询缓存中的总块数。在 MySQL 8.0.3 中已移除。

  • Slave_heartbeat_period: 复制的心跳间隔,单位为秒。在 MySQL 8.0.1 中已移除。

  • Slave_last_heartbeat: 显示最新心跳信号接收时间,格式为时间戳。在 MySQL 8.0.1 中已移除。

  • Slave_received_heartbeats: 自上次重置以来副本接收的心跳数。在 MySQL 8.0.1 中已移除。

  • Slave_retried_transactions: 自启动以来,复制 SQL 线程重试事务的总次数。在 MySQL 8.0.1 中已移除。

  • Slave_running: 该服务器作为副本的状态(复制 I/O 线程状态)。在 MySQL 8.0.1 中已移除。

  • bootstrap: mysql 安装脚本使用。在 MySQL 8.0.0 中已移除。

  • date_format: 日期格式(未使用)。在 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: 允许当前服务器加入组,即使它具有组中不存在的事务。在 MySQL 8.0.4 中移除。

  • have_crypt: crypt()系统调用的可用性。在 MySQL 8.0.3 中移除。

  • ignore-db-dir: 将目录视为非数据库目录。在 MySQL 8.0.0 中移除。

  • ignore_builtin_innodb: 忽略内置 InnoDB。在 MySQL 8.0.3 中移除。

  • ignore_db_dirs: 视为非数据库目录的目录。在 MySQL 8.0.0 中移除。

  • innodb_checksums: 启用 InnoDB 校验和验证。在 MySQL 8.0.0 中移除。

  • innodb_disable_resize_buffer_pool_debug: 禁用 InnoDB 缓冲池的调整大小。在 MySQL 8.0.0 中移除。

  • innodb_file_format: 新 InnoDB 表的格式。在 MySQL 8.0.0 中移除。

  • innodb_file_format_check: InnoDB 是否执行文件格式兼容性检查。在 MySQL 8.0.0 中移除。

  • innodb_file_format_max: 共享表空间中的文件格式标记。在 MySQL 8.0.0 中移除。

  • innodb_large_prefix: 启用更长的列前缀索引键。在 MySQL 8.0.0 中移除。

  • innodb_locks_unsafe_for_binlog: 强制 InnoDB 不使用 next-key 锁定,而只使用行级锁定。在 MySQL 8.0.0 中移除。

  • innodb_scan_directories: 定义在 InnoDB 恢复期间扫描表空间文件的目录。在 MySQL 8.0.4 中移除。

  • innodb_stats_sample_pages: 用于索引分布统计的样本页数。在 MySQL 8.0.0 中移除。

  • innodb_support_xa: 启用 InnoDB 对 XA 两阶段提交的支持。在 MySQL 8.0.0 中移除。

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

  • internal_tmp_disk_storage_engine: 内部临时表的存储引擎。在 MySQL 8.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 消息中服务器标识符的标记。在 MySQL 8.0.13 中移除。

  • max_tmp_tables: 未使用。在 MySQL 8.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: 启用(或禁用)分区支持。在 MySQL 8.0.0 中已移除。

  • query_cache_limit: 不缓存大于此大小的结果。在 MySQL 8.0.3 中已移除。

  • query_cache_min_res_unit: 为结果分配空间的最小单位大小(在写入所有结果数据后修剪最后一个单位)。在 MySQL 8.0.3 中已移除。

  • query_cache_size: 用于存储旧查询结果的内存分配。在 MySQL 8.0.3 中已移除。

  • query_cache_type: 查询缓存类型。在 MySQL 8.0.3 中已移除。

  • query_cache_wlock_invalidate: 在写入锁定时使查询缓存中的查询无效。在 MySQL 8.0.3 中已移除。

  • secure_auth: 禁止具有旧(4.1 之前)密码的帐户进行身份验证。在 MySQL 8.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: 默认事务访问模式。在 MySQL 8.0.3 中已移除。

1.5 如何报告错误或问题

原文:dev.mysql.com/doc/refman/8.0/en/bug-reports.html

在报告关于问题的错误之前,请尝试验证它是否是一个错误,并且尚未被报告过:

  • 首先在dev.mysql.com/doc/上搜索 MySQL 在线手册。我们会经常更新手册,以解决新发现的问题。此外,手册附带的发布说明可能特别有用,因为很可能新版本包含了解决你问题的方法。发布说明可以在手册给出的位置找到。

  • 如果对 SQL 语句出现解析错误,请仔细检查语法。如果你找不到任何问题,那么极有可能是你当前的 MySQL 服务器版本不支持你正在使用的语法。如果你正在使用当前版本且手册没有涵盖你正在使用的语法,那么 MySQL 服务器不支持你的语句。

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

  • 对于一些常见问题的解决方案,请参见 Section B.3, “Problems and Common Errors”。

  • bugs.mysql.com/的错误数据库中搜索,看看该错误是否已被报告并修复。

  • 你也可以使用www.mysql.com/search/来搜索位于 MySQL 网站上的所有网页(包括手册)。

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

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

bugs.mysql.com/的错误数据库中,对于给定版本已经修正的错误会在发布说明中有所记录。

如果你发现 MySQL 服务器中的安全漏洞,请立即通过电子邮件发送消息至<secalert_us@oracle.com>告知我们。例外:支持客户应将所有问题(包括安全漏洞)报告给 Oracle 支持团队,网址为support.oracle.com/

要与其他用户讨论问题,你可以使用MySQL 社区 Slack

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

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

当错误报告中包含问题的良好描述时,这是最有帮助的。也就是说,给出导致问题的所有操作的良好示例,并详细描述问题本身。最好的报告是那些包含了展示如何重现错误或问题的完整示例的报告。请参阅第 7.9 节,“调试 MySQL”。

请记住,我们可以回应包含太多信息的报告,但无法回应包含太少信息的报告。人们经常省略事实,因为他们认为他们知道问题的原因,并假设一些细节并不重要。一个好的原则是,如果您对陈述某事感到犹豫,请陈述。在您的报告中写几行比等待更长时间以便我们要求您提供初始报告中缺少的信息更快且不麻烦。

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

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

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

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

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

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

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

  • 你遇到问题的计算机的制造商和型号。

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

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

  • docs/INFO_BIN 文件的内容来自于你的 MySQL 安装。这个文件包含了关于 MySQL 配置和编译的信息。

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

  • 如果问题发生在编译过程中,请包含确切的错误消息,以及出错代码周围的几行上下文,这些代码位于发生错误的文件中。

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

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

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

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

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

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

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

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

  • 当您提供问题示例时,最好使用实际情况中存在的表名、变量名等,而不是想出新名称。问题可能与表名或变量名有关。这种情况可能很少,但安全起见总是好过后悔。毕竟,您提供一个使用实际情况的示例应该更容易,对我们来说也更好。如果您有不希望在错误报告中对其他人可见的数据,可以按照之前描述的方法使用“文件”选项卡上传它。如果信息真的是绝密的,甚至您也不想向我们展示,那就使用其他名称提供一个示例,但请将其视为最后选择。

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

  • 如果您的问题与权限系统有关,请包含mysqladmin reload的输出,以及尝试连接时收到的所有错误消息。在测试权限时,您应该执行mysqladmin reload version并尝试使用导致问题的程序进行连接。

  • 如果您有一个用于修复错误的补丁,请包含它。但不要假设补丁是我们需要的全部,或者如果您没有提供一些必要信息,比如显示您的补丁修复的错误的测试用例。我们可能会发现您的补丁存在问题,或者我们可能根本无法理解它。如果是这样,我们无法使用它。

    如果我们无法验证补丁的确切目的,我们将不使用它。测试用例在这里对我们有帮助。展示补丁处理可能发生的所有情况。如果我们发现边界情况(即使是罕见的情况)补丁无法工作,那么它可能是无用的。

  • 猜测错误是什么,为什么会发生,或者它依赖于什么通常是错误的。即使 MySQL 团队也不能在使用调试器确定错误的真正原因之前猜测这些事情。

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

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

    • InnoDB 崩溃恢复机制在服务器被杀死后重新启动时处理清理工作,因此在典型操作中不需要“修复”表格。如果遇到InnoDB表格错误,请重新启动服务器并查看问题是否仍然存在,或者错误是否仅影响内存中的缓存数据。如果磁盘上的数据损坏,请考虑启用innodb_force_recovery选项重新启动,以便您可以转储受影响的表格。

    • 对于非事务性表格,请尝试使用REPAIR TABLEmyisamchk进行修复。参见第七章,MySQL 服务器管理

    如果您正在运行 Windows,请使用SHOW VARIABLES LIKE 'lower_case_table_names'语句验证lower_case_table_names的值。此变量影响服务器处理数据库和表格名称的大小写。对于给定值的影响应如第 11.2.3 节,“标识符大小写敏感性”中描述的那样。

  • 如果你经常遇到损坏的表格,你应该尝试找出这种情况发生的时间和原因。在这种情况下,MySQL 数据目录中的错误日志可能包含一些关于发生了什么的信息(这是带有.err后缀的文件)。请在您的错误报告中包含来自此文件的任何相关信息。通常情况下,如果没有被中断更新的情况,mysqld 永远不应该损坏表格。如果你能找到mysqld死亡的原因,那么我们就能更容易地为你提供解决问题的方法。参见 Section B.3.1, “How to Determine What Is Causing a Problem”。

  • 如果可能的话,请下载并安装最新版本的 MySQL 服务器,并检查是否解决了你的问题。所有版本的 MySQL 软件都经过了彻底测试,应该可以正常工作。我们相信尽可能使一切向后兼容,你应该能够轻松切换 MySQL 版本。参见 Section 2.1.2, “Which MySQL Version and Distribution to Install”。

1.6 MySQL 标准兼容性

原文:dev.mysql.com/doc/refman/8.0/en/compatibility.html

1.6.1 MySQL 对标准 SQL 的扩展

1.6.2 MySQL 与标准 SQL 的差异

1.6.3 MySQL 如何处理约束

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

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

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

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

MySQL Server 最初设计用于在小型计算机系统上处理中等大小的数据库(10-100 百万行,或每个表约 100MB)。如今,MySQL Server 处理 TB 级别大小的数据库。

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

MySQL 支持 ODBC 0 到 3.51 级别。

MySQL 支持使用 NDBCLUSTER 存储引擎进行高可用性数据库集群。请参阅 第二十五章,“MySQL NDB Cluster 8.0”。

我们实现了支持大部分 W3C XPath 标准的 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 系统变量的值为不同的客户端应用这些模式。数据库管理员可以将全局 SQL 模式设置为符合站点服务器操作要求的模式,每个应用程序可以将其会话 SQL 模式设置为其自身的要求。

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

有关设置 SQL 模式的更多信息,请参阅 Section 7.1.11, “Server SQL Modes”。

在 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 选项还设置了事务隔离级别。

请参阅 Section 7.1.7, “Server Command Options”。

1.6.1 MySQL 对标准 SQL 的扩展

原文:dev.mysql.com/doc/refman/8.0/en/extensions-to-ansi.html

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

/*! *MySQL-specific code* */

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

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

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

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

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

  • 数据在磁盘上的组织

    MySQL 服务器将每个数据库映射到 MySQL 数据目录下的一个目录,并将数据库中的表映射到数据库目录中的文件名。因此,在具有区分大小写文件名的操作系统上(例如大多数 Unix 系统),MySQL 服务器中的数据库和表名称是区分大小写的。请参阅 Section 11.2.3, “Identifier Case Sensitivity”。

  • 通用语言语法

    • 默认情况下,字符串可以用"'括起来。如果启用了ANSI_QUOTES SQL 模式,则字符串只能用'括起来,服务器会将用"括起来的字符串解释为标识符。

    • \是字符串中的转义字符。

    • 在 SQL 语句中,您可以使用db_name.tbl_name语法访问不同数据库中的表。一些 SQL 服务器提供相同的功能,但称其为User space。MySQL 服务器不支持像这样使用表空间的语句:CREATE TABLE ralph.my_table ... IN my_tablespace

  • SQL 语句语法

    • ANALYZE TABLECHECK TABLEOPTIMIZE TABLEREPAIR TABLE语句。

    • CREATE DATABASEDROP DATABASEALTER DATABASE语句。参见第 15.1.12 节,“CREATE DATABASE Statement”,第 15.1.24 节,“DROP DATABASE Statement”和第 15.1.2 节,“ALTER DATABASE Statement”。

    • DO语句。

    • EXPLAIN SELECT以获取查询优化器如何处理表格的描述。

    • FLUSHRESET语句。

    • SET语句。参见第 15.7.6.1 节,“SET Syntax for Variable Assignment”。

    • SHOW语句。参见第 15.7.7 节,“SHOW Statements”。许多特定于 MySQL 的SHOW语句产生的信息可以通过使用SELECT查询INFORMATION_SCHEMA来更标准地获取。参见第二十八章,“INFORMATION_SCHEMA Tables”。

    • 使用LOAD DATA语句。在许多情况下,此语法与 Oracle 的LOAD DATA兼容。参见第 15.2.9 节,“LOAD DATA Statement”。

    • 使用RENAME TABLE语句。参见第 15.1.36 节,“RENAME TABLE Statement”。

    • 使用REPLACE代替DELETEINSERT。参见第 15.2.12 节,“REPLACE Statement”。

    • ALTER TABLE语句中使用CHANGE *col_name*DROP *col_name*,或DROP INDEXIGNORERENAME。在ALTER TABLE语句中使用多个ADDALTERDROPCHANGE子句。参见第 15.1.9 节,“ALTER TABLE Statement”。

    • CREATE TABLE 语句中使用索引名称、列前缀上的索引,以及使用 INDEXKEY。参见 第 15.1.20 节,“CREATE TABLE Statement”。

    • CREATE TABLE 中使用 TEMPORARYIF NOT EXISTS

    • DROP TABLEDROP DATABASE 中使用 IF EXISTS

    • 使用单个 DROP TABLE 语句删除多个表的能力。

    • UPDATEDELETE 语句的 ORDER BYLIMIT 子句。

    • INSERT INTO *tbl_name* SET *col_name* = ... 语法。

    • INSERTREPLACE 语句的 DELAYED 子句。

    • INSERTREPLACEDELETEUPDATE 语句的 LOW_PRIORITY 子句。

    • SELECT 语句中使用 INTO OUTFILEINTO DUMPFILE。参见 第 15.2.13 节,“SELECT Statement”。

    • SELECT 语句中的选项,如 STRAIGHT_JOINSQL_SMALL_RESULT

    • GROUP BY 子句中不需要命名所有选定的列。这对于一些非常特定但相当常见的查询可以提供更好的性能。参见 第 14.19 节,“聚合函数”。

    • 您可以在 GROUP BY 中指定 ASCDESC,而不仅仅是在 ORDER BY 中。

    • 使用 := 赋值运算符在语句中设置变量的能力��参见 第 11.4 节,“用户定义变量”。

  • 数据类型

    • MEDIUMINT - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT")、SETENUM 数据类型,以及各种 BLOBTEXT 数据类型。

    • AUTO_INCREMENTBINARYNULLUNSIGNEDZEROFILL 数据类型属性。

  • 函数和运算符

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

    • MySQL Server 理解 ||&& 运算符表示逻辑 OR 和 AND,就像 C 编程语言中一样。在 MySQL Server 中,||OR 是同义词,&&AND 也是同义词。由于这种良好的语法,MySQL Server 不支持标准 SQL 中用于字符串连接的 || 运算符;请使用 CONCAT()。由于 CONCAT() 接受任意数量的参数,因此很容易将 || 运算符的用法转换为 MySQL Server。

    • value_list 具有多个元素的情况下使用 COUNT(DISTINCT *value_list*)

    • 字符串比较默认不区分大小写,排序顺序由当前字符集的排序规则决定,默认为 utf8mb4。要执行区分大小写的比较,应该使用 BINARY 属性声明列或使用 BINARY 转换,这将导致使用基��字符代码值而不是词法排序进行比较。

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

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

      mysql> SELECT col1=1 AND col2=2 FROM my_table;
      
    • LAST_INSERT_ID() 函数返回最近的 AUTO_INCREMENT 值。参见 Section 14.15, “Information Functions”。

    • 在数字值上允许使用LIKE

    • REGEXPNOT REGEXP 扩展正则表达式运算符。

    • CONCAT()CHAR() 函数的一个参数或两个以上参数。(在 MySQL Server 中,这些函数可以接受可变数量的参数。)

    • BIT_COUNT()CASEELT()FROM_DAYS()FORMAT()IF()MD5()PERIOD_ADD()PERIOD_DIFF()TO_DAYS()WEEKDAY() 函数。

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

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

1.6.2 MySQL 与标准 SQL 的差异

原文:dev.mysql.com/doc/refman/8.0/en/differences-from-ansi.html

1.6.2.1 SELECT INTO TABLE 差异

1.6.2.2 UPDATE 差异

1.6.2.3 外键约束的差异

1.6.2.4 '--' 作为注释的起始

我们努力使 MySQL Server 遵循 ANSI SQL 标准和 ODBC SQL 标准,但在某些情况下,MySQL Server 的操作方式有所不同:

  • MySQL 和标准 SQL 权限系统之间存在几个不同之处。例如,在 MySQL 中,当你删除一个表时,该表的权限不会自动被撤销。你必须明确地发出一个REVOKE语句来撤销表的权限。更多信息,请参见 Section 15.7.1.8, “REVOKE Statement”。

  • CAST()函数不支持转换为REAL - FLOAT, DOUBLE")或BIGINT - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT")。请参见 Section 14.10, “Cast Functions and Operators”。

原文:dev.mysql.com/doc/refman/8.0/en/ansi-diff-select-into-table.html

1.6.2.1 SELECT INTO TABLE 差异

MySQL Server 不支持SELECT ... INTO TABLE Sybase SQL 扩展。相反,MySQL Server 支持标准 SQL 语法INSERT INTO ... SELECT,基本上是相同的事情。参见 Section 15.2.7.1, “INSERT ... SELECT Statement”。例如:

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。相同的语法也可以在使用游标和本地变量的存储过程中使用。参见 Section 15.2.13.1, “SELECT ... INTO Statement”。

原文:dev.mysql.com/doc/refman/8.0/en/ansi-diff-update.html

1.6.2.2 UPDATE 差异

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

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

原文:dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html

1.6.2.3 外键约束的差异

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

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

  • 如果ON UPDATE CASCADEON UPDATE SET NULL递归更新相同表,它会像RESTRICT一样操作。这意味着不能使用自引用的ON UPDATE CASCADEON UPDATE SET NULL操作。这是为了防止由级联更新导致的无限循环。另一方面,自引用的ON DELETE SET NULL是可能的,就像自引用的ON DELETE CASCADE一样。级联操作不能嵌套超过 15 层。

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

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

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

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

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

    对于包含非唯一键或包含NULL值的外键引用的处理对于诸如UPDATEDELETE CASCADE等操作并不明确定义。建议您使用仅引用UNIQUE(包括PRIMARY)和NOT NULL键的外键。

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

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

    定义一个列使用REFERENCES *tbl_name*(col_name)子句实际上没有任何效果,仅仅作为一个备忘录或注释,告诉您当前正在定义的列意图引用另一个表中的列。在使用这种语法时,重要的是要意识到:

    • MySQL 不执行任何检查以确保col_name实际存在于tbl_name中(甚至tbl_name本身是否存在)。

    • MySQL 不对tbl_name执行任何操作,例如根据您定义的表中的行所采取的操作删除行;换句话说,这种语法根本不引起任何ON DELETEON UPDATE行为。(尽管您可以将ON DELETEON UPDATE子句编写为REFERENCES子句的一部分,但它也会被忽略。)

    • 这种语法创建了一个;它创建任何索引或键。

    您可以将创建的列用作连接列,如下所示:

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

    当以这种方式使用时,REFERENCES子句不会显示在SHOW CREATE 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 节,“FOREIGN KEY Constraints”。

原文:dev.mysql.com/doc/refman/8.0/en/ansi-diff-comments.html

1.6.2.4 '--' 作为注释的起始

标准 SQL 使用 C 语法/* 这是一个注释 */作为注释,MySQL 服务器也支持这种语法。MySQL 还支持这种语法的扩展,允许将 MySQL 特定的 SQL 嵌入到注释中;参见第 11.7 节,“注释”。

MySQL 服务器还使用#作为起始注释字符。这是非标准的。

标准 SQL 还使用“--”作为起始注释序列。MySQL 服务器支持--注释风格的变体;--起始注释序列被接受为这样,但必须跟随一个空格字符,如空格或换行符。这个空格旨在防止生成的 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,但--被解释为注释的起始,并且表达式的一部分被丢弃。结果是语句的含义完全不同于预期:

UPDATE account SET balance=balance
WHERE account_id=5752;

这个语句根本不会改变值。为了防止这种情况发生,MySQL 要求在--后面跟随一个空格字符,以便在 MySQL 服务器中被识别为起始注释序列,这样像balance--1这样的表达式总是安全的使用。

1.6.3 MySQL 如何处理约束

原文:dev.mysql.com/doc/refman/8.0/en/constraints.html

1.6.3.1 主键和唯一索引约束

1.6.3.2 外键约束

1.6.3.3 对无效数据强制执行的约束

1.6.3.4 枚举和集合约束

MySQL 允许您同时使用允许回滚的事务表和不允许回滚的非事务表。因此,在 MySQL 中,约束处理与其他数据库管理系统有些不同。当在非事务表中插入或更新了大量行且发生错误时,无法回滚更改时,我们必须处理这种情况。

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

当 MySQL 发生错误时,其选项包括停止语句执行或尽可能从问题中恢复并继续。默认情况下,服务器遵循后一种方式。这意味着,例如,服务器可能会将无效值强制转换为最接近的有效值。

有几个 SQL 模式选项可用于更好地控制处理不良数据值的方式以及在发生错误时是否继续语句执行或中止。使用这些选项,您可以配置 MySQL 服务器以更传统的方式运行,类似于其他拒绝不当输入的数据库管理系统。SQL 模式可以在服务器启动时全局设置以影响所有客户端。各个客户端可以在运行时设置 SQL 模式,从而使每个客户端选择最适合其需求的行为。请参阅 第 7.1.11 节,“服务器 SQL 模式”。

以下各节描述了 MySQL 服务器如何处理不同类型的约束。

原文:dev.mysql.com/doc/refman/8.0/en/constraint-primary-key.html

1.6.3.1 主键和唯一索引约束

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

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

你可以使用 mysql_info() C API 函数获取实际插入或更新的行数信息。你也可以使用 SHOW WARNINGS 语句。参见 mysql_info(),以及 15.7.7.42 “SHOW WARNINGS Statement”。

InnoDBNDB 表支持外键。参见 1.6.3.2 “外键约束”。

原文:dev.mysql.com/doc/refman/8.0/en/constraint-foreign-key.html

1.6.3.2 外键约束

外键允许您在表之间交叉引用相关数据,而外键约束有助于保持这些分散的数据一致。

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

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

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

MySQL 要求外键列被索引;如果您创建了一个具有外键约束但在给定列上没有索引的表,将会创建一个索引。

你可以从信息模式KEY_COLUMN_USAGE表中获取有关外键的信息。这里展示了针对该表的查询示例:

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

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

InnoDBNDB表支持外键。

原文:dev.mysql.com/doc/refman/8.0/en/constraint-invalid-data.html

1.6.3.3 对无效数据的强制约束

默认情况下,MySQL 8.0 会拒绝无效或不当的数据值,并中止出现这些值的语句。可以通过禁用严格的 SQL 模式(参见第 7.1.11 节,“服务器 SQL 模式”)来改变这种行为,使服务器将其强制转换为有效值以便进行数据输入,但这并不推荐。

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

原文:dev.mysql.com/doc/refman/8.0/en/constraint-enum.html

1.6.3.4 ENUM 和 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,该值将按原样插入,除非删除任何无效的子字符串。例如,'a,x,b,y'的结果是'a,b'

第二章 安装 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/installing.html

目录

2.1 一般安装指导

2.1.1 支持的平台

2.1.2 安装哪个 MySQL 版本和发行版

2.1.3 如何获取 MySQL

2.1.4 使用 MD5 校验和或 GnuPG 验证软件包完整性

2.1.5 安装布局

2.1.6 编译器特定的构建特性

2.2 在 Unix/Linux 上使用通用二进制文件安装 MySQL

2.3 在 Microsoft Windows 上安装 MySQL

2.3.1 Microsoft Windows 上的 MySQL 安装布局

2.3.2 选择安装包

2.3.3 Windows 的 MySQL 安装程序

2.3.4 使用 noinstall ZIP 存档在 Microsoft Windows 上安装 MySQL

2.3.5 解决 Microsoft Windows 上 MySQL 服务器安装问题

2.3.6 Windows 安装后的程序

2.3.7 Windows 平台限制

2.4 在 macOS 上安装 MySQL

2.4.1 在 macOS 上安装 MySQL 的一般注意事项

2.4.2 使用本地软件包在 macOS 上安装 MySQL

2.4.3 安装和使用 MySQL 启动守护程序

2.4.4 安装和使用 MySQL 首选项窗格

2.5 在 Linux 上安装 MySQL

2.5.1 在 Linux 上使用 MySQL Yum 仓库安装 MySQL

2.5.2 在 Linux 上使用 MySQL APT 仓库安装 MySQL

2.5.3 在 Linux 上使用 MySQL SLES 仓库安装 MySQL

2.5.4 使用 Oracle 的 RPM 软件包在 Linux 上安装 MySQL

2.5.5 在 Linux 上使用 Oracle Debian 软件包安装 MySQL

2.5.6 使用 Docker 容器在 Linux 上部署 MySQL

2.5.7 从本地软件仓库在 Linux 上安装 MySQL

2.5.8 使用 Juju 在 Linux 上安装 MySQL

2.5.9 使用 systemd 管理 MySQL 服务器

2.6 使用 Unbreakable Linux Network (ULN) 安装 MySQL

2.7 在 Solaris 上安装 MySQL

2.7.1 使用 Solaris PKG 在 Solaris 上安装 MySQL

2.8 从源代码安装 MySQL

2.8.1 源码安装方法

2.8.2 源码安装先决条件

2.8.3 源码安装 MySQL 布局

2.8.4 使用标准源码分发安装 MySQL

2.8.5 使用开发源树安装 MySQL

2.8.6 配置 SSL 库支持

2.8.7 MySQL 源码配置选项

2.8.8 处理编译 MySQL 时的问题

2.8.9 MySQL 配置和第三方工具

2.8.10 生成 MySQL Doxygen 文档内容

2.9 安装后设置和测试

2.9.1 初始化数据目录

2.9.2 启动服务器

2.9.3 测试服务器

2.9.4 保护初始 MySQL 帐户

2.9.5 自动启动和停止 MySQL

2.10 Perl 安装注意事项

2.10.1 在 Unix 上安装 Perl

2.10.2 在 Windows 上安装 ActiveState Perl

2.10.3 使用 Perl DBI/DBD 接口时的问题

本章描述了如何获取和安装 MySQL。以下是程序概要,后续章节提供了详细信息。如果您计划将现有版本的 MySQL 升级到新版本而不是首次安装 MySQL,请参阅第三章,升级 MySQL,了解升级过程和升级前应考虑的问题。

如果您有兴趣从另一个数据库系统迁移到 MySQL,请参阅附录 A.8,“MySQL 8.0 FAQ:迁移”,其中包含有关迁移问题的一些常见问题的答案。

通常,MySQL 的安装遵循以下步骤:

  1. 确定 MySQL 是否在您的平台上运行并受支持。

    请注意,并非所有平台都适合运行 MySQL,并且并非所有已知可运行 MySQL 的平台都得到 Oracle 公司的官方支持。有关官方支持的平台信息,请参阅 MySQL 网站上的www.mysql.com/support/supportedplatforms/database.html

  2. 选择要安装的发行版。

    MySQL 提供了多个版本,大多数版本都有几种分发格式可供选择。您可以选择包含二进制(预编译)程序或源代码的预打包分发。如果有疑问,请使用二进制分发。Oracle 还为那些想要查看最新开发并测试新代码的人提供了访问 MySQL 源代码的途径。要确定应使用哪个版本和分发类型,请参阅第 2.1.2 节,“应安装哪个 MySQL 版本和分发”。

  3. 选择要安装的跟踪。

    MySQL 提供了一个修复错误跟踪(例如 MySQL 8.0),以及一个创新跟踪(今天是 MySQL 8.3),每个跟踪都针对不同的用例。这两个跟踪都被认为是可用于生产环境的,并包括错误修复,而创新发布还包括新功能和可能的修改行为。

    修复错误跟踪升级包括点版本,例如 MySQL 8.0.x 升级到 8.0.y,而创新跟踪发布通常只有次要版本,例如 MySQL 8.3.0 升级到 9.0.0。然而,创新跟踪确实偶尔有点版本发布。

  4. 下载要安装的分发。

    有关说明,请参阅第 2.1.3 节,“如何获取 MySQL”。要验证分发的完整性,请使用第 2.1.4 节,“使用 MD5 校验和或 GnuPG 验证软件包完整性”中的说明。

  5. 安装分发。

    要从二进制分发安装 MySQL,请使用第 2.2 节,“在 Unix/Linux 上使用通用二进制文件安装 MySQL”中的说明。或者,使用安全部署指南,该指南提供了部署 MySQL Enterprise Edition Server 通用二进制分发的程序,具有管理 MySQL 安装安全性功能的特性。

    要从源代码分发或当前开发源代码树安装 MySQL,请使用第 2.8 节,“从源代码安装 MySQL”中的说明。

  6. 执行任何必要的安装后设置。

    安装 MySQL 后,请参阅第 2.9 节,“安装后设置和测试”,了解确保 MySQL 服务器正常工作的信息。还请参考第 2.9.4 节,“保护初始 MySQL 帐户”中提供的信息。本节描述了如何保护初始的 MySQL root 用户帐户,该帐户在分配密码之前没有密码。无论您是使用二进制还是源代码分发安装 MySQL,本节都适用。

  7. 如果要运行 MySQL 基准测试脚本,则必须提供 Perl 支持。请参阅第 2.10 节,“Perl 安装说明”。

提供了在不同平台和环境上安装 MySQL 的说明,具体请参考各个平台:

  • Unix,Linux

    有关在大多数 Linux 和 Unix 平台上使用通用二进制文件(例如.tar.gz包)安装 MySQL 的说明,请参阅第 2.2 节,“在 Unix/Linux 上使用通用二进制文件安装 MySQL”。

    有关从源代码分发或源代码存储库构建 MySQL 的信息,请参阅第 2.8 节,“从源代码安装 MySQL”。

    有关在特定平台上安装、配置和从源代码构建的帮助,请参阅相应平台部分:

    • Linux,包括特定发行版的安装方法,请参阅第 2.5 节,“在 Linux 上安装 MySQL”。

    • IBM AIX,请参阅第 2.7 节,“在 Solaris 上安装 MySQL”。

  • Microsoft Windows

    有关在 Microsoft Windows 上安装 MySQL 的说明,可以使用 MySQL Installer 或 Zipped 二进制文件,请参阅第 2.3 节,“在 Microsoft Windows 上安装 MySQL”。

    有关使用 Microsoft Visual Studio 从源代码构建 MySQL 的详细说明,请参阅第 2.8 节,“从源代码安装 MySQL”。

  • macOS

    有关在 macOS 上安装 MySQL,包括使用二进制包和本机 PKG 格式,请参阅第 2.4 节,“在 macOS 上安装 MySQL”。

    有关如何利用 macOS Launch Daemon 自动启动和停止 MySQL 的信息,请参阅第 2.4.3 节,“安装和使用 MySQL Launch Daemon”。

    有关 MySQL Preference Pane 的信息,请参阅第 2.4.4 节,“安装和使用 MySQL Preference Pane”。

2.1 通用安装指南

原文:dev.mysql.com/doc/refman/8.0/en/general-installation-issues.html

2.1.1 支持的平台

2.1.2 应安装哪个 MySQL 版本和发行版

2.1.3 如何获取 MySQL

2.1.4 使用 MD5 校验和或 GnuPG 验证软件包完整性

2.1.5 安装布局

2.1.6 特定于编译器的构建特性

紧随其后的章节包含了选择、下载和验证您的发行版所需的信息。本章后续部分的说明描述了如何安装您选择的发行版。对于二进制发行版,请参阅第 2.2 节,“使用通用二进制文件在 Unix/Linux 上安装 MySQL”或者如果有的话,适用于您平台的相应章节。要从源代码构建 MySQL,请使用第 2.8 节,“从源代码安装 MySQL”中的说明。

2.1.1 支持的平台

原文:dev.mysql.com/doc/refman/8.0/en/platform-support.html

MySQL 平台支持随时间不断发展;请参考www.mysql.com/support/supportedplatforms/database.html获取最新更新。

2.1.2 要安装哪个 MySQL 版本和发行版

原文:dev.mysql.com/doc/refman/8.0/en/which-version.html

在准备安装 MySQL 时,决定使用哪个版本和发行格式(二进制或源代码)。

首先,决定是从像 MySQL 8.0 这样的 bug 修复系列安装,还是使用像 MySQL 8.3 这样的创新发布。两个跟踪都包括 bug 修复,而创新发布包含最新功能。bug 修复和创新发布都适用于生产环境。

MySQL 8.0 中的命名方案使用由三个数字和一个可选后缀组成的发布名称(例如,mysql-8.0.34)。发布名称中的数字解释如下:

  • 第一个数字(8)是主要版本号。

  • 第二个数字(0)是次要版本号。主要和次要数字合在一起构成发布系列号。系列号描述了稳定的功能集。

  • 第三个数字(34)是发布系列中的版本号。每次新的 bug 修复发布都会增加这个数字;对于创新发布,它很可能总是为 0。对于像 MySQL 8.0 这样的 bug 修复系列,系列中最新的版本是最佳选择。

在选择要安装的 MySQL 版本后,决定为您的操作系统安装哪种发行格式。对于大多数用例,二进制发行版是正确的选择。二进制发行版以原生格式提供,适用于许多平台,例如 Linux 的 RPM 软件包或 macOS 的 DMG 软件包。发行版还以更通用的格式提供,例如 Zip 存档或压缩的tar文件。在 Windows 上,您可以使用 MySQL Installer 来安装二进制发行版。

在某些情况下,最好从源代码发行版安装 MySQL:

  • 您希望在某个明确的位置安装 MySQL。标准二进制发行版可以在任何安装位置运行,但您可能需要更多的灵活性来将 MySQL 组件放在您想要的位置。

  • 您希望配置mysqld以包含标准二进制发行版中可能不包含的功能。以下是用于确保功能可用性的最常见额外选项列表:

    • -DWITH_LIBWRAP=1用于支持 TCP wrappers。

    • -DWITH_ZLIB={system|bundled}用于依赖于压缩的功能

    • -DWITH_DEBUG=1用于调试支持

    欲了解更多信息,请参阅 Section 2.8.7, “MySQL Source-Configuration Options”。

  • 你想配置mysqld,但不包括标准二进制分发版中包含的某些功能。

  • 你想阅读或修改组成 MySQL 的 C 和 C++ 代码。为此,请获取源代码分发版。

  • 源代码分发版包含比二进制分发版更多的测试和示例。

2.1.3 如何获取 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/getting-mysql.html

查看我们的下载页面 dev.mysql.com/downloads/ 以获取关于当前版本的 MySQL 信息和下载说明。

对于使用 Yum 作为软件包管理系统的基于 RPM 的 Linux 平台,可以使用 MySQL Yum 仓库 安装 MySQL。详细信息请参见 第 2.5.1 节,“使用 MySQL Yum 仓库在 Linux 上安装 MySQL”。

对于基于 Debian 的 Linux 平台,可以使用 MySQL APT 仓库 安装 MySQL。详细信息请参见 第 2.5.2 节,“使用 MySQL APT 仓库在 Linux 上安装 MySQL”。

对于 SUSE Linux Enterprise Server (SLES) 平台,可以使用 MySQL SLES 仓库 安装 MySQL。详细信息请参见 第 2.5.3 节,“使用 MySQL SLES 仓库在 Linux 上安装 MySQL”。

要获取最新的开发源代码,请参见 第 2.8.5 节,“使用开发源代码树安装 MySQL”。

2.1.4 使用 MD5 校验和或 GnuPG 验证软件包完整性

原文:dev.mysql.com/doc/refman/8.0/en/verifying-package-integrity.html

2.1.4.1 验证 MD5 校验和

2.1.4.2 使用 GnuPG 进行签名检查

2.1.4.3 使用 Gpg4win 在 Windows 上进行签名检查

2.1.4.4 使用 RPM 进行签名检查

2.1.4.5 存档软件包的 GPG 公共构建密钥

在下载适合您需求的 MySQL 软件包并尝试安装之前,请确保其完整且未被篡改。有三种完整性检查方法:

  • MD5 校验和

  • 使用 GnuPG,GNU 隐私卫士的加密签名

  • 对于 RPM 包,内置的 RPM 完整性验证机制

以下部分描述了如何使用这些方法。

如果您注意到 MD5 校验和或 GPG 签名不匹配,请首先尝试再次下载相应的软件包,可能从另一个镜像站点。

原文:dev.mysql.com/doc/refman/8.0/en/verifying-md5-checksum.html

2.1.4.1 验证 MD5 校验和

下载 MySQL 软件包后,您应该确保其 MD5 校验和与 MySQL 下载页面上提供的校验和匹配。每个软件包都有一个您可以验证的独立校验和,以确保与您下载的软件包匹配。正确的 MD5 校验和在每个 MySQL 产品的下载页面上列出;您应该将其与您下载的文件(产品)的 MD5 校验和进行比较。

每个操作系统和设置都提供了用于检查 MD5 校验和的工具的自己版本。通常命令被命名为md5sum,或者可能被命名为md5,有些操作系统根本不提供。在 Linux 上,它是GNU 文本工具包的一部分,可用于广泛的平台。您还可以从www.gnu.org/software/textutils/下载源代码。如果安装了 OpenSSL,您可以使用命令openssl md5 package_name。Windows 实现的md5命令行实用程序可从www.fourmilab.ch/md5/获取。winMd5Sum是一个图形化的 MD5 检查工具,可从www.nullriver.com/index/products/winmd5sum获取。我们的 Microsoft Windows 示例假定名称为md5.exe

Linux 和 Microsoft Windows 示例:

$> md5sum mysql-standard-8.0.36-linux-i686.tar.gz
aaab65abbec64d5e907dcd41b8699945  mysql-standard-8.0.36-linux-i686.tar.gz
$> md5.exe mysql-installer-community-8.0.36.msi
aaab65abbec64d5e907dcd41b8699945  mysql-installer-community-8.0.36.msi

你应该验证生成的校验和(十六进制数字串)是否与下载页面上相应软件包下方显示的校验和匹配。

注意

请确保验证存档文件(例如.zip.tar.gz.msi文件)的校验和,而不是存档内包含的文件的校验和。换句话说,在提取内容之前验证文件。

原文:dev.mysql.com/doc/refman/8.0/en/checking-gpg-signature.html

2.1.4.2 使用 GnuPG 进行签名检查

验证软件包的完整性和真实性的另一种方法是使用加密签名。这比使用 MD5 校验和更可靠,但需要更多工作。

我们使用GnuPG(GNU 隐私卫士)对 MySQL 可下载包进行签名。GnuPG 是 Phil Zimmermann 的著名 Pretty Good Privacy(PGP)的开源替代方案。大多数 Linux 发行版默认安装了GnuPG。否则,请参阅www.gnupg.org/获取有关GnuPG的更多信息以及如何获取和安装它。

要验证特定包的签名,您首先需要获取我们的公共 GPG 构建密钥的副本,您可以从pgp.mit.edu/下载。您想要获取的密钥名为mysql-build@oss.oracle.com。MySQL 8.0.28 到 8.0.35 包的 keyID 为3A79BD29。在获取此密钥后,您应该在使用它验证 MySQL 包之前将其与下面显示的密钥进行比较。或者,您可以直接从下面的文本中复制并粘贴密钥。

重要

3A79BD29 密钥将于 2023-12-14 过期。一个新的替代密钥(A8D3785C)将签署即将发布的 MySQL 8.0.36 及更高版本的软件包。这两个密钥都将随 MySQL 8.0.35 发布的 MySQL 仓库设置软件包一起安装,并且这两个密钥也可以在repo.mysql.com/上找到。

注意

以下公共 GPG 构建密钥适用于 MySQL 8.0.28 到 8.0.35 包。对于早期 MySQL 发行包的公共 GPG 构建密钥(keyID 5072E1F5),请参阅 Section 2.1.4.5, “存档包的 GPG 公共构建密钥”。

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.6
Comment: Hostname: pgp.mit.edu

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
sTSKHe+QnnnoFmu4gnmDU31i
=Xqbo
-----END PGP PUBLIC KEY BLOCK-----

要将构建密钥导入到您的个人公共 GPG 密钥环中,请使用gpg --import。例如,如果您已将密钥保存在名为mysql_pubkey.asc的文件中,则导入命令如下:

$> gpg --import mysql_pubkey.asc
gpg: key 3A79BD29: public key "MySQL Release Engineering
<mysql-build@oss.oracle.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

您还可以使用公钥 id 3A79BD29 从公共密钥服务器下载密钥:

$> gpg --recv-keys 3A79BD29
gpg: requesting key 3A79BD29 from hkp server keys.gnupg.net
gpg: key 3A79BD29: "MySQL Release Engineering <mysql-build@oss.oracle.com>"
1 new user ID
gpg: key 3A79BD29: "MySQL Release Engineering <mysql-build@oss.oracle.com>"
53 new signatures
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:           new user IDs: 1
gpg:         new signatures: 53

如果您想将密钥导入到您的 RPM 配置中以验证 RPM 安装包,您应该能够直接导入密钥:

$> rpm --import mysql_pubkey.asc

如果您遇到问题或需要 RPM 特定信息,请参阅 Section 2.1.4.4, “使用 RPM 进行签名检查”。

在下载并导入公共构建密钥后,下载您需要的 MySQL 包以及相应的签名,这些也可以从下载页面获取。签名文件与分发文件具有相同的名称,扩展名为.asc,如下表中的示例所示。

表 2.1 MySQL 源文件的软件包和签名文件

文件类型 文件名
发行文件 mysql-standard-8.0.36-linux-i686.tar.gz
签名文件 mysql-standard-8.0.36-linux-i686.tar.gz.asc

确保这两个文件存储在同一目录中,然后运行以下命令验证发行文件的签名:

$> gpg --verify *package_name*.asc

如果下载的软件包有效,您应该看到类似于此的Good signature消息:

$> gpg --verify mysql-standard-8.0.36-linux-i686.tar.gz.asc
gpg: Signature made Tue 01 Feb 2011 02:38:30 AM CST using DSA key ID 3A79BD29
gpg: Good signature from "MySQL Release Engineering <mysql-build@oss.oracle.com>"

Good signature消息表示文件签名有效,与我们网站上列出的签名相比。但您可能也会看到警告,如下所示:

$> gpg --verify mysql-standard-8.0.36-linux-i686.tar.gz.asc
gpg: Signature made Wed 23 Jan 2013 02:25:45 AM PST using DSA key ID 3A79BD29
gpg: checking the trustdb
gpg: no ultimately trusted keys found
gpg: Good signature from "MySQL Release Engineering <mysql-build@oss.oracle.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: A4A9 4068 76FC BD3C 4567  70C8 8C71 8D3B 5072 E1F5

这是正常的,因为它们取决于您的设置和配置。以下是这些警告的解释:

  • gpg: 未找到最终受信任的密钥:这意味着您或您的信任网络没有“最终受信任”特定密钥,这对于验证文件签名是可以接受的。

  • 警告:此密钥未经受信任签名!没有迹象表明签名属于所有者。:这涉及您对自己拥有我们真实公钥的信任水平。这是个人决定。理想情况下,MySQL 开发人员会亲自交给您密钥,但更常见的是,您下载了它。下载是否被篡改?可能不会,但这个决定取决于您。建立信任网络是信任它们的一种方法。

请参阅 GPG 文档,了解如何使用公钥。

原文:dev.mysql.com/doc/refman/8.0/en/checking-gpg-signature-windows.html

2.1.4.3 使用 Gpg4win 在 Windows 上进行签名检查

第 2.1.4.2 节,“使用 GnuPG 进行签名检查”部分描述了如何使用 GPG 验证 MySQL 下载。该指南也适用于 Microsoft Windows,但另一种选择是使用类似Gpg4win的 GUI 工具。您可以使用不同的工具,但我们的示例是基于 Gpg4win,并利用其捆绑的Kleopatra GUI。

下载并安装 Gpg4win,然后加载 Kleopatra。对话框应该类似于:

图 2.1 Kleopatra:初始屏幕

显示默认的 Kleopatra 屏幕。顶部菜单包括“文件”,“查看”,“证书”,“工具”,“设置”,“窗口”和“帮助”。顶部菜单下方是一个水平操作栏,包括“导入证书”,“重新显示”和“在服务器上查找证书”的可用按钮。灰色按钮为“导出证书”和“停止操作”。下方是一个名为“查找”的搜索框。在下面是三个选项卡:“我的证书”,“受信任的证书”和“其他证书”,其中选择了“我的证书”选项卡。���我的证书”包含六列:“名称”,“电子邮件”,“有效期从”,“有效期至”,“详细信息”和“密钥 ID”。没有示例值。

接下来,添加 MySQL Release Engineering 证书。通过单击文件,查找服务器上的证书来执行此操作。在搜索框中键入“Mysql Release Engineering”并按搜索。

图 2.2 Kleopatra:在服务器上查找证书向导:查找证书

显示一个名为“查找”的搜索输入字段,标题为“mysql release engineering”,输入的内容为“mysql release engineering”。一个结果包含以下值:名称=MySQL Release Engineering,电子邮件=mysql-build@oss.oracle.com,有效期从 2003-02-03 开始,有效期至“”,详细信息=OpenPGP,指纹=5072E1F5,密钥 ID=5072E1F5。可用的操作按钮有:搜索,全选,取消全选,详细信息,导入和关闭。

选择“MySQL Release Engineering”证书。对于 MySQL 8.0.28 及更高版本,指纹和密钥 ID 必须为“3A79BD29”,对于 MySQL 8.0.27 及更早版本,必须为“5072E1F5”,或选择“详细信息...”以确认证书是否有效。现在,通过单击“导入”来导入它。当显示导入对话框时,选择“确定”,此证书现在应该列在“导入的证书”选项卡下。

接下来,配置我们证书的信任级别。选择我们的证书,然后从主菜单中选择证书,更改所有者信任....我们建议选择“我相信检查非常准确”以验证我们的证书,否则您可能无法验证我们的签名。选择“我相信检查非常准确”以启用“完全信任”,然后按“确定”。

图 2.3 Kleopatra:更改 MySQL 发布工程的信任级别

显示了一系列信任选项,包括"I don't know (unknown trust)"、"I do NOT trust them (never trust)"、"I believe checks are casual (marginal trust)"、"I believe checks are very accurate (full trust)"和"This is my certificate (ultimate trust)"。选择了"I believe checks are very accurate (full trust)"选项。

接下来,验证已下载的 MySQL 软件包文件。这需要打包文件和签名文件。签名文件必须与打包文件同名,但要附加一个 .asc 扩展名,如下表中的示例所示。签名在每个 MySQL 产品的下载页面上都有链接。您必须使用此签名创建 .asc 文件。

表 2.2 MySQL Installer for Microsoft Windows 的 MySQL 软件包和签名文件

文件类型 文件名
分发文件 mysql-installer-community-8.0.36.msi
签名文件 mysql-installer-community-8.0.36.msi.asc

确保两个文件存储在同一目录中,然后运行以下命令来验证分发文件的签名。要么将签名(.asc)文件拖放到 Kleopatra 中,要么从文件中加载对话框,选择 Decrypt/Verify Files...,然后选择 .msi 或 .asc 文件。

图 2.4 Kleopatra:解密和验证文件对话框

显示了可用的解密和验证选项。示例中使用了一个 MySQL Installer MSI 文件,其中 .asc 文件列为"输入文件",.msi 文件列为"签名数据"。选中了"Input file is detached signature"选项的复选框。显示了一个"Input file is an archive; unpack with:"选项,但是被灰掉了。下方是"Create all output files in a single folder"选项的复选框,以及一个"Output folder"输入框,示例中输入了"C:/docs"。可用的按钮有"Back"(灰掉)、"Decrypt/Verify"和"Cancel"。

点击 Decrypt/Verify 来检查文件。最常见的两种结果看起来像下图;尽管黄色警告可能看起来有问题,但以下内容表示文件检查已成功通过。您现在可以运行此安装程序。

图 2.5 Kleopatra:解密和验证结果对话框:所有操作已完成

结果窗口的黄色部分显示了"Not enough information to check signature validity"和"The validity of the signature cannot be verified."。还显示了关键信息,如 KeyID 和电子邮件地址,密钥的签名日期,并显示了 ASC 文件的名称。

如果看到红色的"The signature is bad"错误,意味着文件无效。如果看到此错误,请不要执行 MSI 文件。

图 2.6 Kleopatra:解密和验证结果对话框:错误

结果窗口中的红色部分显示“无效签名”,“使用未知证书签名”,“签名有问题”,并显示 ASC 文件的名称。

第 2.1.4.2 节,“使用 GnuPG 进行签名检查”解释了为什么你看不到绿色的Good signature结果。

原文:dev.mysql.com/doc/refman/8.0/en/checking-rpm-signature.html

2.1.4.4 使用 RPM 进行签名检查

对于 RPM 软件包,没有单独的签名。RPM 软件包具有内置的 GPG 签名和 MD5 校验和。你可以通过运行以下命令来验证一个软件包:

$> rpm --checksig *package_name*.rpm

示例:

$> rpm --checksig mysql-community-server-8.0.36-1.el8.x86_64.rpm
mysql-community-server-8.0.36-1.el8.x86_64.rpm: digests signatures OK

注意

如果你正在使用 RPM 4.1,并且它抱怨(GPG) NOT OK (MISSING KEYS: GPG#3a79bd29),即使你已经将 MySQL 公共构建密钥导入到你自己的 GPG 密钥环中,你需要先将该密钥导入到 RPM 密钥环中。RPM 4.1 不再使用你的个人 GPG 密钥环(或 GPG 本身)。相反,RPM 维护一个单独的密钥环,因为它是一个系统范围的应用程序,而用户的 GPG 公钥环是一个特定于用户的文件。要将 MySQL 公共密钥导入到 RPM 密钥环中,首先获取该密钥,然后使用rpm --import导入该密钥。例如:

$> gpg --export -a 3a79bd29 > 3a79bd29.asc
$> rpm --import 3a79bd29.asc

或者,rpm也支持直接从 URL 加载密钥:

$> rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

你也可以从本手册页面获取 MySQL 公共密钥:第 2.1.4.2 节,“使用 GnuPG 进行签名检查”。

原文:dev.mysql.com/doc/refman/8.0/en/gpg-key-archived-packages.html

2.1.4.5 已归档软件包的 GPG 公共构建密钥

以下 GPG 公共构建密钥(keyID 5072E1F5)可用于验证 MySQL 8.0.27 及更早版本软件包的真实性和完整性。有关签名检查说明,请参见第 2.1.4.2 节,“使用 GnuPG 进行签名检查”。

MySQL 8.0.27 及更早版本的 GPG 公共构建密钥
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.6
Comment: Hostname: pgp.mit.edu

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
uck=
=yia9
-----END PGP PUBLIC KEY BLOCK-----
posted @ 2024-06-23 16:31  绝不原创的飞龙  阅读(38)  评论(0编辑  收藏  举报