MySQL 8.0有什么新功能

  https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/

我们自豪地宣布MySQL 8.0的一般可用性。 现在下载! MySQL 8.0是世界上最受欢迎的开源数据库中令人兴奋的新版本,并且全面改进。一些关键的增强功能包括:

  1. SQL 窗口函数,公用表表达式,NOWAIT和SKIP LOCKED,降序索引,分组,正则表达式,字符集,成本模型和直方图。
  2. JSON 扩展语法,新功能,改进的排序和部分更新。使用JSON表函数,您可以将SQL机制用于JSON数据。
  3. GIS 地理支持。空间参考系统(SRS),以及SRS感知空间数据类型,空间索引和空间函数。
  4. 可靠性 DDL语句已成为原子和崩溃安全,元数据存储在单个事务数据字典中。由InnoDB提供支持!
  5. 可观察性 性能模式,信息模式,配置变量和错误记录的显着增强。
  6.  管理远程管理,撤消表空间管理和新的即时DDL。
  7. 安全性 OpenSSL改进,新的默认身份验证,SQL角色,分解超级权限,密码强度等。
  8. Performance InnoDB在读/写工作负载,IO绑定工作负载和高争用“热点”工作负载方面表现更佳。添加了资源组功能,通过将用户线程映射到CPU,为用户提供了针对特定硬件上的特定工作负载进行优化的选项。

上面描述了一些亮点,我鼓励你进一步深入到完整的系列里程碑博客文章-8.0.0的 8.0.1 ,8.0.2 ,8.0.3,and8.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 Wanvikhere的博客文章以及Guilhem Bichothere的博客文章。

公用表表达式

MySQL 8.0提供[递归]公用表表达式(CTE)。非递归CTE可以解释为“改进的派生表”,因为它允许多次引用派生表。递归CTE是一组迭代构建的行:从一组初始行开始,一个进程派生新行,这些行增长了这一组,并​​且这些新行再次被送入进程,产生更多行,依此类推,直到该过程不再产生行。CTE是常用的SQL功能,请参阅功能请求 16244 和 32174 。查看Guilhem Bichothere的博客文章, 这里 ,这里,和其他地方。

NOWAIT和SKIP LOCKED

MySQL的8.0提供了 NOWAIT 与 SKIP LOCKED 该SQL锁定子句中的替代品。通常,当一行因a UPDATE 或a 而被锁定时 SELECT ... FOR UPDATE ,任何其他事务都必须等待访问该锁定行。在某些用例中,如果行被锁定或忽略锁定的行,则需要立即返回。使用的锁定子句 NOWAIT 永远不会等待获取行锁。相反,查询将失败并显示错误。使用的锁定子句 SKIP LOCKED 永远不会等待获取列出的表上的行锁。而是跳过锁定的行,根本不读取。NOWAIT和SKIP LOCKED经常被要求SQL功能。请参阅功能请求 49763 。我们还要感谢 Kyle Oppenheim  为他的代码贡献!请参阅Martin Hanssonhere的博客文章。

降序索引

MySQL 8.0按降序提供对索引的支持。这种索引中的值按降序排列,我们向前扫描。在8.0之前,当用户创建降序索引时,我们创建了一个升序索引并向后扫描它。一个好处是前向索引扫描比后向索引扫描更快。真正的降序索引的另一个好处是它使我们能够使用索引而不是filesort来处理ORDER BY 具有混合ASC/DESC 排序键部分的 子句 。 降序索引 是一种经常请求的SQL功能。参见例如特征请求 13375 。请参阅Chaithra Gopalareddy的博客文章。

GROUPING

MySQL 8.0提供 GROUPING() , SQL_FEATURE T433 。该 GROUPING() 函数将超级聚合行与常规分组行区分开来。 GROUP BY 扩展,例如 ROLLUP 生成超级聚合行,其中所有值的集合由null表示。使用该 GROUPING() 函数,您可以区分表示超级聚合行中所有值的集合的空值与 NULL 常规行中的值。GROUPING是一种经常请求的SQL功能。请参阅功能请求 3156 和 46053 。感谢 Zoe Dong 和 Shane Adams 在功能请求46053中的代码贡献 请参阅Chaithra Gopalareddy的博客文章。

优化器提示

