暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

全球首发!MySQL 5.7.39、8.0.30、8.0.31更新预告

yangyidba 2022-06-30
2688

原本我想把标题定为《mysql黑盒子研究工具|官方文档》,但不够有趣。文章上半部分讲学习方法,下半部分介绍新版本。

大家可能看了我的上一篇文章《如何分析 mysqld crash 的原因》,发现研究和分析 MySQL 原来全靠 baidu ,大家也可能看了我第三篇文章《mysql黑盒子研究工具|strace》,这个是我认为最简单的研究 MySQL 的工具之一。

我现在害怕了,怕误导初学者,我在这里提出,研究和学习 MySQL 的第一个工具应该是——官方文档,这才是武林秘籍。

官方文档比baidu重要

如果说官方文档是武林秘籍,那么 baidu 就是葵花宝典。

这个没啥好解释的,因为大多数人写的文章内容主要都参考自官方文档,这才是一手资料。但随着官方版本的迭代,您看的 baidu 搜来的博客知识可能是滞后的,也就是对现在版本来说这些知识是错误的。而国内的部分码农博客抄袭成风,一旦有一个人写错博客内容了,那 90% 的人都会抄错作业。

举个例子,大家都知道从 2016 年 X 月开始,percona 发行的热备工具中,innobackup 是 xtrabackup 的软链接,而不再是 perl 脚本了。但网上怎么说?

都 2022 年了,perl 都快没有人用了,还 perl 脚本。。

所以,无论查什么软件的资料,第一个想到的应该是官方文档。

MySQL 的官档在哪里,很好记忆,请记住下面地址:

mysql.com/doc


MySQL 官方文档我看什么?

一般来说,我就看两块。

  • Release Notes
  • Reference Manual

第一部分:Release Notes 发行说明

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/

我们在右侧,可以更换查看不同发行版本的 Release Notes,目前我们可以查看 5.6、5.7、8.0 版本的发行版说明。

左侧是发行的历史记录。点开图片放大仔细看。MySQL 发版是有规律的,一般来说,是一年四个小版本,分别是 1、4、7、10月的中下旬发版。

里面有一个发行版(MySQL 8.0.25) 比较特殊,他是 2021-05-11 发版的,和发版周期规律对不上,我相信是因为有重大 bug,官方临时紧急发的一次版 (而且我猜这个 bug 并没有写到 release notes 正文,故意没有告诉咱们)。

几个关键时间点:

  • MySQL 8.0.0 (2016-09-12, Development Milestone) 第一个开发里程碑版
  • MySQL 8.0.3 (2017-09-21, Release Candidate) 第一个候选发布版
  • MySQL 8.0.11 (2018-04-19, General Availability) 第一个稳定版本
  • MySQL 8.0.29 (2022-04-26, General Availability) 最新稳定版本

有趣的是,官方跳过了 MySQL 8.0.5 - 8.0.10 版本,可能是官方故意为之,版本号越高,客户越敢使用,官方希望推动 MySQL 8.0 尽快上客户的生产环境。

我们发现两个奇怪的版本,他们没有 GA 发行,点开链接内容为空,那为什么官方要把这两个空内容的 GA 版本标题写到发行历史记录里呢?

同样的, 5.7 也有这个问题。更奇怪是,为什么 8.0 有两个,5.7.39 只有一个呢?

好了,我们先不管这些,后面我再回来说说他们。

Release Notes 发行说明的正文

正文里,官方是分功能模块来介绍的。我先说一下,我对小软件简易 release notes 的看法。如果给我去做 release notes,我只会做 5个部分。

  • note      一般性文字描述
  • add       新增了什么功能
  • remove 移除了什么功能
  • change 修改了什么功能
  • Fix        修复了什么bug

而我对 MySQL 的 release notes 解读如下图:

和我的分类不一样的是,MySQL 在 remove(移除) 一个功能前会先 deprecated (弃用),这个功能在版本 deprecated 的话,意味着官方不建议您继续使用了,在使用时为了兼容,依然能用,但会给你一个警告,提醒您这个功能将会未来版本被移除。

我看 release notes 一般会看什么?

一般来说我不怎么看 bug fix,其他的全看。如果某个 bug 我知道并关注了,我非常期待这个 bug 尽快修复,那么我会记录这个 bug id,在 release notes 搜索,看这个版本是否 fix 了。

第二部分:Reference Manual 参考手册

https://dev.mysql.com/doc/refman/8.0/en/

这个是学习使用 MySQL 的官方文档地址,是一个在线文档,我只推荐在这里看官方文档。因为浏览器上文档的排版非常舒服,方便复制文字用于做笔记或者到搜索引擎搜索,谷歌浏览器还可以直接右键"翻译中文(简体)"直接翻译全文。最最重要的是,你查到的知识是最新的,实时更新过的。

