新書推薦:
《
基于鲲鹏的分布式图分析算法实战
》
售價:NT$
495.0
《
中国历史研究入门(全二册)
》
售價:NT$
1290.0
《
夺回大脑 如何靠自己走出强迫
》
售價:NT$
299.0
《
夏天,19岁的肖像(青鲤文库)岛田庄司两次入围日本通俗文学奖直木奖的作品 ,同名电影由黄子韬主演!
》
售價:NT$
225.0
《
图解机械工程入门
》
售價:NT$
440.0
《
股市长线法宝(第6版)
》
售價:NT$
640.0
《
中文版SOLIDWORKS 2024机械设计从入门到精通(实战案例版)
》
售價:NT$
450.0
《
纯数学教程
》
售價:NT$
390.0
編輯推薦:
★ MySQL 8.0新特性/故障分析/技术分享;
★ OceanBase的应用和开发实践案例;
★ 以系统化的架构向MySQL用户布道细小处的技巧。
內容簡介:
“大智小技”系列图书由爱可生开源社区发起,将每年在社区发布的优质技术内容进行筛选分类整理编辑而成。
《大智小技V:数据库生产实战漫笔》为系列图书的第五期,精选近一年来社区发布的技术内容。与前几本相比,本书除继续收录MySQL新特性、故障案例等经典内容之外,还新增了OceanBase章节,该章节旨在对OceanBase官方学习资料进行实战场景补充。
關於作者:
爱可生开源社区,一个有深度的数据库开源社区。社区成立于2017年,由上海爱可生信息技术股份有限公司发起。以开源高质量的运维工具、日常分享技术千货内容、数据库技术布道为己任。目前开源的产品有:SQL质量管理平台SQLE、分布式中间件DBLE和数据传输组件DTLE等。在这里,你将收获:高质量的技术内容、企业级数据库工具及服务、丰富的社区活动。
目錄 :
01 MySQL篇——8.0新特性
1 MySQL 8.0窗口函数框架用法
2 MySQL 8.0四个窗口函数的用法
3 MySQL 8.0通用表达式 WITH 的深入用法
4 MySQL 8.0多因素身份认证
5 MySQL 8.0对GTID的限制解除
6 MySQL 8.0的交集和差集介绍
7 MySQL 8.0对LIMIT的优化
8 MySQL 8.0新密码策略(一)
9 MySQL 8.0新密码策略(二)
10 MySQL 8.0新密码策略(三)
11 MySQL 8.0新密码策略(四)
12 MySQL 8.0在线调整REDO
13 MySQL 8.0REDO归档目录权限问题
14 MySQL 8.0.31导入直方图存量数据
15 针对用户定制不同格式执行计划
16 可能是目前最全的MySQL 8.0新特性解读
02 MySQL篇——技术分享
1 基于MySQL多通道主主复制的机房容灾方案
2 MySQL Shell运行SQL的两种内置方法概述
3 SQL优化:ICP的缺陷
4 MySQL级联复制下进行大表的字段扩容
5 一招解决MySQL中DDL被阻塞的问题
6 ibdata1文件“减肥”记/ 117
7 如何校验MySQL及Oracle时间字段合规性
8 mysqldump搭建复制报错,竟然是因为这个!
9 MySQL 5.7与MariaDB10.1审计插件兼容性验证
10 MySQL大表添加唯一索引的总结
11 MySQL覆盖索引优化案例一则
03 MySQL篇——故障分析
1 DROP大表造成数据库假死
2 MySQL主从延时值反复跳动
3 库表名大小写不规范,运维“两行泪”
4 MySQL convert函数导致的字符集报错处理
5 我都只读了,你还能写入?
6 MySQL升级到 8.0 版本变慢问题分析
7 MySQL管理端口登录异常排查及正确使用技巧
8 MySQL:我的从库竟是我自己
9 当USAGE碰到GRANT OPTION
10 从Insert并发死锁分析Insert加锁源码逻辑
11 数据库服务器内存不足一例分析
12 MySQL备份文件静默损坏一例分析
13 一条本该记录到慢日志的SQL是如何被漏掉的
14 innodb_thread_concurrency导致数据库异常的问题分析
04 OceanBase篇
1 OceanBase数据处理之控制文件
2 OceanBase资源及租户管理
3 OceanBase租户延迟删除
4 LSM-Tree和OceanBase分层转储
5 OceanBase里的BUFFER表
6 tenant删除租户的流程设计
7 OceanBase使用全局索引的必要性
8 OceanBase手滑误删了数据文件怎么办
9 OceanBase慢查询排查思路
10 从MySQL到OBOracle:如何处理自增列
11 OceanBase安全审计之身份鉴别
12 OceanBase安全审计之用户管理与访问控制
13 OceanBase特殊的INT与时间类型隐式转换问题
14 OceanBase一则函数报错问题分享
15 5270报错引发的几个思考
16 OceanBase频繁更新数据后读性能下降的排查
05 开源数据库及工具篇
1 Redis集群架构解析
2 Redis之分布式锁
3 Redis AOF重写源码分析
4 Redis主从复制风暴
5 Redis Cluster从库无法自动恢复同步案例一则
6 MongoDB索引操作导致服务崩溃
7 PBM备份恢复
8 DBA抓包神器tshark测评
內容試閱 :
2023年10月24日是爱可生开源社区成立六周年的日子。六年来,社区先后开源了多款数据运维工具,如SQLE、DBLE、DTLE等,为数据库从业者提供了企业级的开源解决方案,并受到社区用户的广泛好评。
在周年纪念日当天,SQL质量审核平台SQLE发布了3.0版本。SQLE全面改进,包括SQL审核功能的优化、SQL采集来源的扩展以及系统功能的优化等,大大提升了用户体验。在社区接到大量的用户诉求后,于2023年底,向社区用户开放SQLE企业体验版,为用户提供更多有价值的功能和服务。其他开源项目(DBLE、DTLE)在今年也发布了版本更新,始终为用户提供稳定可靠的技术支持。
众所周知,爱可生开源社区是一个数据库通用技术和实战经验分享平台。社区共累计发布数据库技术内容1000多篇,技术专栏5个,组织参与线上线下活动近百场,先后与30多家社区、媒体、出版社、开源基金会等组织成为合作伙伴,为数据库开源贡献自己的一份力量!
在此,爱可生开源社区衷心感谢过去六年来关注社区的广大用户,向社区投稿的作者们、在各类活动中一起合作的伙伴们,以及让本书顺利发行的中国市场出版社。
未来,社区将继续为大家提供高质量的技术内容、企业级数据库工具及服务、丰富的社区活动,也期待越来越多的技术爱好者加入我们这个有“深度”的数据库开源社区,与社区共同见证数据库开源生态的蓬勃发展。
爱可生开源社区
笔者一直是爱可生社区的忠实读者,实际工作中遇到的一些问题均能在社区文章中找到共鸣,深受启发。
通读了此书,书中内容结构清晰地分成了三大类(MySQL方向、OceanBase方向、开源数据库及工具篇)。除了讲解MySQL的8.0新特性、通用问题技术分享、常见故障排查分析,还为OceanBase独立成章,重点描述了OceanBase相关的理论知识点和常见问题,如资源机租户管理、分层转储、误删除处理、安全审计、性能下降的排查思路等。此外,本书还重点讲解了一直很火、关注度很高的开源库Redis和MongoDB,以及对应的两个常用备份恢复工具和抓包分析神器tshark。本书从上述三个方面一一铺展开来,所选文章来源于实际案例和一线人员的切身实战和思考,形式丰富多样,可谓“有图有真相”。
本书适合数据库从业者和技术爱好者持有,推荐大家拿到此书后,研读书中案例,既要深入进去也要跳脱出来理解,由点入线再入面,学习其思路、锤炼“吾”思维。此次推荐此书,愿拿到此书的各位读者找到共鸣。
——杨磊 中信建投证券数据架构师
“大智小技”系列图书的内容源于开源社区,当初可能是一段问答、一个案例,经过各位技术大咖的精炼,又如涓涓细流汇聚成册,名为“小技”,实为“大智”。
本书结合实际案例讲解技术原理,深入浅出,生动形象,日常放在身边随手翻阅,每每都能有新的收获,是一本值得推荐的实用型的数据库技术图书。
——上海证券 曹斌
时光流转,《大智小技V:数据库生产实战漫笔》即将问世,作为“大智小技”系列的读者,我深感荣幸。爱可生社区不断与时俱进、深耕技术,每一篇文章都凝聚了数据库从业者的实践总结和真知灼见。感谢你们的辛苦付出和无私分享。祝愿爱可生蒸蒸日上,“大智小技”系列不断延续下去。期待更多的精彩。
我强烈推荐您阅读这书,相信它一定会为您带来很多启示和帮助。
——邹启键 中电通商数字DBA专家
“大智小技”已陪伴四年,内容也逐渐从基础知识科普转向实战经验的分享,本人工作中时常翻阅该系列图书,找到知识点从而解决问题,有“豁然开朗”之感。
希望爱可生继续在开源社区中深耕,丰富“大智小技”内容,带来更多的惊喜。
——魏子昂 兴业数金数据库管理平台负责人
MySQL是目前非常流行的关系型数据库之一,本人从事MySQLDBA这么多年,书架上从早期的“书荒”到现在的“琳琅满目”,爱可生“大智小技”系列,始终是我非常喜欢的。
收到每一期“大智小技”的时候都爱不释手,每一期都收录了社区很多高价值的内容,让我受益匪浅,也让我感受到了爱可生作为一家以MySQL技术立足的科技公司所展现出的可贵的坚持与执着。
时光荏苒,“大智小技”系列已经到了第五期,希望更多的小伙伴能读到此书,能从中受益,也希望爱可生越来越好、国内的MySQL生态越来越好。
——王佳琦 紫金保险DBA专家
《大智小技V:数据库生产实战漫笔》是一本非常优秀的数据库图书,言简意赅、善于抓住重点内容,总结了很多实用的案例;为DBA提供了很好的学习和参考资料。相信读过此书的DBA们定会受益匪浅,并且快速积累数据库管理经验。感谢爱可生在推动开源数据库发展所作出的贡献,愿此书越来越好,发挥更多、更大的价值。
——李卓 易宝支付数据库架构师
“大智小技”第五期的问世实在令人振奋。这本书为我带来了超乎想象的收获。在这里,我发现了一直困扰我的问题的解决方法,不论是针对MySQL 8.0新特性的探索,还是对MySQL生产实践和故障分析的深入讨论,每一页都充满了丰富的经验和见解。
让我着迷的是书中关于故障分析的章节。每篇文章都涵盖了数据库管理的复杂领域,帮助我们更好地应对挑战。这不仅仅是一本书,更像是多位经验丰富的专家们的总结和心血,无论是对初学者还是专业人士,都有着巨大的指导意义。
每一页都是对数据库技术和运维经验的珍贵总结。阅读这本书如同一次深度旅程,让我对数据库管理有了全新的认识和视角。它涵盖范围广、讲解专业深入,将成为我日常工作和学习中不可或缺的指南。
——陈嘉发 银联数据数据库管理工程师
本人一直是爱可生社区的忠实爱好者,社区的优秀技术文章对本人的MySQL运维工作带来了非常大的帮助,市面上也很少有像“大智小技”系列这样实操性如此强的图书,所以非常建议各位数据库从业者一起阅览,相信无论是新加入的运维同学,还是资深DBA都会有所收获。
对于即将出版的《大智小技V:数据库生产实战漫笔》,首先要给爱可生对于MySQL社区这份不忘初心的坚持点个赞,从2019年到2023年,爱可生坚持每年发布一期,这份毅力难能可贵,同时也希望爱可生社区越办越好,为数据库从业者提供更多优质的文章!
——许天云 移动云DBA专家
《大智小技V:数据库生产实战漫笔》的真正魅力在于它源自开源社区,集结了许多技术大咖的精华,形成了一本实用技术的指南,聚集了社区中许多高价值的内容。以实际案例为基础,深入浅出地解释了MySQL技术原理,让复杂的概念变得易于理解。无论是数据库初学者还是经验丰富的专业人士,这本书都是一份不可或缺的指南。它通过清晰的解说、实用的示例和简明扼要的语言,为读者提供了宝贵的学习资源。
我从中获得了丰富的知识和经验,也感受到了爱可生作为一家以MySQL技术为核心的科技公司的坚持和执着。
随着时间的流逝,“大智小技”系列已经迎来了第五期。我希望更多的同行能够阅读这本书,从中受益,我也期待着爱可生的不断发展,以及国内MySQL生态的日益完善。
——尚伟烈 通联支付数据中心助理总经理
从MySQL 5.7到MySQL 8.0,“大智小技”系列图书在技术的道路上不断分享经验和探索新的技术,既有案例分析,也不乏原理解释,融理论与实践于一身。
它不仅可以作为日常技术学习的图书,还可以作为案头的工具书,经常翻阅,你所遇到的问题在“大智小技”系列图书里总会找到一些启发。
——高照 华宝证券
01 MySQL 篇——8.0 新特性
完稿前,MySQL刚刚发布了8.0.34版本。MySQL 8.0是一个非常活跃的版本,至今已经持续发布七年。每个版本都会推出一些新功能并对之前的版本问题进行修复。但这一切即将结束,MySQL 8.0.34仅为错误修复版本,MySQL团队公布了最新的版本策略。未来将会有创新版(Innovation)和长期支持版(LTS,Long-Term Support)两个版本同时存在。
近几年,社区一直保持对MySQL 8.0的关注,产出了很多新特性解读文章,包括窗口函数、新密码策略、直方图、SQL语法优化等,并且对目前为止MySQL 8.0的主要特性进行了阶段性总结,让我们再来回顾一下吧。
1 MySQL 8.0 窗口函数框架用法
作者:杨涛涛
窗口函数其实就是一个分组窗口内部处理每条记录的函数,这个窗口也就是之前聚合操作的窗口。不同的是,聚合函数是把窗口关闭,给一个汇总的结果;而窗口函数是把窗口打开,给分组内每行记录求取对应的聚合函数值或者其他表达式的结果。
本文重点看窗口函数内的 frame 子句:frame 子句用来把窗口内的记录按照指定的条件打印出来,跟在 PARTITION 和 ORDER BY 子句后面。frame 子句的语法如下:
frame_clause:
frame_units frame_extent
frame_units:
{ROWS | RANGE}
frame_extent:
{frame_start | frame_between}
frame_between:
BETWEEN frame_start AND frame_end
frame_start, frame_end: {
CURRENT ROW
| UNBOUNDED PRECEDING
| UNBOUNDED FOLLOWING
| expr PRECEDING
| expr FOLLOWING
}
这里分为两块:frame_units(框架单元)和 frame_extent(框架内容)。
frame_units(框架单元)有两个,一个是ROWS,一个是RANGE。ROWS后面跟的内容为指定的行号,而RANGE不同,RANGE指的是行内容。
框架内容看起来有挺多分类,其实用一句话来表达就是:为了定义分组内对应行记录的边界值来求取对应的计算结果。
基于表 t1 举例说明如下:
mysql: ytt_80 > desc t1;
------- ------ ------ ----- --------- -------
| Field | Type | Null | Key | Default | Extra |
------- ------ ------ ----- --------- -------
| id | int | YES | | NULL | |
| r1 | int | YES | | NULL | |
| r2 | int | YES | | NULL | |
------- ------ ------ ----- --------- -------
3 rows in set (0.00 sec)
mysql: ytt_80 > select * from t1;
------ ------ ------
| id | r1 | r2 |
------ ------ ------
| 2 | 1 | 1 |
| 2 | 2 | 20 |
| 2 | 3 | 30 |
| 2 | 4 | 40 |
| 3 | 3 | 3 |
| 3 | 2 | 2 |
| 3 | 10 | 20 |
| 3 | 30 | 20 |
| 1 | 1 | 1 |
| 1 | 2 | 3 |
| 1 | 3 | 4 |
| 1 | 10 | 10 |
| 1 | 15 | 20 |
| 2 | 15 | 2 |
| 3 | 15 | 5 |
| 1 | 9 | 100 |
------ ------ ------
16 rows in set (0.00 sec)
1.1 CURRENT ROW
CURRENT ROW表示获取当前行记录,也就是边界是当前行,等值关系。
mysql: ytt_80 > select id,r1,sum(r1) over(partition by id order by r1 asc
range current row ) as wf_result from t1 where id = 1;
------ ------ -----------
| id | r1 | wf_result |
------ ------ -----------
| 1 | 1 | 1 |
| 1 | 2 | 2 |
| 1 | 3 | 3 |
| 1 | 9 | 9 |
| 1 | 10 | 10 |
| 1 | 15 | 15 |
------ ------ -----------
6 rows in set (0.00 sec)
这里我们求ID为1的分组记录,基于聚合函数SUM来对分组内的行记录按照一定的条件求和。其中OVER子句用来定义分区以及相关条件,这里表示只获取分组内排序字段的当前行记录,也就是字段r1对应的记录。这是最简单的场景。
1.2 UNBOUNDED PRECEDING
UNBOUNDED PRECEDING表示边界永远为第一行。
mysql: ytt_80 > select id,r1,sum(r1) over(partition by id order by r1 asc rows
unbounded preceding ) as wf_result from t1 where id = 1;
------ ------ -----------
| id | r1 | wf_result |
------ ------ -----------
| 1 | 1 | 1 |
| 1 | 2 | 3 |
| 1 | 3 | 6 |
| 1 | 9 | 15 |
| 1 | 10 | 25 |
| 1 | 15 | 40 |
------ ------ -----------
6 rows in set (0.00 sec)
以上UNBOUNDED PRECEDING用来获取表t1,按照字段ID来分组,并且对字段r1求和。由于都是以第一行,也就是r1=1为基础求和,即求取上一行和当前行相加的结果,基于第一行记录。这个例子中r1字段的第一行记录为1,后面的所有求和都是基于第一行进行累加的结果。
1.3 UNBOUNDED FOLLOWING
UNBOUNDED FOLLOWING 表示边界永远为最后一行。
mysql: ytt_80 > select id,r1,sum(r1) over(partition by id order by r1 asc rows
between unbounded preceding and unbounded following ) as wf_result from t1 where
id = 1;
------ ------ -----------
| id | r1 | wf_result |
------ ------ -----------
| 1 | 1 | 40 |
| 1 | 2 | 40 |
| 1 | 3 | 40 |
| 1 | 9 | 40 |
| 1 | 10 | 40 |
| 1 | 15 | 40 |
------ ------ -----------
6 rows in set (0.00 sec)
以上用了ROWS BETWEEN把边界局限在第一行和最后一行,这样每行的求和结果和不带边界一样,也就是下面的查询:
mysql: ytt_80 > select id,r1,sum(r1) over() as wf_result from t1 where id = 1;
------ ------ -----------
| id | r1 | wf_result |
------ ------ -----------
| 1 | 1 | 40 |
| 1 | 2 | 40 |
| 1 | 3 | 40 |
| 1 | 10 | 40 |
| 1 | 15 | 40 |
| 1 | 9 | 40 |
------ ------ -----------
6 rows in set (0.00 sec)
1.4 EXPR PRECEDING / FOLLOWING
EXPR PRECEDING / FOLLOWING 表示带表达式的边界。
mysql: ytt_80 > select id,r1,sum(r1) over(partition by id order by r1 asc rows
1 preceding) as wf_result from t1 where id = 1;
------ ------ -----------
| id | r1 | wf_result |
------ ------ -----------
| 1 | 1 | 1 |
| 1 | 2 | 3 |
| 1 | 3 | 5 |
| 1 | 9 | 12 |
| 1 | 10 | 19 |
| 1 | 15 | 25 |
------ ------ -----------
6 rows in set (0.00 sec)
带表达式的边界只是把无边界换成具体的行号。上面的查询表达的意思是基于分组内每行记录和它上一条记录求和,不累加。可以看到wf_result的具体值,25对应的是10和15求和,19对应的是9和10求和。
以此类推,求每行和它上面两行的和:
mysql: ytt_80 > select id,r1,sum(r1) over(partition by id order by r1 asc rows
2 preceding) as wf_result from t1 where id = 1;
------ ------ -----------
| id | r1 | wf_result |
------ ------ -----------
| 1 | 1 | 1 |
| 1 | 2 | 3 |
| 1 | 3 | 6 |
| 1 | 9 | 14 |
| 1 | 10 | 22 |
| 1 | 15 | 34 |
------ ------ -----------
6 rows in set (0.00 sec)