在5.7中,我们为优化器提示引入了一个新的提示语法 使用新语法,可以SELECT | INSERT | REPLACE | UPDATE | DELETE 在SQL语句中关键字之后直接指定提示,这些 关键字包含在 /*+ */ 样式注释中。(见Sergey Glukhovhere的5.7篇博文)。在MySQL 8.0中,我们通过充分利用这种新风格来完成图片:

  • MySQL 8.0为INDEX_MERGE 和 添加了提示 NO_INDEX_MERGE 。这允许用户在不更改优化器开关的情况下控制单个查询的索引合并行为。
  • MySQL的8.0增加了用于提示 JOIN_FIXED_ORDER , JOIN_ORDER , JOIN_PREFIX ,和JOIN_SUFFIX 。这允许用户控制连接执行的表顺序。
  • MySQL 8.0添加了一个名为的提示 SET_VAR 。该 SET_VAR 提示将针对只剩下一语句给定的系统变量设置的值。因此,在语句结束后,该值将重置为之前的值。请参阅Sergey Glukhovhere的博客文章。

我们更喜欢新格式的优化器提示,而不是旧式提示和 值设置 通过不与SQL混合,可以在查询字符串中的许多位置注入新提示。它们在提示(vs指令)时也有更清晰的语义。optimizer_switch

JSON

MySQL 8.0添加了新的JSON函数,并提高了对JSON值进行排序和分组的性能​​。

JSON路径表达式中范围的扩展语法

MySQL 8.0扩展了JSON路径表达式中范围的语法。例如 SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]'); 结果 [2, 3, 4] 。引入的新语法是SQL标准语法的一个子集,在SQL:2016,9.39中描述了SQL / JSON路径语言:语法和语义。另见 Roland Bouman报道的Bug#79052

JSON表函数

MySQL 8.0添加了JSON表函数,可以使用SQL机制来处理JSON数据。 JSON_TABLE() 创建JSON数据的关系视图。它将JSON数据评估的结果映射到关系行和列。用户可以使用SQL查询函数返回的结果作为常规关系表,例如join,project和aggregate。

JSON聚合函数

MySQL 8.0添加了聚合函数 JSON_ARRAYAGG() 来生成JSON数组并 JSON_OBJECTAGG() 生成JSON对象。这使得可以将多行中的JSON文档组合成JSON数组或JSON对象。请参阅Catalin Besleagahere的博客文章。

JSON合并函数

该 JSON_MERGE_PATCH() 函数实现了RFC7396指定的JavaScript(和其他脚本语言)的 语义 ,即它通过第二个文档的优先级删除重复项。例如, 。 JSON_MERGE('{"a":1,"b":2 }','{"a":3,"c":4 }'); # returns {"a":3,"b":2,"c":4}

该 JSON_MERGE_PRESERVE() 函数具有在MySQL 5.7中实现的JSON_MERGE()的语义,例如,它保留所有值  JSON_MERGE('{"a": 1,"b":2}','{"a":3,"c":4}'); # returns {"a":[1,3],"b":2,"c":4}.

JSON_MERGE() MySQL 8.0中不推荐使用 现有 函数来消除合并操作的歧义。另见Bug#81283中的提案 和Morgan Tockerhere的博客文章。

JSON漂亮功能

MySQL 8.0 JSON_PRETTY() 在MySQL中添加了一个 函数。该函数接受JSON本机数据类型或JSON的字符串表示形式,并以人类可读的方式返回JSON格式的字符串,并带有新行和缩进。

JSON大小函数

MySQL 8.0添加了与给定JSON对象的空间使用相关的JSON函数。该 JSON_STORAGE_SIZE() 回报的JSON数据类型字节的实际大小。在 JSON_STORAGE_FREE() 返回以字节为单位,包括分段和填充保存就地更新一个JSON二进制类型的自由空间。

JSON改进了排序

MySQL 8.0通过使用可变长度排序键为JSON值排序/分组提供了更好的性能。初步基准测试表明,根据使用情况,分类改进了1.2到18倍。

JSON部分更新

MySQL的8.0增加了对部分更新支持 JSON_REMOVE() , JSON_SET() 以及 JSON_REPLACE() 功能。如果只更新JSON文档的某些部分,我们希望向处理程序提供有关更改内容的信息,以便存储引擎和复制不需要编写完整文档。在复制环境中,无法保证JSON文档的布局在从属和主服务器上的布局完全相同,因此物理差异不能用于减少基于行的复制的网络I / O. 因此,MySQL 8.0提供了逻辑差异,基于行的复制可以通过线路发送并在从属设备上重新应用。请参阅Knut Anders Hatlenhere的博客文章。

GIS

MySQL 8.0提供地理支持。这包括空间参考系统(SRS)的元数据支持,以及SRS感知空间数据类型,空间索引和空间函数。简而言之,MySQL 8.0可以理解地球表面的纬度和经度坐标,例如,可以在大约5000个支持的空间参考系统中的任何一个中正确计算地球表面上两点之间的距离。

空间参考系统(SRS)

