原本我想把标题定为《mysql黑盒子研究工具|官方文档》,但不够有趣。文章上半部分讲学习方法,下半部分介绍新版本。
大家可能看了我的上一篇文章《如何分析 mysqld crash 的原因》,发现研究和分析 MySQL 原来全靠 baidu ,大家也可能看了我第三篇文章《mysql黑盒子研究工具|strace》,这个是我认为最简单的研究 MySQL 的工具之一。
我现在害怕了,怕误导初学者,我在这里提出,研究和学习 MySQL 的第一个工具应该是——官方文档,这才是武林秘籍。
如果说官方文档是武林秘籍,那么 baidu 就是葵花宝典。
这个没啥好解释的,因为大多数人写的文章内容主要都参考自官方文档,这才是一手资料。但随着官方版本的迭代,您看的 baidu 搜来的博客知识可能是滞后的,也就是对现在版本来说这些知识是错误的。而国内的部分码农博客抄袭成风,一旦有一个人写错博客内容了,那 90% 的人都会抄错作业。
举个例子,大家都知道从 2016 年 X 月开始,percona 发行的热备工具中,innobackup 是 xtrabackup 的软链接,而不再是 perl 脚本了。但网上怎么说?
都 2022 年了,perl 都快没有人用了,还 perl 脚本。。
所以,无论查什么软件的资料,第一个想到的应该是官方文档。
MySQL 的官档在哪里,很好记忆,请记住下面地址:
mysql.com/doc
MySQL 官方文档我看什么?
一般来说,我就看两块。
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.5 - 8.0.10 版本,可能是官方故意为之,版本号越高,客户越敢使用,官方希望推动 MySQL 8.0 尽快上客户的生产环境。
我们发现两个奇怪的版本,他们没有 GA 发行,点开链接内容为空,那为什么官方要把这两个空内容的 GA 版本标题写到发行历史记录里呢?
同样的, 5.7 也有这个问题。更奇怪是,为什么 8.0 有两个,5.7.39 只有一个呢?
好了,我们先不管这些,后面我再回来说说他们。
正文里,官方是分功能模块来介绍的。我先说一下,我对小软件简易 release notes 的看法。如果给我去做 release notes,我只会做 5个部分。
而我对 MySQL 的 release notes 解读如下图:
和我的分类不一样的是,MySQL 在 remove(移除) 一个功能前会先 deprecated (弃用),这个功能在版本 deprecated 的话,意味着官方不建议您继续使用了,在使用时为了兼容,依然能用,但会给你一个警告,提醒您这个功能将会未来版本被移除。
我看 release notes 一般会看什么?
一般来说我不怎么看 bug fix,其他的全看。如果某个 bug 我知道并关注了,我非常期待这个 bug 尽快修复,那么我会记录这个 bug id,在 release notes 搜索,看这个版本是否 fix 了。
https://dev.mysql.com/doc/refman/8.0/en/
这个是学习使用 MySQL 的官方文档地址,是一个在线文档,我只推荐在这里看官方文档。因为浏览器上文档的排版非常舒服,方便复制文字用于做笔记或者到搜索引擎搜索,谷歌浏览器还可以直接右键"翻译中文(简体)"直接翻译全文。最最重要的是,你查到的知识是最新的,实时更新过的。
我们曾经过给官方提过 doc 文档的 bug,官方也很效率,第二天就 fix 了,那个 bug 是某个功能在我做实验后发现他完全讲错了,如果你用 pdf 文档看,那你就有可能看到了错误的内容,学到错误的奇怪的知识。
如果你依然想下载离线版,可以在网站左侧底部找到红圈这里下载,箭头那个是地址是"源码文档",没事别想不开点开,你会和我一样陷入初级 DBA 的无尽痛苦。
参考手册的整体内容或布局没有什么好讲的,如果需要查询内容,到左侧搜索框搜索关键字就可以了。如果你想成为一名 MySQL 专家,我建议把官方文档通读一遍。
PDF(A4)格式 6000多页而已,不多~
现在,我们回过头来说说,前面提到的三个为 GA 的版本号到底是肿么肥事。
实际上,因为我提到了文档是实时更新的,所以 release notes 有提及但未 GA 的版本号都可以在 Reference Manual 里搜索找到相关描述文档(如上图),我从里面稍微总结一下,就有了以下 MySQL 未发行的新版本的更新预告了。
参数: 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 密钥环插件,还和亚马逊云有关。--parallel-recover 参数在 5.7.38 已废弃,在 5.7.39 正式删除。原因是这个参数是测试质量的代码,使用有风险!也说明了官方对 myisam 的态度嘛,测试质量的代码宁愿删除也不好好测测。参数: myisam_repair_threads 和上面的一样,看起来是做表修复的,所以也是测试质量的代码,一起删除了。除了和 5.7.39 有一样的内容修改外(其中 performance_schema_show_processlist 是8.0.22 引入的),以下是 8.0.30 额外的:
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 模式
这功能将极大减少因为没有主键导致的复制延迟。
good news!在之前 MySQL 所有版本均不支持分布式事务的崩溃恢复安全,使用 MySQL 做分布式改造时都要修改这方面的内核。
innodb_doublewrite 系统变量支持 DETECT_ONLY 和 DETECT_AND_RECOVER 设置。使用该 DETECT_ONLY设置,数据库页面内容不会写入双写缓冲区,并且恢复不会使用双写缓冲区来修复不完整的页面写入。此轻量级设置仅用于检测不完整的页面写入。该 DETECT_AND_RECOVER 设置等同于现有ON 设置。使我有需要时可以动态修改 innodb_doublewrite,而无需重启服务器。我想到的场景,例如我的服务器 io 压力过大了,我先临时调一下,等 io 好转再调回来。
--skip-host-cache 不要缓存主机名。已弃用,请改用 host_cache_size系统变量。replica_parallel_workers 系统变量(或等效的服务器选项)设置为 0,并引发警告。当您希望副本使用单线程时,请改用 replica_parallel_workers=1,这会产生相同的结果,但不会发出警告。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 中已弃用。long_query_time 对常规查询有用的设置。从 MySQL 8.0.30 开始,如果要从慢查询日志中排除大部分或全部 mysqldump 产生的慢查询,可以设置 mysqldump 的 --mysqld-long-query-time 命令行选项,将系统变量的 session 值更改为更高的值。ssl_cert 添加了链式 SSL 证书支持,以前只读取第一个证书。Tls_library_version ,显示此 MySQL 实例正在使用的 OpenSSL 库的运行时版本。#例子一
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;
build_id 一个 160 位的签名;SHA1 的值 build_id 是将生成的值转换为十六进制字符串的值,为构建提供唯一标识符。build_id 每次 MySQL 启动时都会写入服务器日志。目前我不知道这是解决什么问题的。上面的发行版更新预告基于实时官方文档整理,仅供参考,真正的 release note 会比我写的更全、更准确。
Enjoy MySQL!
原文作者:芬达的学习笔记;如有侵权,请联系管理员删除。