原本我想把标题定为《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!