的 ST_SPATIAL_REFERENCE_SYSTEMS 信息模式视图提供有关空间数据可用的空间参考系统的信息。该视图基于SQL / MM(ISO / IEC 13249-3)标准。每个空间参考系统由SRID号标识。MySQL 8.0附带了来自EPSG大地测量参数数据集的大约5000个SRID ,包括地理参考椭球和2d投影(即所有2D空间参考系统)。

SRID感知空间数据类型

空间数据类型可以使用空间参考系统定义来归因,例如SRID 4326,如下所示: CREATE TABLE t1 (g GEOMETRY SRID 4326); SRID在这里是GEOMETRY数据类型的SQL类型修饰符。插入具有SRID属性的列的值必须位于该SRID中。尝试将值与其他SRID一起插入会导致引发异常情况。未修改的类型(即没有SRID规范的类型)将继续像以前一样接受所有SRID。

MySQL 8.0添加了INFORMATION_SCHEMA.ST_GEOMETRY_COLUMNS SQL / MM第3部分Sect中指定视图。19.2。这种观点将列出所有几何列在MySQL实例,并为每列将列出标准 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扩展了空间函数,例如 ST_Distance() 和 ST_Length() 检测其参数是否在地理(椭圆体)SRS中并计算椭球上的距离。到目前为止, ST_Distance 和空间关系,例如 ST_Within, ST_Intersects , ST_Contains , ST_Crosses ,等支持地理计算。每个ST函数的行为如SQL / MM第3部分Spatial中所定义。

字符集

MySQL 8.0使 UTF8MB4 成为默认字符集。SQL性能 - 例如排序UTF8MB4字符串 - 与5.7相比,在8.0中提高了20倍。UTF8MB4是网络的主要字符编码,这一举措将使绝大多数MySQL用户的生活更轻松。

  • 默认字符集已更改为 latin1 , utf8mb4 并且默认排序规则已更改 latin1_swedish_ci 为utf8mb4_800_ci_ai 。
  • 默认值的更改适用于libmysql和服务器命令工具以及服务器本身。
  • 这些更改也反映在MTR测试中,使用新的默认字符集运行。
  • 整理权重和案例映射基于 Unicode委员会于2016年6月21日宣布的Unicode 9.0.0
  • 可用于latin1(MySQL遗留)的21种语言特定的不区分大小写的排序规则已用于  utf8mb4 排序规则,例如捷克排序规则变为utf8mb4_cs_800_ai_ci。请参阅WL#9108中的完整列表 查看Xing Zhanghere的博客文章。
  • 添加了对大小写和重音敏感排序规则的支持。MySQL 8.0支持由DUCET(默认Unicode归类条目表)定义的所有3级归类权重。查看Xing Zhanghere的博客文章。
  • 日语 utf8mb4_ja_0900_as_cs 整理,utf8mb4 使用三个级别的权重字符进行 排序。这为日语提供了正确的排序顺序。查看Xing Zhanghere的博客文章。
  • 日语具有额外的假名敏感功能, utf8mb4_ja_0900_as_cs_ks 其中'ks'代表'假名敏感'。查看Xing Zhanghere的博客文章。
  • 将所有新的排序规则从Unicode 9.0.0向前更改为, NO PAD 而不是 PAD STRING 像对任何其他字符一样处理字符串末尾的空格。这样做是为了提高一致性和性能。旧的整理留在原地。

另请参阅Bernt Marius Johnsenhere撰写的博客文章。

数据类型

二进制数据类型的逐位操作

MySQL 8.0扩展了逐位操作('按位AND'等)也可以使用 [VAR]BINARY/[TINY|MEDIUM|LONG]BLOB在8.0位之前,只支持整数操作。如果对二进制文件使用逐BIGINT 位操作,则在操作之前将参数隐式转换为 (64位),因此可能丢失位。从8.0开始,逐位运算对所有 数据类型BINARY 和BLOB数据类型都起作用, 从而使得参数不会丢失。

IPV6操纵

MySQL 8.0通过支持BINARY数据类型的逐位操作,提高了IPv6操作的可用性。在MySQL 5.6我们介绍了 INET6_ATON() 和 INET6_NTOA() 其将文本形式等之间的IPv6地址的功能'fe80::226:b9ff:fe77:eb17' 和 VARBINARY(16) 。但是,到目前为止,我们无法将这些IPv6功能与逐位操作结合起来,因为这样的操作会错误地将输出转换为 BIGINT 。例如,如果我们有一个IPv6地址并希望针对网络掩码进行测试,我们现在可以使用 