我们曾经过给官方提过 doc 文档的 bug,官方也很效率,第二天就 fix 了,那个 bug 是某个功能在我做实验后发现他完全讲错了,如果你用 pdf 文档看,那你就有可能看到了错误的内容,学到错误的奇怪的知识。

如果你依然想下载离线版,可以在网站左侧底部找到红圈这里下载,箭头那个是地址是"源码文档",没事别想不开点开,你会和我一样陷入初级 DBA 的无尽痛苦。

参考手册的整体内容或布局没有什么好讲的,如果需要查询内容,到左侧搜索框搜索关键字就可以了。如果你想成为一名 MySQL 专家,我建议把官方文档通读一遍。

PDF(A4)格式 6000多页而已,不多~

MySQL 5.7.39、8.0.30、8.0.31 预告

现在,我们回过头来说说,前面提到的三个为 GA 的版本号到底是肿么肥事。

实际上,因为我提到了文档是实时更新的,所以 release notes 有提及但未 GA 的版本号都可以在 Reference Manual 里搜索找到相关描述文档(如上图),我从里面稍微总结一下,就有了以下 MySQL 未发行的新版本的更新预告了。

5.7.39

  • (我认为的重要更新) 参数: performance_schema_show_processlist
    : 在 MySQL 5.7.39 版本,我们除了可以使用原生的 information_schema 版的 show processlist
     外,还在 performance_schema 添加了 processlist 表,如果设置开启这个参数,show processlist
     就默认改用 performance_schema 版本的啦。默认版本的实现是从线程管理器中遍历活动线程,同时持有一个全局互斥锁,这会对性能产生负面影响,尤其是在繁忙的系统上。新版就 prefect 啦。当然这个值的默认值是 off,为什么?因为使用上他有一些要求啦,所以你要确认你满足那些要求再开启这个参数了。

注: 这个功能早在 MySQL 8.0.22 就有了,只是现在才合并到 5.7 版本上

  • 参数: keyring_aws_region
    :参数可选值多了一些选项。这个参数和我们没什么关系,和 MySQL 密钥环有关,要安装 MySQL 密钥环插件,还和亚马逊云有关。
  • myisamchk 工具的 --parallel-recover
     参数在 5.7.38 已废弃,在 5.7.39 正式删除。原因是这个参数是测试质量的代码,使用有风险!也说明了官方对 myisam 的态度嘛,测试质量的代码宁愿删除也不好好测测。
  • 参数: myisam_repair_threads
     和上面的一样,看起来是做表修复的,所以也是测试质量的代码,一起删除了。

8.0.30

除了和 5.7.39 有一样的内容修改外(其中 performance_schema_show_processlist 是8.0.22 引入的),以下是 8.0.30 额外的:

  • (我认为的重要更新) 新功能,GIPK 模式:生成不可见的主键。新增sql_generate_invisible_primary_key
     参数,默认值是 off,在主从复制的主库开启后,会影响表的创建,如果没有显式定义主键会自动添加一个不可见主键索引,请参考以下两张表
## sql_generate_invisible_primary_key=off 建的表
mysql> SHOW CREATE TABLE auto_0\G
*************************** 1. row ***************************
       Table: auto_0
