我们自豪地宣布 MySQL 8.0 正式发布。立即下载!MySQL 8.0 是世界上最受欢迎的开源数据库的一个非常令人兴奋的新版本,并进行了全面的改进。一些主要增强功能包括:
- SQL 窗口函数、公共表表达式、NOWAIT 和 SKIP LOCKED、降序索引、分组、正则表达式、字符集、成本模型和直方图。
- JSON 格式扩展了语法、新功能、改进的排序和部分更新。借助 JSON 表函数,您可以将 SQL 机制用于 JSON 数据。
- 地理信息系统 地理支持。空间参考系统 (SRS) 以及 SRS 感知空间数据类型、空间索引和空间函数。
- 可靠性 DDL 语句已经变得原子化和崩溃安全,元数据存储在单个事务性数据字典中。由 InnoDB 提供支持!
- 可观察性对 Performance Schema、Information Schema、Configuration Variables 和 Error Logging 进行了重大增强。
- 可管理性远程管理、撤消表空间管理和新的即时 DDL。
- 安全 OpenSSL 改进、新的默认身份验证、SQL 角色、打破超级权限、密码强度等。
- 性能InnoDB 在读/写工作负载、IO 绑定工作负载和高争用“热点”工作负载方面明显更好。添加了资源组功能,通过将用户线程映射到 CPU,为用户提供针对特定硬件上的特定工作负载进行优化的选项。
以上内容代表了其中的一些亮点,我鼓励您进一步深入研究完整的 Milestone 博客文章系列(8.0.0、8.0.1、8.0.2、8.0.3 和 8.0.4),甚至进一步深入研究各个工作日志及其规范和实施细节。或者,您可能更喜欢只查看 github.com/mysql 的源代码。
开发人员功能
MySQL 开发人员需要新功能,而 MySQL 8.0 在 SQL、JSON、正则表达式和 GIS 等领域提供了许多新的和呼声很高的功能。开发人员还希望能够存储 Emojis,因此 UTF8MB4 现在是 8.0 中的默认字符集。最后,数据类型也有所改进,对 BINARY 数据类型进行了按位运算,并改进了 IPv6 和 UUID 函数。
SQL
窗口函数
MySQL 8.0 提供 SQL 窗口功能。与分组聚合函数类似,窗口函数对一组行执行一些计算,例如 COUNT 或 SUM。但是,如果分组聚合将此行集折叠为一行,则窗口函数将对结果集中的每一行执行聚合。
窗口函数有两种类型:用作窗口函数的 SQL 聚合函数和专用窗口函数。这是 MySQL 中支持窗口的聚合函数集:COUNT、SUM、AVG、MIN、MAX、BIT_OR、BIT_AND、BIT_XOR、STDDEV_POP(及其同义词 STD、STDDEV)、STDDEV_SAMP、VAR_POP(及其同义词 VARIANCE)和 VAR_SAMP。专用窗口函数集包括:RANK、DENSE_RANK、PERCENT_RANK、CUME_DIST、NTILE、ROW_NUMBER、FIRST_VALUE、LAST_VALUE、NTH_VALUE、LEAD 和 LAG
对窗口函数(又名分析函数)的支持是用户的常见请求。窗口函数长期以来一直是标准 SQL (SQL 2003) 的一部分。在此处查看 Dag Wanvik 的博客文章,以及 Guilhem Bichot 的博客文章。
公共表表达式
MySQL 8.0 提供 [递归] 公用表表达式 (CTE)。非递归 CTE 可以解释为“改进的派生表”,因为它允许多次引用派生表。递归 CTE 是一组迭代构建的行:从初始行集开始,进程派生新行,这些行会增加集合,这些新行将再次馈送到进程中,生成更多行,依此类推,直到进程不再生成行。CTE 是经常请求的 SQL 功能,例如,请参阅功能请求 16244 和 32174 。请在此处、此处、此处和此处查看 Guilhem Bichot 的博客文章。
NOWAIT 和 SKIP 锁定
MySQL 8.0 在 SQL 锁定子句中提供和替代方案。通常,当行由于 an 或 a 而被锁定时,任何其他事务都必须等待访问该锁定的行。在某些用例中,如果行被锁定,则需要立即返回或忽略锁定的行。using 的锁定子句永远不会等待获取行锁。相反,查询将失败并显示错误。使用 的锁定子句永远不会等待获取列出的 table 上的行锁。相反,将跳过锁定的行,并且根本不读取。NOWAIT 和 SKIP LOCKED 是经常请求的 SQL 功能。有关示例,请参阅 feature request 49763 。我们还想感谢 Kyle Oppenheim 对代码的贡献!在此处查看 Martin Hansson 的博客文章。NOWAIT
SKIP LOCKED
UPDATE
SELECT ... FOR UPDATE
NOWAIT
SKIP LOCKED
降序索引
MySQL 8.0 支持按降序排列的索引。此类索引中的值按降序排列,我们向前扫描它。在 8.0 之前,当用户创建降序索引时,我们会创建一个升序索引并对其进行反向扫描。一个好处是前向索引扫描比后向索引扫描更快。真正的降序索引的另一个好处是,它使我们能够对具有混合排序键部分的子句使用 indexes 而不是 filesort。降序索引是一项经常请求的 SQL 功能。有关示例,请参阅 feature request 13375 。在此处查看 Chaithra Gopalareddy 的博客文章。ORDER BY
ASC/DESC
分组
MySQL 8.0 提供 、 、 .该函数将超级聚合行与常规分组行区分开来。 扩展(如)会生成超级聚合行,其中所有值的集合都由 null 表示。使用该函数,您可以区分表示超级聚合行中所有值集的 null 与常规行中的 a。GROUPING 是一项经常请求的 SQL 功能。请参阅功能请求 3156 和 46053。感谢 Zoe Dong 和 Shane Adams 在功能请求 46053 中贡献的代码!在此处查看 Chaithra Gopalareddy 的博客文章。GROUPING()
SQL_FEATURE T433
GROUPING()
GROUP BY
ROLLUP
GROUPING()
NULL
优化器提示
在 5.7 中,我们为优化器提示引入了新的提示语法。使用新语法,可以在 SQL 语句中的关键字后面直接指定提示,并将其括在样式注释中。(请在此处查看 Sergey Glukhov 的 5.7 博客文章)。在 MySQL 8.0 中,我们通过充分利用这种新样式来完成这幅画:SELECT | INSERT | REPLACE | UPDATE | DELETE
/*+ */
- MySQL 8.0 为 和 添加了提示。这允许用户控制单个查询的索引合并行为,而无需更改优化器开关。
INDEX_MERGE
NO_INDEX_MERGE
- MySQL 8.0 添加了 、 、 和 的提示。这允许用户控制联接执行的 table 顺序。
JOIN_FIXED_ORDER
JOIN_ORDER
JOIN_PREFIX
JOIN_SUFFIX
- MySQL 8.0 添加了一个名为 .该提示将仅为 next 语句设置给定系统变量的值。因此,在语句结束后,该值将重置为前一个值。在此处查看 Sergey Glukhov 的博客文章。
SET_VAR
SET_VAR
我们更喜欢新样式的优化器提示,而不是旧样式的提示和optimizer_switch
值设置。由于不与 SQL 混合,新提示可以注入查询字符串中的许多位置。它们在作为提示 (vs directive) 方面也有更清晰的语义。
JSON 格式
MySQL 8.0 添加了新的 JSON 函数,并提高了对 JSON 值进行排序和分组的性能。
JSON 路径表达式中范围的扩展语法
MySQL 8.0 扩展了 JSON 路径表达式中范围的语法。例如,结果为 。引入的新语法是 SQL 标准语法的子集,如 SQL:2016, 9.39 SQL/JSON 路径语言:语法和语义中所述。另请参阅 Roland Bouman 报告的 Bug#79052。SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]');
[2, 3, 4]
JSON 表函数
MySQL 8.0 添加了 JSON 表函数,支持对 JSON 数据使用 SQL 机制。 创建 JSON 数据的关系视图。它将 JSON 数据评估的结果映射到关系行和列。用户可以使用 SQL 将函数返回的结果作为常规关系表进行查询,例如 join、project 和 aggregate。JSON_TABLE()
JSON 聚合函数
MySQL 8.0 添加了聚合函数以生成 JSON 数组和生成 JSON 对象。这样就可以将多行中的 JSON 文档合并到 JSON 数组或 JSON 对象中。在此处查看 Catalin Besleaga 的博客文章。JSON_ARRAYAGG()
JSON_OBJECTAGG()
JSON 合并函数
该函数实现了 RFC7396 指定的 JavaScript(和其他脚本语言)的语义,即它按第二个文档的优先级删除重复项。例如。JSON_MERGE_PATCH()
JSON_MERGE('{"a":1,"b":2 }','{"a":3,"c":4 }'); # returns {"a":3,"b":2,"c":4}
该函数具有在 MySQL 5.7 中实现的 JSON_MERGE() 语义,它保留所有值,例如JSON_MERGE_PRESERVE()
JSON_MERGE('{"a": 1,"b":2}','{"a":3,"c":4}'); # returns {"a":[1,3],"b":2,"c":4}.
现有函数在 MySQL 8.0 中已弃用,以消除合并操作的歧义。另请参阅 Bug#81283 中的提案和 Morgan Tocker 的博客文章。JSON_MERGE()
JSON Pretty 函数
MySQL 8.0 在 MySQL 中增加了一个函数。该函数接受 JSON 的 JSON 原生数据类型或 JSON 的字符串表示形式,并以人类可读的方式返回带有新行和缩进的 JSON 格式字符串。JSON_PRETTY()
JSON 大小函数
MySQL 8.0 添加了与给定 JSON 对象的空间使用相关的 JSON 函数。这将返回 JSON 数据类型的实际大小(以字节为单位)。这将返回 JSON 二进制类型的可用空间(以字节为单位),包括为就地更新而保存的碎片和填充。JSON_STORAGE_SIZE()
JSON_STORAGE_FREE()
JSON 改进的排序
MySQL 8.0 通过使用可变长度排序键为对 JSON 值进行排序/分组提供了更好的性能。初步基准显示,根据用例,排序性能提高了 1.2 到 18 倍。
JSON 部分更新
MySQL 8.0 增加了对 和 函数的部分更新的支持。如果只更新了 JSON 文档的某些部分,我们希望向处理程序提供有关更改内容的信息,以便存储引擎和复制不需要编写完整文档。在复制环境中,无法保证 JSON 文档的布局在从服务器和主服务器上完全相同,因此物理差异不能用于减少基于行的复制的网络 I/O。因此,MySQL 8.0 提供了基于行的复制可以通过网络发送并在从属服务器上重新应用的逻辑差异。在此处查看 Knut Anders Hatlen 的博客文章。JSON_REMOVE()
JSON_SET()
JSON_REPLACE()
地理信息系统
MySQL 8.0 提供地理支持。这包括对空间参考系统 (SRS) 的元数据支持,以及 SRS 感知空间数据类型、空间索引和空间函数。简而言之,MySQL 8.0 可以理解地球表面的纬度和经度坐标,例如,在大约 5000 个受支持的空间参考系统中,可以正确计算地球表面上两点之间的距离。
空间参考系 (SRS)
信息架构视图提供有关空间数据的可用空间参考系统的信息。此视图基于 SQL/MM (ISO/IEC 13249-3) 标准。每个空间参考系统都由一个 SRID 编号标识。MySQL 8.0 附带了来自 EPSG 大地测量参数数据集的大约 5000 个 SRID,涵盖地理配准椭球体和 2D 投影(即所有 2D 空间参考系统)。ST_SPATIAL_REFERENCE_SYSTEMS
SRID 感知空间数据类型
空间数据类型可以使用空间参考系统定义进行属性化,例如使用 SRID 4326,如下所示:SRID 在此处是 GEOMETRY 数据类型的 SQL 类型修饰符。插入到具有 SRID 属性的列中的值必须位于该 SRID 中。尝试使用其他 SRID 插入值会导致引发异常情况。未修改的类型(即没有 SRID 规范的类型)将继续像以前一样接受所有 SRID。CREATE TABLE t1 (g GEOMETRY SRID 4326);
MySQL 8.0 添加了 SQL/MM 第 3 部分 第 19.2 节中指定的视图。此视图将列出 MySQL 实例中的所有 GEOMETRY 列,并且对于每个列,它将列出标准 、 和 。INFORMATION_SCHEMA.ST_GEOMETRY_COLUMNS
SRS_NAME
SRS_ID
GEOMETRY_TYPE_NAME
SRID 感知空间索引
可以根据空间数据类型创建空间索引。空间索引中的列必须声明为 NOT NULL。例如,如下所示:CREATE TABLE t1 (g GEOMETRY SRID 4326 NOT NULL, SPATIAL INDEX(g));
具有空间索引的列应具有 SRID 类型修饰符,以允许优化器使用该索引。如果在没有 SRID 类型修饰符的列上创建空间索引,则会发出警告。
SRID 感知空间函数
MySQL 8.0 扩展了空间函数,例如 和 检测其参数是否位于地理(椭球体)SRS 中,并计算椭球体上的距离。到目前为止,空间关系(如 、 、 等)支持地理计算。每个 ST 函数的行为如 SQL/MM 第 3 部分 空间 中所定义。ST_Distance()
ST_Length()
ST_Distance
ST_Within
ST_Intersects
ST_Contains
ST_Crosses
字符集
MySQL 8.0 将 UTF8MB4 作为默认字符集。与 5.7 相比,8.0 中的 SQL 性能(例如对字符串UTF8MB4排序)提高了 20 倍。UTF8MB4 是 Web 的主要字符编码,此举将使绝大多数 MySQL 用户的生活更轻松。
- 默认字符集已从 更改为 ,默认排序规则已从 更改为 。
latin1
utf8mb4
latin1_swedish_ci
utf8mb4_800_ci_ai
- defaults 中的更改适用于 libmysql 和服务器命令工具以及服务器本身。
- 这些更改也会反映在 MTR 测试中,使用新的默认字符集运行。
- 排序规则权重和大小写映射基于 Unicode 9.0.0 ,由 Unicode 委员会于 2016 年 6 月 21 日宣布。
- 已为排序规则实施了 21 个可用于 latin1(MySQL 旧版)的特定语言不区分大小写的排序规则,例如,捷克语排序规则变为 utf8mb4_cs_800_ai_ci。请参阅 WL#9108 中的完整列表。在此处查看 Xing Zhang 的博客文章。
utf8mb4
- 添加了对区分大小写和重音排序规则的支持。MySQL 8.0 支持 DUCET(默认 Unicode 排序规则条目表)定义的所有 3 个排序规则权重级别。在此处查看 Xing Zhang 的博客文章。
- 使用三个级别的权重对字符进行排序的日语排序规则。这将为日语提供正确的排序顺序。在此处查看 Xing Zhang 的博客文章。
utf8mb4_ja_0900_as_cs
utf8mb4
- 具有额外假名敏感功能的日语,其中“ks”代表“敏感假名”。在此处查看 Xing Zhang 的博客文章。
utf8mb4_ja_0900_as_cs_ks
- 从 Unicode 9.0.0 开始,将所有新的排序规则更改为 be 而不是 ,即像任何其他字符一样处理字符串末尾的空格。这样做是为了提高一致性和性能。较旧的排序规则将保留在原位。
NO PAD
PAD STRING
另请参阅 Bernt Marius Johnsen 的博客文章 这里, 这里 和 这里.
数据类型
对二进制数据类型进行按位运算
MySQL 8.0 扩展了按位运算(“按位 AND”等)以也适用于 .在 8.0 之前,仅整数支持按位运算。如果对二进制文件使用按位运算,则参数在运算之前被隐式转换为 (64 bit),因此可能会丢失位。从 8.0 开始,按位运算适用于所有数据类型和数据类型,强制转换参数以使位不会丢失。[VAR]BINARY/[TINY|MEDIUM|LONG]BLOB
BIGINT
BINARY
BLOB
IPV6 操纵
MySQL 8.0 通过支持对 BINARY 数据类型进行按位运算,提高了 IPv6 操作的可用性。在 MySQL 5.6 中,我们引入了 and 函数,这些函数可以在文本形式之间转换 IPv6 地址,例如 和 。但是,到目前为止,我们还无法将这些 IPv6 函数与按位运算相结合,因为此类运算会错误地将输出转换为 。例如,如果我们有一个 IPv6 地址,并且想要根据网络掩码对其进行测试,我们现在可以使用 because 正确返回数据类型(128 位)。在此处查看 Catalin Besleaga 的博客文章。INET6_ATON()
INET6_NTOA()
'fe80::226:b9ff:fe77:eb17'
VARBINARY(16)
BIGINT
INET6_ATON(address)
& INET6_ATON(network)INET6_ATON()
VARBINARY(16)
UUID 操作
MySQL 8.0 通过实施三个新的 SQL 函数来提高 UUID 操作的可用性:、 和 。第一个选项从 UUID 格式的文本转换为 ,第二个选项从 UUID 格式的文本转换为,最后一个选项检查 UUID 格式文本的有效性。存储为 a 的 UUID 可以使用函数索引进行索引。函数 和 还可以随机排列与时间相关的位,并在开始时移动它们,使其对索引友好并避免 B 树中的随机插入,从而减少插入时间。缺乏此类功能被认为是使用 UUID 的缺点之一。在此处查看 Catalin Besleaga 的博客文章。UUID_TO_BIN()
BIN_TO_UUID()
IS_UUID()
VARBINARY(16)
VARBINARY(16)
VARBINARY(16)
UUID_TO_BIN()
UUID_TO_BIN()
成本模型
Query Optimizer 考虑数据缓冲
MySQL 8.0 根据有关数据是驻留在内存中还是磁盘上的知识来选择查询计划。这是自动发生的,从最终用户的角度来看,不涉及任何配置。从历史上看,MySQL 成本模型假定数据驻留在旋转磁盘上。与在内存中和磁盘上查找数据相关的成本常数现在不同,因此,优化器将根据对数据位置的了解,为这两种情况选择更优化的访问方法。在此处查看 Øystein Grøvlen 的博客文章。
优化器直方图
MySQL 8.0 实现了直方图统计。使用直方图,用户可以创建表中列的数据分布统计信息,通常为未索引的列创建统计信息,然后查询优化器将使用这些数据来查找最佳查询计划。直方图统计信息的主要用例是计算“COLUMN operator CONSTANT”形式的谓词的选择性(筛选效果)。
用户通过语法创建直方图,该语法已扩展为接受两个新子句:和 .存储桶的数量是可选的,默认值为 100。直方图统计信息存储在字典表 “column_statistics” 中,可通过视图 .由于 JSON 数据类型的灵活性,直方图存储为 JSON 对象。 将根据表大小自动决定是否对基表进行采样。它还将根据数据分布和指定的存储桶数量来决定是构建单例直方图还是等高直方图。在此处查看 Erik Frøseth 的博客文章。ANALYZE TABLE
UPDATE HISTOGRAM ON column [, column] [WITH n BUCKETS]
DROP HISTOGRAM ON column [, column]
information_schema.COLUMN_STATISTICS
ANALYZE TABLE
正则表达式
MySQL 8.0 支持 UTF8MB4 的正则表达式以及 、、 和 等新函数。添加了系统变量 regexp_stack_limit(默认字节)和 regexp_time_limit(默认 32 步)来控制执行。该函数是 MySQL 社区最需要的功能之一,例如,请参阅 Hans Ginzel 报告为 BUG #27389 的功能请求。另请参阅 Martin Hansson 的博客文章 此处 和 Bernt Marius Johnsen 的博客文章 此处.REGEXP_INSTR()
REGEXP_LIKE()
REGEXP_REPLACE()
REGEXP_SUBSTR()
8000000
REGEXP_REPLACE()
Dev Ops 功能
Dev Ops 关心数据库的运营方面,通常涉及可靠性、可用性、性能、安全性、可观察性和可管理性。高可用性附带 MySQL InnoDB Cluster 和 MySQL Group Replication,这将在单独的博客文章中介绍。以下是 8.0 在其他类别中带来的内容。
可靠性
MySQL 8.0 提高了 MySQL 的整体可靠性,因为:
- MySQL 8.0 将其元数据存储到 InnoDB 中,InnoDB 是一个经过验证的事务存储引擎。系统表(如用户和权限)以及数据字典表现在驻留在 InnoDB 中。
- MySQL 8.0 消除了一个潜在的不一致来源。在 5.7 及更早版本中,基本上有两个数据字典,一个用于 Server 层,一个用于 InnoDB 层,在某些崩溃情况下,它们可能会不同步。在 8.0 中,只有一个数据字典。
- MySQL 8.0 确保原子、崩溃安全的 DDL。这样,用户可以保证任何 DDL 语句要么被完全执行,要么根本不执行。这在复制环境中尤为重要,否则可能会出现主服务器和从服务器(节点)不同步的情况,从而导致数据漂移。
这项工作是在新的事务性数据字典的上下文中完成的。请在此处和此处查看 Staale Deraas 的博客文章。
可观察性
信息架构(加速)
MySQL 8.0 重新实现了 Information Schema。在新实现中,信息模式表是存储在 InnoDB 中的数据字典表的简单视图。这比旧的实现效率更高,速度提高了 100 倍。这使得 Information Schema 实际上可以由外部工具使用。在此处查看 Gopal Shankar 的博客文章,以及 Ståle Deraas 的博客文章。
性能架构(加速)
MySQL 8.0 通过在性能 Schema 表上添加 100 多个索引来加速性能 Schema 查询。性能架构表上的索引是预定义的。它们不能被删除、添加或更改。性能模式索引实现为对现有表数据的过滤扫描,而不是通过单独的数据结构进行遍历。无需构建、更新或以其他方式管理 B 树或哈希表。性能模式表索引的行为类似于哈希索引,因为 a) 它们快速检索所需的行,并且 b) 不提供行排序,让服务器在必要时对结果集进行排序。但是,根据查询的不同,索引消除了对全表扫描的需要,并且将返回一个相当小的结果集。性能架构索引在引用索引列的查询的输出中可见并表示。参见 Simon Mudd 的评论。在此处查看 Marc Alff 的博客文章。SHOW INDEXES
EXPLAIN
配置变量
MySQL 8.0 添加了有关配置变量的有用信息,例如变量名称、最小/最大值、当前值的来源、更改者以及更改时间。此信息位于名为 的新性能架构表中。在此处查看 Satish Bharathy 的博客文章。variables_info
客户端错误报告 – 消息计数
MySQL 8.0 可以查看服务器报告的客户端错误消息的聚合计数。用户可以查看 5 个不同表中的统计信息:全局计数、每个线程的摘要、每个用户的摘要、每个主机的摘要或每个帐户的摘要。对于每条错误消息,用户可以看到引发的错误数、SQL 异常处理程序处理的错误数、“first seen” 时间戳和 “last seen” 时间戳。如果具有正确的权限,用户可以从这些表中重置统计信息。在此处查看 Mayank Prasad 的博客文章。SELECT
TRUNCATE
语句延迟直方图
MySQL 8.0 提供语句延迟的性能架构直方图,以便更好地了解查询响应时间。这项工作还从收集的直方图中计算 “P95 ”、“ P99 ” 和 “P999 ”百分位数。这些百分位数可用作服务质量的指标。在此处查看 Frédéric Descamps 的博客文章。
数据锁定依赖关系图
MySQL 8.0 在性能架构中检测数据锁。当事务 A 正在锁定行 R,而事务 B 正在等待同一行时,B 实际上被 A 阻止。添加的检测会公开哪些数据被锁定 (R)、谁拥有锁 (A) 以及谁正在等待数据 (B)。在此处查看 Frédéric Descamps 的博客文章。
摘要查询示例
MySQL 8.0 对 events_statements_summary_by_digest 性能架构表进行了一些更改,以捕获完整的示例查询和有关此查询示例的一些关键信息。添加该列是为了捕获查询样本,以便用户可以在实际查询上运行 EXPLAIN 并获取查询计划。添加该列以捕获查询示例时间戳。添加该列以捕获查询示例执行时间。列 和 已修改为使用秒的小数部分。在此处查看 Frédéric Descamps 的博客文章。QUERY_SAMPLE_TEXT
QUERY_SAMPLE_SEEN
QUERY_SAMPLE_TIMER_WAIT
FIRST_SEEN
LAST_SEEN
关于 Instruments 的元数据
MySQL 8.0 将属性、易变性和文档等元数据添加到性能架构表setup_instruments。此只读元数据充当仪器的在线文档,供用户或工具查看。在此处查看 Frédéric Descamps 的博客文章。
错误日志记录
MySQL 8.0 对 MySQL 错误日志进行了重大改革。从软件架构的角度来看,错误日志是新服务基础设施中的一个组件。这意味着高级用户可以根据需要编写自己的错误日志实现。大多数用户不想编写自己的错误日志实现,但仍希望在写入内容和写入位置方面具有一定的灵活性。因此,8.0 为用户提供了添加 sink (where) 和过滤器 (what) 的工具。MySQL 8.0 实现了过滤服务 (API) 和默认过滤服务实现(组件)。此处的过滤是指禁止显示给定日志消息中的某些日志消息(选择)和/或字段(投影)。MySQL 8.0 实现了日志编写器服务 (API) 和默认日志编写器服务实现(组件)。日志编写器接受日志事件并将其写入日志。此日志可以是经典文件、syslog、EventLog 和新的 JSON 日志编写器。
默认情况下,无需任何配置,MySQL 8.0 即可提供许多开箱即用的错误日志改进,例如:
- 错误编号:格式是 10000 系列中前面带有 “MY-” 的数字,例如 “MY-10001”。错误编号在 GA 版本中将是稳定的,但相应的错误文本允许在维护版本中更改(即改进)。
- 系统消息: 系统消息将作为 [System] 而不是 [Error]、[Warning]、[Note] 写入错误日志。无论详细程度如何,都会打印 [System] 和 [Error] 消息,并且无法抑制。[System] 消息仅在少数地方使用,主要与启动或停止服务器等主要状态转换相关联。
- 减少详细程度: 默认值 log_error_verbosity 从 3 (Notes) 更改为 2 (Warning)。这使得 MySQL 8.0 错误日志默认不那么详细。
- 源组件:每条消息都使用三个值 [Server], [InnoDB], [Replic] 之一进行注释,显示消息来自哪个子系统。
这是启动后写入 8.0 GA 错误日志的内容:
1
2
3
4
|
2018-03-08T10:14:29.289863Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.5) starting as process 8063
2018-03-08T10:14:29.745356Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2018-03-08T10:14:29.765159Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.5' socket: '/tmp/mysql.sock' port: 3306 Source distribution.
2018-03-08T10:16:51.343979Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.5) Source distribution.
|
在错误日志中引入错误编号允许 MySQL 在保持错误号 (ID) 不变的情况下改进即将发布的维护版本(如果需要)中的错误文本。错误号还充当过滤/抑制和国际化/本地化的基础。
可管理性
INVISIBLE 索引
MySQL 8.0 增加了切换索引可见性(可见/不可见)的功能。优化器在制定查询执行计划时不会考虑不可见索引。但是,索引仍然在后台维护,因此使其再次可见的成本较低。这样做的目的是让 DBA/DevOp 确定是否可以删除索引。如果您怀疑某个索引未被使用,请先将其设为不可见,然后监控查询性能,最后在未遇到查询速度减慢时删除该索引。许多用户都要求使用此功能,例如通过 Bug#70299。在此处查看 Martin Hansson 的博客文章。
灵活的 Undo Tablespace Management
MySQL 8.0 使用户可以完全控制撤消表空间,即表空间的数量、它们的放置位置以及每个表中的回滚段数量。
- System 表空间中不再有 Undo log。在升级期间,撤消日志将从系统表空间迁移到撤消表空间。这为使用系统表空间进行撤消日志的现有 5.7 安装提供了升级路径。
- Undo 表空间可以与 System 表空间分开管理。例如,Undo tablespaces 可以放在快速存储中。
- 回收异常大额交易占用的空间(在线)。至少创建两个 Undo 表空间以允许表空间截断。这允许 InnoDB 缩小撤消表空间,因为一个 Undo 表空间可以处于活动状态,而另一个 Undo 表空间被截断。
- 回滚 Segment 越多,争用就越少。 用户可以选择最多有 127 个 Undo 表空间,每个表空间最多有 128 个回滚段。更多的回滚段意味着并发事务更有可能对其撤消日志使用单独的回滚段,从而减少对相同资源的争用。
在此处查看 Kevin Lewis 的博客文章。
全局变量的 SET PERSIST
MySQL 8.0 可以持久保存全局动态服务器变量。许多服务器变量既是 GLOBAL 又是 DYNAMIC,并且可以在服务器运行时重新配置。例如:但是,此类设置在服务器重新启动时会丢失。SET GLOBAL sql_mode='STRICT_TRANS_TABLES';
这项工作使编写效果成为可能,该设置将在服务器重启后继续存在。此功能有许多使用场景,但最重要的是,它提供了一种在编辑配置文件不方便或不可用时管理服务器设置的方法。例如,在某些托管环境中,您没有文件系统访问权限,您所拥有的只是连接到一个或多个服务器的能力。至于你需要 的 super 权限。SET PERSIST sql_mode='STRICT_TRANS_TABLES';
SET GLOBAL
SET PERSIST
还有命令。该命令的语义是从 persist 配置中删除配置变量,从而将其转换为具有与 .RESET PERSIST
RESET PERSIST
SET GLOBAL
MySQL 8.0 也允许设置大多数只读变量,新值将在下次服务器重启时生效。请注意,一小部分只读变量是有意保留的,不允许设置。在此处查看 Satish Bharathy 的博客文章。SET PERSIST
远程管理
MySQL 8.0 实现了 SQL RESTART 命令。目的是通过 SQL 连接实现对 MySQL 服务器的远程管理,例如,通过后跟 .请参阅博客文章 MySQL 8.0:轻松更改配置且云友好!作者:Frédéric Descamps。SET PERSIST
RESTART
重命名表空间 (SQL DDL)
MySQL 8.0 实现了共享/通用表空间是一个用户可见的实体,用户可以 CREATE、ALTER 和 DROP 该实体。另请参见 Bug#26949、Bug#32497 和 Bug#58006。ALTER TABLESPACE s1 RENAME TO s2;
重命名列 (SQL DDL)
MySQL 8.0 实现了这是对现有语法 ALTER TABLE <table_name> CHANGE ...这需要重新指定列的所有属性。旧/现有语法的缺点是,尝试执行重命名的应用程序可能无法获得所有列信息。旧/现有语法中还存在意外更改数据类型的风险,这可能会导致数据丢失。ALTER TABLE ... RENAME COLUMN old_name TO new_name;
安全功能
新的默认身份验证插件
MySQL 8.0 将默认身份验证插件从 mysql_native_password 更改为 caching_sha2_password。相应地,libmysqlclient 也将使用 caching_sha2_password 作为默认身份验证机制。新caching_sha2_password结合了更好的安全性(SHA2 算法)和高性能(缓存)。总体方向是我们建议所有用户使用 TLS/SSL 进行所有网络通信。在此处查看 Harin Vadodaria 的博客文章。
Community Edition
中默认使用 OpenSSL
MySQL 8.0 在 OpenSSL 上统一为 MySQL 企业版和 MySQL 社区版的默认 TLS/SSL 库。以前,MySQL 社区版使用 YaSSL。在 MySQL 社区版中支持 OpenSSL 一直是最常请求的功能之一。在此处查看 Frédéric Descamps 的博客文章。
OpenSSL 是动态链接的
MySQL 8.0 与 OpenSSL 动态链接。从 MySQL 存储库用户的角度来看,MySQL 软件包依赖于手头的 Linux 系统提供的 OpenSSL 文件。通过动态链接,OpenSSL 更新可以在可用时应用,而无需 MySQL 升级或修补。在此处查看 Frédéric Descamps 的博客文章。
撤消和重做日志的加密
MySQL 8.0 实现了 UNDO 和 REDO 日志的静态数据加密。在 5.7 中,我们为存储在逐表文件表空间中的 InnoDB 表引入了表空间加密。此功能为物理表空间数据文件提供静态加密。在 8.0 中,我们将其扩展为包括 UNDO 和 REDO 日志。请参阅此处的文档。
SQL 角色
MySQL 8.0 实现了 SQL 角色。角色是权限的命名集合。目的是简化用户访问权限管理。用户可以向用户授予角色、向角色授予权限、创建角色、删除角色以及决定在会话期间适用哪些角色。在此处查看 Frédéric Descamps 的博客文章。
允许 PUBLIC 的授权和撤销
MySQL 8.0 引入了配置变量 mandatory-roles
,可用于在创建新用户时自动分配和授予默认角色。例:。所有指定的角色始终被视为已授予每个用户,并且无法撤销。这些角色仍需要激活,除非它们被设为默认角色。当新的服务器配置变量 activate-all-roles-on-login
设置为 “ON” 时,所有授予的角色始终在用户通过身份验证后激活。role1@%,role2,role3,role4@localhost
打破 super 权限
MySQL 8.0 为以前版本中 SUPER 的各个方面定义了一组新的精细权限。目的是将用户访问权限限制为手头作业所需的权限,仅此而已。例如 BINLOG_ADMIN、CONNECTION_ADMIN 和 ROLE_ADMIN。
用于管理 XA 事务的授权模型
MySQL 8.0引入了一个新的 system 权限,该权限控制执行 statement 的能力。未被授予新系统权限的用户尝试执行此操作将导致错误。XA_RECOVER_ADMIN
XA RECOVER
XA RECOVER
XA_RECOVER_ADMIN
密码轮换策略
MySQL 8.0 引入了对密码重用的限制。限制可以在全局级别以及单个用户级别进行配置。密码历史记录是安全的,因为它可能会提供有关个人用户在更改密码时使用的习惯或模式的线索。密码轮换策略是对其他现有机制(如密码过期策略和允许的密码策略)的补充。请参阅密码管理。
减缓对用户密码的暴力攻击
MySQL 8.0 在身份验证过程中引入了基于连续登录尝试失败的延迟。目的是减缓对用户密码的暴力攻击。可以配置在引入延迟之前连续尝试失败的次数以及引入的最大延迟量。
停用 skip-grant-tables
MySQL 8.0 不允许在服务器使用 启动时进行远程连接。另请参阅 Omar Bourja 报告的 Bug#79027。–skip-grant-tables
向服务器添加mysqld_safe功能
MySQL 8.0 实现了当前在服务器内部脚本中找到的部分逻辑。此工作提高了某些情况下的服务器可用性,例如,在使用 startup 选项时。这项工作还使用户对 的依赖程度降低,我们希望将来能将其删除。它还修复了 Peter Laursen 报告的 Bug#75343。mysqld_safe
--daemonize
mysqld_safe script
性能
MySQL 8.0 为读/写工作负载、IO 绑定工作负载和高争用“热点”工作负载提供了更好的性能。此外,新的 Resource Group 功能为用户提供了一个选项,可以通过将用户线程映射到 CPU 来优化特定硬件上的特定工作负载。
扩展读/写工作负载
利用 IO 容量(快速存储)
fil_system_mutex
在高争用负载(“热行”)
上具有更好的性能
MySQL 8.0 显著提高了高争用工作负载的性能。当多个事务正在等待表中同一行的锁定时,会出现高争用工作负载,从而导致等待事务排队。许多实际工作负载并不平稳,例如一天,但可能会在某些时间突增(帕累托分布式)。MySQL 8.0 在每秒事务数、平均延迟和第 95 个百分位延迟方面都更好地处理此类突发。对最终用户的好处是更好的硬件利用率(效率),因为系统需要的备用容量更少,因此可以在更高的平均负载下运行。原始补丁由 Jiamin Huang (Bug#84266) 提供。请在此处研究 Contention-Aware Transaction Scheduling (CATS) 算法,并阅读 Jiamin Huang 和 Sunny Bains 的 MySQL 博客文章。
资源组
MySQL 8.0 为 MySQL 引入了全局资源组。借助资源组,DevOps/DBA 可以管理用户/系统线程与 CPU 之间的映射。这可用于在 CPU 之间拆分工作负载,以在某些使用案例中获得更好的效率和/或性能。因此,Resource Groups 向 DBA 工具箱中添加了一个工具,该工具可以帮助 DBA 提高硬件利用率或提高查询稳定性。例如,在 Intel(R) Xeon (R) CPU E7-4860 2.27 GHz 40 核-HT 机箱上运行 Sysbench RW 工作负载时,我们通过将写入负载限制为 10 个内核,将整体吞吐量提高了一倍。资源组是一个相当先进的工具,需要熟练的 DevOps/DBA 才能有效使用,因为效果会随着负载类型和手头的硬件而变化。
其他功能
更好的默认值
在 MySQL 团队中,我们密切关注 MySQL 的默认配置,并致力于让用户获得最佳的开箱即用体验。MySQL 8.0 已将 30 多个默认值更改为我们认为更好的值。请参阅博客文章 MySQL 8.0 中的新默认值。Mogan Tocker 的一篇博文概述了这样做的动机。
协议
MySQL 8.0 添加了一个选项,用于关闭结果集的元数据生成和传输。构建/解析和发送/接收结果集元数据会消耗服务器、客户端和网络资源。在某些情况下,元数据大小可能比实际结果数据大小大得多,并且根本不需要元数据。我们可以通过完全禁用这些数据的生成和存储来显著加快查询结果的传输速度。如果客户端不希望元数据与结果集一起返回,则可以设置该标志。CLIENT_OPTIONAL_RESULTSET_METADATA
C 客户端 API
MySQL 8.0 通过稳定的接口扩展了 libmysql 的 C API,用于从服务器获取复制事件作为数据包流。目的是避免必须调用未记录的 API 并打包内部头文件,以便实现基于二进制日志的程序,例如 MySQL Applier for Hadoop。
Memcached 的
MySQL 8.0 通过多个 get 操作和对范围查询的支持增强了 InnoDB Memcached 功能。我们添加了对多个 get 操作的支持,以进一步提高读取性能,即用户可以在单个 memcached 查询中获取多个键值对。Yoshinori @ Facebook 已请求支持范围查询。使用范围查询,用户可以指定特定范围,并获取此范围内的所有限定值。这两个功能都可以显著减少客户端和服务器之间的往返次数。
持久 Autoinc 计数器
MySQL 8.0 通过将计数器写入重做日志来保留计数器。这是对非常旧的 Bug#199 的修复。MySQL 恢复过程将重播重做日志并确保计数器的值正确。不会有任何 counters 回滚。这意味着数据库恢复将在崩溃后重新建立最后一个已知的计数器值。它保证 counter 不能两次获得相同的值。计数器单调递增,但请注意,可能存在间隙 (未使用的值)。过去,缺乏持久化被认为是麻烦的,例如,请参阅 Stephen Dewey 在 2006 年报告的 Bug#21641 或这篇博文。AUTOINC
AUTOINC
AUTOINC
AUTOINC
AUTOINC
总结
如上所示,MySQL 8.0 附带了大量新功能和性能改进。从 dev.mysql.com 下载并试用!
您还可以将现有的 MySQL 5.7 升级到 MySQL 8.0。在此过程中,您可能想尝试新 MySQL Shell (mysqlsh) 附带的新 Upgrade Checker。此实用程序将分析您现有的 5.7 服务器,并告诉您潜在的 8.0 不兼容问题。另一个很好的资源是 Frédéric Descamps 的博客文章 Migrating to MySQL 8.0 without break old application。
在这篇博文中,我们介绍了 Server 功能。还有更多!我们还将发布有关其他功能的博客文章,例如复制、组复制、InnoDB 集群、文档存储、MySQL Shell、DevAPI 和基于 DevAPI 的连接器(连接器/Node.js、连接器/Python、PHP、连接器/NET、连接器/ODBC、连接器/C++ 和 Connector/J)。
现在就到这里了,感谢您使用 MySQL!