INET6_ATON(地址

&INET6_ATON(网络

因为 INET6_ATON() 正确返回 VARBINARY(16) 数据类型(128位)。请参阅Catalin Besleagahere的博客文章。

UUID操纵

MySQL的8.0通过实现三个新的SQL函数提高UUID操作的易用性: UUID_TO_BIN() ,BIN_TO_UUID() ,和 IS_UUID() 。第一个从UUID格式的文本转换为 VARBINARY(16) ,第二个从VARBINARY(16) UUID格式的文本转换,最后一个检查UUID格式的文本的有效性。存储为a的UUID VARBINARY(16) 可以使用功能索引进行索引。这些函数 UUID_TO_BIN() 也 UUID_TO_BIN()可以随机抽取时间相关的位并在开始时将它们移动,使其索引友好并避免B树中的随机插入,这样可以减少插入时间。已经提到缺少这种功能 是使用UUID的缺点之一 。请参阅Catalin Besleagahere的博客文章。

成本模型

查询优化器将数据缓冲考虑在内

MySQL 8.0根据有关数据是驻留在内存还是磁盘上的知识选择查询计划。这是自动发生的,从最终用户看,没有涉及配置。从历史上看,MySQL成本模型假设数据驻留在旋转磁盘上。与在内存中和磁盘上查找数据相关联的成本常数现在是不同的,因此,优化器将基于对数据位置的了解为这两种情况选择更优化的访问方法。请参阅ØysteinGrøvlenhere的博客文章。

优化器直方图

MySQL 8.0实现了直方图统计。使用直方图,用户可以创建表中列的数据分布统计信息,通常用于非索引列,然后查询优化器将使用它来查找最佳查询计划。直方图统计的主要用例是计算“COLUMN operator CONSTANT”形式的谓词的选择性(过滤效果)。

用户通过ANALYZE TABLE 语法创建直方图,该 语法已被扩展为接受两个新子句: UPDATE HISTOGRAM ON column [, column] [WITH n BUCKETS] 和 DROP HISTOGRAM ON column [, column]存储桶的数量是可选的,默认值为100.直方图统计数据存储在字典表“column_statistics”中,可通过视图访问 information_schema.COLUMN_STATISTICS 。由于JSON数据类型的灵活性,直方图存储为JSON对象。 ANALYZE TABLE 将根据表大小自动决定是否对基表进行采样。它还将 根据数据分布和指定的桶数决定是构建 单例 还是 等高直方图。请参阅ErikFrøsethhere的博客文章。

常用表达

MySQL的8.0支持UTF8MB4正则表达式,以及像新的功能 REGEXP_INSTR() , REGEXP_LIKE(), REGEXP_REPLACE() ,和 REGEXP_SUBSTR() 。添加了系统变量 regexp_stack_limit (默认为32步)和 regexp_time_limit (默认 8000000 字节)以控制执行。该 REGEXP_REPLACE() 功能是MySQL社区最需要的功能之一,例如,请参阅 Hans Ginzel 报告为BUG#27389功能请求 另见Martin Hanssonhere和Bernt Marius Johnsenhere的博客文章。

Dev Ops功能

Dev Ops关注数据库的操作方面,通常涉及可靠性,可用性,性能,安全性,可观察性和可管理性。高可用性随MySQL InnoDB Cluster和MySQL Group Replication一起提供,这将由一篇单独的博客文章介绍。以下是8.0对其他类别的表格所带来的内容。

可靠性

MySQL 8.0提高了MySQL的整体可靠性,因为:

  1. MySQL 8.0将其元数据存储到InnoDB中,这是一个经过验证的事务存储引擎。系统表(如用户和权限以及数据字典表)现在位于InnoDB中。
  2. MySQL 8.0消除了潜在不一致的一个来源。在5.7及更早版本中,基本上有两个数据字典,一个用于服务器层,另一个用于InnoDB层,这些字典在某些崩溃情况下可能不同步。在8.0中只有一个数据字典。
  3. MySQL 8.0确保原子,崩溃安全的DDL。有了这个,用户可以保证任何DDL语句都可以完全执行或根本不执行。这在复制环境中尤其重要,否则可能存在主设备和从设备(节点)不同步,导致数据漂移的情况。

这项工作是在新的事务数据字典的上下文中完成的。查看Staale Deraashere andhere的博客文章。

观测

信息架构(加速)

MySQL 8.0重新实现信息架构。在新实现中,信息模式表是存储在InnoDB中的数据字典表的简单视图。这比旧的实现效率更高,速度提高了100倍。这使得信息模式实际上可以通过外部工具使用。查看Gopal Shankarhere andhere的博客文章和StåleDeraashere的博客文章。

性能架构(加速)

MySQL 8.0通过在性能模式表上添加100多个索引来加速性能模式查询。性能模式表的索引是预定义的。它们不能被删除,添加或更改。性能模式索引实现为跨现有表数据的过滤扫描,而不是通过单独数据结构的遍历。没有要构建,更新或以其他方式管理的B树或哈希表。性能模式表索引的行为类似于散列索引,其中a)它们快速检索所需的行,b)不提供行排序,让服务器在必要时对结果集进行排序。但是,根据查询,索引会消除对全表扫描的需要,并返回相当小的结果集。性能模式索引是可见的 SHOW INDEXES 并在 EXPLAIN 输出中表示引用索引列的查询。来自Simon Mudd的评论。请参阅Marc Alffhere的博客文章。