Create Table: CREATE TABLE `auto_0` (
  `c1` varchar(50) DEFAULT NULL,
  `c2` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

## sql_generate_invisible_primary_key=on 建的表
mysql> SHOW CREATE TABLE auto_1\G
*************************** 1. row ***************************
       Table: auto_1
Create Table: CREATE TABLE `auto_1` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  `c1` varchar(50) DEFAULT NULL,
  `c2` int DEFAULT NULL,
  PRIMARY KEY (`my_row_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

更详细的内容请参考:https://dev.mysql.com/doc/refman/8.0/en/create-table-gipks.html

配套参数: sql_generate_invisible_primary_key
:是否启用 GIPK 模式,在这种情况下,主库任何 innodb 表如果没有显式创建主键会自动生成不可见的主键,对从库表没有影响。
配套参数: show_gipk_in_create_table_and_information_schema
: 生成的不可见主键是否显示在 SHOW 语句和 INFORMATION_SCHEMA 表中。
配套服务器启动选项: --skip-generated-invisible-primary-key
,是否忽略 GIPK 模式 

这功能将极大减少因为没有主键导致的复制延迟。

  • (我认为的重要更新) 崩溃安全的 XA 事务。

good news!在之前 MySQL 所有版本均不支持分布式事务的崩溃恢复安全,使用 MySQL 做分布式改造时都要修改这方面的内核。

  • (我认为的重要更新) 从 MySQL 8.0.30 开始, innodb_doublewrite
     系统变量支持 DETECT_ONLY 和 DETECT_AND_RECOVER 设置。使用该 DETECT_ONLY设置,数据库页面内容不会写入双写缓冲区,并且恢复不会使用双写缓冲区来修复不完整的页面写入。此轻量级设置仅用于检测不完整的页面写入。该 DETECT_AND_RECOVER 设置等同于现有ON 设置。

使我有需要时可以动态修改 innodb_doublewrite,而无需重启服务器。我想到的场景,例如我的服务器 io 压力过大了,我先临时调一下,等 io 好转再调回来。

  • FIDO 库升级,从版本 1.5.0 升级到版本 1.8.0。FIDO 可插拔身份验证是商业产品 MySQL 企业版中包含的扩展,和我们无关。
  • 新增一些小语种的字符集排序规则
  • REVOKE 语法新增 IF EXISTS 和 IGNORE UNKNOWN USER 选项。
  • --skip-host-cache
     不要缓存主机名。已弃用,请改用 host_cache_size
    系统变量。
  • 从 MySQL 8.0.30 开始,不推荐将 replica_parallel_workers
     系统变量(或等效的服务器选项)设置为 0,并引发警告。当您希望副本使用单线程时,请改用 replica_parallel_workers=1
    ,这会产生相同的结果,但不会发出警告。
  • 在 MySQL 8.0.30 之前,该 ST_TRANSFORM()
    函数不支持笛卡尔空间参考系统。在 MySQL 8.0.30 及更高版本中,此函数支持流行的可视化伪墨卡托 (EPSG 1024) 投影方法,用于 WGS 84 伪墨卡托 (SRID 3857)。其他笛卡尔 SRS 仍然不受支持。
  • AES_ENCRYPT()
    函数 有一些调整。
  • old-style-user-limits
    :启用旧式用户限制(在 5.0.3 之前,用户资源按每个用户+主机与每个帐户计算)。在 MySQL 8.0.30 中已弃用。
  • mysqldump 执行全表扫描,这意味着它的查询通常会超过 long_query_time
     对常规查询有用的设置。从 MySQL 8.0.30 开始,如果要从慢查询日志中排除大部分或全部 mysqldump 产生的慢查询,可以设置 mysqldump 的 --mysqld-long-query-time
     命令行选项,将系统变量的 session 值更改为更高的值。
  • 从 MySQL 8.0.30 开始,如果将服务器置于离线模式的用户没有 SYSTEM_USER权限,则具有权限的已连接客户端用户 SYSTEM_USER 也不会断开连接。但是,这些用户在服务器处于脱机模式时无法启动与服务器的新连接,除非他们也具有 CONNECTION_ADMIN or SUPER 权限。只有他们现有的连接不能被终止,因为需要该 SYSTEM_USER 权限才能终止使用该权限执行的会话或语句 SYSTEM_USER 。
  • ssl_cert
     添加了链式 SSL 证书支持,以前只读取第一个证书。
  • status值:Tls_library_version
     ,显示此 MySQL 实例正在使用的 OpenSSL 库的运行时版本。
  • 优化了版本升级 upgrade 时的逻辑,提升升级时的效率。

8.0.31

  • 在 MySQL 8.0.31 之前,带括号的查询表达式不允许多个级别的 ORDER BY or  LIMIT 操作,查询会被拒绝。在 MySQL 8.0.31 及更高版本中,取消了此限制,并允许嵌套的带括号的查询表达式。支持的最大嵌套级别为 63;这是在解析器执行任何简化或合并之后。以下是示例:
#例子一
mysql> (SELECT 'a' UNION SELECT 'b' LIMIT 2) LIMIT 3;
+---+
| a |
+---+
| a |
| b |
+---+
2 rows in set (0.00 sec)

#例子二

  (SELECT a, b, c FROM t ORDER BY a LIMIT 3) ORDER BY b LIMIT 2
) ORDER BY c LIMIT 1;

  • MySQL 8.0.31 为 Linux 系统增加了只读 系统变量, 在编译时会生成 build_id
     一个 160 位的签名;SHA1 的值 build_id
     是将生成的值转换为十六进制字符串的值,为构建提供唯一标识符。build_id
     每次 MySQL 启动时都会写入服务器日志。目前我不知道这是解决什么问题的。
  • INTERSECT 现在是保留字

结束语

上面的发行版更新预告基于实时官方文档整理,仅供参考,真正的 release note 会比我写的更全、更准确。

Enjoy MySQL!



文章转载自yangyidba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论