配置变量

MySQL 8.0添加了有关配置变量的有用信息,例如变量名称, 最小值/最大值 , 当前值来自何处,   进行了更改以及何时进行更改 此信息位于名为的新性能模式表中  variables_info 。请参阅Satish Bharathyhere的博客文章。

客户端错误报告 - 消息计数

MySQL 8.0可以查看 服务器报告的客户端错误消息的聚合计数 用户可以查看来自5个不同表的统计信息:全局计数,每个线程的摘要,每个用户的摘要,每个主机的摘要或每个帐户的摘要。对于每个错误消息,用户可以看到引发的错误数,SQL异常处理程序处理的错误数,“第一次看到”时间戳和“上次看到”时间戳。给定权限,用户可以 SELECT 从这些表 TRUNCATE 中重置统计信息。请参阅Mayank Prasadhere的博客文章。

声明延迟直方图

MySQL 8.0提供语句延迟的性能模式直方图,以便更好地查看查询响应时间。这项工作还从收集的直方图计算“P95”,“P99”和“P999”百分位数。这些百分位数可用作服务质量的指标。见弗雷德里克DESCAMPS博客文章 在这里 。

数据锁定依赖关系图

MySQL 8.0仪器数据锁定在性能模式中。当事务A锁定行R,并且事务B在同一行上等待时,B被A有效阻止。添加的检测暴露哪些数据被锁定(R),谁拥有锁(A),谁在等待对于数据(B)。见弗雷德里克DESCAMPS博客文章 在这里 。

摘要查询示例

MySQL 8.0对events_statements_summary_by_digest 性能模式表进行了一些更改, 以捕获完整的示例查询以及有关此查询示例的一些关键信息。QUERY_SAMPLE_TEXT 添加该列 以捕获查询示例,以便用户可以在实际查询上运行EXPLAIN并获取查询计划。QUERY_SAMPLE_SEEN 添加该列 以捕获查询示例时间戳。QUERY_SAMPLE_TIMER_WAIT 添加该列 以捕获查询示例执行时间。FIRST_SEEN 和 LAST_SEEN 已被修改为使用小数秒。见弗雷德里克DESCAMPS博客文章  在这里

关于仪器的元数据

MySQL 8.0将性能 , 易变性 和 文档等元数据添加 到性能模式表  setup_instruments中 。这种只读元数据充当仪器的在线文档,供用户或工具查看。见弗雷德里克DESCAMPS博客文章 在这里 。

错误记录

MySQL 8.0对MySQL 错误日志进行了重大改进 从软件体系结构的角度来看,错误日志是新服务基础结构中的一个组件。这意味着高级用户可以根据需要编写自己的错误日志实现。大多数用户不希望编写自己的错误日志实现,但仍希望在编写内容和编写内容时有一定的灵活性。因此,8.0为用户提供了添加 接收器(在哪里) 和 过滤器(什么)的功能 。MySQL 8.0实现了过滤服务(API)和默认过滤服务实现(组件)。此处的过滤意味着禁止给定日志消息(投影)中的某些日志消息(选择)和/或字段。MySQL 8.0实现了日志编写器服务(API)和默认的日志编写器服务实现(组件)。日志编写器接受日志事件并将其写入日志。此日志可以是经典文件,syslog,EventLog和新的JSON日志编写器。

默认情况下,在没有任何配置的情况下,MySQL 8.0提供了许多开箱即用的错误日志改进,例如:

  • 错误编号: 格式是10000系列中以“MY-”开头的数字,例如“MY-10001”。错误编号在GA版本中将保持稳定,但允许在维护版本中更改(即改进)相应的错误文本。
  • 系统消息: 系统消息作为[系统]而不是[错误],[警告],[注意]写入错误日志。无论详细程度如何,都会打印[系统]和[错误]消息,无法抑制。[系统]消息仅在少数地方使用,主要与主要状态转换相关,例如启动或停止服务器。
  • 减少详细程度:log_error_verbosity 的缺省值 从3(注释)更改为2(警告)。这使MySQL 8.0错误日志默认情况下更简洁。
  • 源组件: 每条消息都注释三个值[Server],[InnoDB],[Replic]中的一个,显示消息来自哪个子系统。

这是在启动后写入8.0 GA中的错误日志的内容:

2018-03-08T101429.289863 ž 0 [系统] [MY- 010116 ] [服务器] / usr / sbin目录/ mysqld的(mysqld的8.05)开始作为过程8063 
2018 -03-08T101429.745356 ž 0 [警告] [ MY-010068 ] [服务器] CA证书ca.pem是自签名的。
2018 -03-08T101429.765159 Z 0 [系统] [ MY-010931 ] [服务器] / usr / sbin / mysqld:准备连接。版本'8.0.5'   套接字'/ tmp / mysql.sock'   端口3306   源分发。
2018 -03-08T101651.343979 ž 0 [系统] [MY- 010910 ] [服务器] / usr / sbin目录/ mysqld的:关机完成(mysqld的8.05)来源的分布。

在错误日志中引入错误编号允许MySQL在即将到来的维护版本(如果需要)中改进错误文本,同时保持错误编号(ID)不变。错误号也可作为过滤/抑制和国际化/本地化的基础。

可管理性

不可见的索引

MySQL 8.0增加了切换索引可见性(可见/不可见)的功能。优化程序在进行查询执行计划时不会考虑不可见索引。但是,索引仍然保留在后台,因此再次显示它很便宜。这样做的目的是让DBA / DevOp确定是否可以删除索引。如果您怀疑某个索引未被使用,则首先使其不可见,然后监视查询性能,最后在没有遇到查询减慢的情况下删除索引。许多用户已经要求使用此功能,例如通过 Bug#70299 。请参阅Martin Hanssonhere的博客文章。

灵活撤销表空间管理

MySQL 8.0使用户可以完全控制撤消表空间,即有 多少 表空间, 它们放在哪里,以及 每个表空间 有 多少个回滚段

  1. 不再在系统表空间中撤消登录。 在升级期间,撤消日志将从System表空间迁移到Undo表空间。这为使用系统表空间的撤消日志提供了现有5.7安装的升级路径。
  2. 撤消表空间可以与System表空间分开管理。 例如,撤消表空间可以放在快速存储上。
  3. 回收非常大的交易所占用的空间(在线)。 至少创建两个Undo表空间以允许表空间截断。这允许InnoDB缩小撤消表空间,因为一个撤消表空间可以是活动的而另一个是截断的。
  4. 更多回滚段可以减少争用。 用户可能选择最多127个撤消表空间,每个表空间最多包含128个回滚段。更多回滚段意味着并发事务更有可能为其撤消日志使用单独的回滚段,从而减少对相同资源的争用。

请参阅Kevin Lewishere的博客文章。

全局变量的SET PERSIST

MySQL 8.0可以持久保存全局动态服务器变量。许多服务器变量都是GLOBAL和DYNAMIC,可以在服务器运行时重新配置。例如: SET GLOBAL sql_mode='STRICT_TRANS_TABLES'; 但是,重新启动服务器时会丢失此类设置。

这项工作使得编写成为可能 SET PERSIST sql_mode='STRICT_TRANS_TABLES'; 。效果是设置将在服务器重启后继续存在。此功能有许多使用方案,但最重要的是,它提供了一种在编辑配置文件时管理服务器设置的方法不方便或不是一个选项。例如,在某些托管环境中,您没有文件系统访问权限,您拥有的只是连接到一个或多个服务器的能力。至于 SET GLOBAL 你需要超级特权 SET PERSIST 。

还有 RESET PERSIST 命令。该 RESET PERSIST 命令具有从persist配置中删除配置变量的语义,从而将其转换为具有类似的行为 SET GLOBAL 。

MySQL 8.0允许 SET PERSIST 设置大多数只读变量,新值将在下次服务器重启时生效。请注意,有意无法设置一小部分只读变量。请参阅Satish Bharathyhere的博客文章。

远程管理

MySQL 8.0实现了一个SQL RESTART命令。目的是通过SQL连接启用MySQL服务器的远程管理,例如通过SET PERSIST 后跟a 来设置非动态配置变量 RESTART 。请参阅博客文章  MySQL 8.0:轻松更改配置和云友好! 作者FrédéricDescamps。

重命名表空间(SQL DDL)

MySQL 8.0实现 ALTER TABLESPACE s1 RENAME TO s2; 共享/通用表空间是用户可见的实体,用户可以使用CREATE,ALTER和DROP。另请参阅 Bug#26949 , Bug#32497 和 Bug#58006

重命名列(SQL DDL)

MySQL 8.0实现 ALTER TABLE ... RENAME COLUMN old_name TO new_name; 这是对现有语法ALTER TABLE <table_name> CHANGE ...的改进,它需要重新指定列的所有属性。旧/现有语法的缺点是,尝试进行重命名的应用程序可能无法使用所有列信息。旧/现有语法中存在意外数据类型更改的风险,这可能导致数据丢失。

安全功能

新的默认身份验证插件

MySQL 8.0将默认的身份验证插件从 mysql_native_password更改 为caching_sha2_password 。相应地,libmysqlclient也将使用caching_sha2_password作为默认的身份验证机制。新的caching_sha2_password结合了更好的安全性(SHA2算法)和高性能(缓存)。总体方向是我们建议所有用户使用TLS / SSL进行所有网络通信。请参阅Harin Vadodariahere的博客文章。

社区版中的默认OpenSSL

MySQL 8.0统一在 OpenSSL上 作为MySQL企业版和MySQL社区版的默认TLS / SSL库。以前,MySQL Community Edition使用 YaSSL 。在MySQL社区版中支持OpenSSL一直是最常请求的功能之一。请参阅FrédéricDescampshere的博客文章。

OpenSSL是动态链接的

MySQL 8.0与OpenSSL动态链接。从 MySQL Repository 用户的角度来看,MySQL软件包依赖于Linux系统提供的OpenSSL文件。通过动态链接,可以在可用时应用OpenSSL更新,而无需MySQL升级或修补程序。请参阅FrédéricDescampshere的博客文章。

撤消和重做日志的加密

MySQL 8.0实现UNDO和REDO日志的数据静态加密。在5.7中,我们 为存储在每个表文件表空间中的InnoDB表引入了 表空间加密此功能为物理表空间数据文件提供静态加密。在8.0中,我们将其扩展为包括UNDO和REDO日志。见文档 这里 。

SQL角色

MySQL 8.0实现了SQL角色。角色是命名的特权集合。目的是简化用户访问权限管理。可以向用户授予角色,为角色授予权限,创建角色,删除角色以及确定在会话期间适用的角色。见弗雷德里克DESCAMPS博客文章 在这里 。

允许PUBLIC的授权和撤销

MySQL 8.0引入了配置变量 ,可用于 在创建新用户时自动分配和授予 默认角色示例: 始终将所有指定的角色视为已授予每个用户,并且无法撤消这些角色。除非将这些角色设为默认角色,否则这些角色仍需要激活。当新服务器配置变量 设置为“ON”时,在用户进行身份验证后,始终会激活所有授予的角色。 mandatory-roles role1@%,role2,role3,role4@localhostactivate-all-roles-on-login

打破超级特权

MySQL 8.0为以前版本中SUPER的各个方面定义了一组新的细化权限。目的是限制用户对手头工作所需内容的访问权限,仅此而已。例如 BINLOG_ADMIN , CONNECTION_ADMIN 和ROLE_ADMIN 。

管理XA事务的授权模型

MySQL 8.0引入了一个新的系统特权 XA_RECOVER_ADMIN ,它控制着执行语句的能力 XA RECOVER 。XA RECOVER 未被授予新系统特权的用户尝试执行 此操作 XA_RECOVER_ADMIN 将导致错误。

密码轮换政策

MySQL 8.0引入了对密码重用的限制。可以在全局级别以及单个用户级别配置限制。密码历史记录保持安全,因为它可以提供有关个人用户更改密码时使用的习惯或模式的线索。该 密码轮换政策 来除了其他现有机制,如 密码过期策略 和 允许的密码策略 。请参阅 密码管理 。

减慢对用户密码的暴力攻击

MySQL 8.0基于连续不成功的登录尝试在认证过程中引入了延迟。目的是减缓对用户密码的暴力攻击。可以在引入延迟之前配置连续不成功尝试的次数以及引入的最大延迟量。

退出skip-grant-tables

启动服务器时,MySQL 8.0不允许远程连接 –skip-grant-tables 。另见 Omar Bourja报告的Bug# 79027。

将mysqld_safe功能添加到服务器

MySQL 8.0实现了当前在mysqld_safe 服务器内部脚本中找到的逻辑部分 在某些情况下,这项工作可以提高服务器的可用性,例如在使用 --daemonize 启动选项时。这项工作也使用户减少对mysqld_safe script 我们的依赖 ,我们希望将来可以删除。它还修复 了Peter Laursen报道的Bug#75343

性能

MySQL 8.0具有更好的读/写工作负载,IO绑定工作负载和高争用“热点”工作负载的性能。此外,新的资源组功能通过将用户线程映射到CPU,为用户提供了针对特定硬件上的特定工作负载进行优化的选项。

扩展读/写工作量

MySQL 8.0可以很好地扩展RW和繁重的写入工作负载。在密集的RW工作负载上,我们观察到4个并发用户已经获得了更好的性能,并且与MySQL 5.7相比,在高负载上性能提高了2倍以上。我们可以说,虽然5.7显着提高了只读工作负载的可扩展性,但8.0显着提高了读/写工作负载的可扩展性。结果是MySQL提高了标准服务器端硬件(如带有2个CPU插槽的系统)的硬件利用率(效率)。这种改进是由于重新设计InnoDB如何写入REDO日志。与用户线程不断争取记录其数据更改的历史实现相反,在新的REDO日志解决方案中,用户线程现在是无锁的,REDO写入和刷新由专用后台线程管理,整个REDO处理变为事件驱动。请参阅Dimitri Kravtchuk的博客文章 在这里 。

利用IO容量(快速存储)

MySQL 8.0允许用户充分利用每个存储设备。例如,使用Intel Optane闪存设备进行测试,我们能够在完全IO绑定的工作负载中超过1M Point-Select QPS。(IO绑定意味着数据不缓存在缓冲池中,但必须从辅助存储中检索)。这种改进是由于摆脱了  fil_system_mutex 全球锁定。

高争用负载时的更好性能(“热行”)

MySQL 8.0显着提高了高争用工作负载的性能。当多个事务正在等待表中同一行的锁定时,会发生高争用工作负载,从而导致等待事务的队列。许多现实世界的工作负载不是平稳的,例如一天,但可能在某些时间爆发( 帕累托分布 )。MySQL 8.0在每秒事务数,平均延迟和第95百分位延迟方面都能更好地处理此类突发事件。最终用户的好处是更好的硬件利用率(效率),因为系统需要更少的备用容量,因此可以以更高的平均负载运行。最初的补丁由Jiamin Huang( Bug#84266 )提供。请研究一下 争用意识事务调度 (CATS)算法,阅读贾民明和Sunny Bainshere的MySQL博客文章。

资源组

MySQL 8.0将全局资源组引入MySQL。使用资源组,DevOps / DBA可以管理用户/系统线程和CPU之间的映射。这可用于在CPU之间拆分工作负载,以在某些用例中获得更高的效率和/或性能。因此,资源组向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中的博客文章 New Defaults 。Mogan Tockerhere在博客文章中概述了这一动机。

协议

MySQL 8.0添加了一个关闭结果集的元数据生成和传输的选项。构造/解析和发送/接收结果集元数据消耗服务器,客户端和网络资源。在某些情况下,元数据大小可能比实际结果数据大小大得多,并且不需要元数据。通过完全禁用这些数据的生成和存储,我们可以显着加快查询结果传输速度。CLIENT_OPTIONAL_RESULTSET_METADATA 如果客户端不希望元数据返回结果集,则客户端可以设置该 标志。

C客户端API

MySQL 8.0扩展了libmysql的C API,其中包含一个稳定的接口,用于从服务器获取作为数据包流的复制事件。目的是避免调用未记录的API和打包内部头文件,以实现基于binlog的程序,如MySQL Applier for Hadoop。

Memcached的

MySQL 8.0通过多个get 操作和范围查询支持 增强了InnoDB Memcached功能 我们添加了对多重获取 操作的支持, 以进一步提高读取性能,即用户可以在单个memcached查询中获取多个键值对。 Yoshinori @ Facebook已经要求支持 范围查询使用范围查询,用户可以指定特定范围,并获取此范围内的所有限定值。这两个功能都可以显着减少客户端和服务器之间的往返次数。

持久性自动计数器

MySQL 8.0 AUTOINC 通过计数器写入重做日志来保留 计数器。这是对旧版Bug#199的修复MySQL恢复过程将重播重做日志并确保AUTOINC 计数器的正确值 不会有任何AUTOINC 计数器回滚 这意味着数据库恢复将在崩溃后重新建立最后的已知计数器值。它保证 AUTOINC 计数器不能两次获得相同的值。计数器单调递增,但请注意可能存在间隙(未使用的值)。缺乏持久性AUTOINC 在过去被认为是麻烦的,例如参见 Stephen Dewey在2006年报道的Bug#21641或 这篇 博文。

摘要

如上所示,MySQL 8.0带有大量新功能和性能改进。dev.mysql.com下载 并试用!

您还可以  现有的MySQL 5.7 升级到MySQL 8.0。在此过程中,您可能需要尝试新的MySQL Shell(mysqlsh)附带的newUpgrade Checker。此实用程序将分析您现有的5.7服务器并告诉您可能的8.0不兼容性。另一个很好的资源是博客文章 迁移到MySQL 8.0而不会破坏FrédéricDescamps的旧应用程序

在这篇博文中,我们介绍了服务器功能。还有更多!我们还将发布其他功能的博客文章,例如复制,组复制,InnoDB群集,文档存储,MySQL Shell,DevAPI和连接器。

这就是现在, 感谢您 使用 MySQL !

原文地址:https://www.cnblogs.com/DataArt/p/10232790.html