
数据库
文章平均质量分 94
介绍数据库相关的技术、源码分析、使用技巧等。
dbkernel
目前从事云数据库MySQL数据库内核研发工作,曾做过Postgres-XC、Greenplum等分布式数据库的内核开发。热衷于研究主流数据库架构、源码,对关系型数据库 MySQL/PostgreSQL及分布式数据库有深入研究。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
特性介绍 | MySQL生态现有计算下推方案汇总
计算下推是数据库优化器优化查询性能的一种常见手段,早期的数据库系统提及的计算下推一般是指谓词下推,其理论源自关系代数理论。2000 年以后,随着 Oracle RAC 的盛行以及一众开源分布式数据库的崛起,存算分离的概念逐步流行,计算下推的涵盖范围由此从基本的谓词+投影下推延伸到了数据库所支持的一切可能计算的下推(JOIN、聚合、完整 query、部分 query 等)。原创 2024-03-18 11:15:09 · 1544 阅读 · 1 评论 -
问题分析 | 为什么主库Waiting for semi-sync ACK from slave会阻塞set global super_read_only=ON的执行
在 MDL 中 MDL_KEY 按照 namespace+DB+OBJECT_NAME 的方式进行表示,所谓的 namespace 也比较重要,调用 Global_read_lock::lock_global_read_lock 函数的其他位置与事务提交没太大关系,应与此无关。申请的 S 模式的 MDL_key::GLOBAL 锁,查阅手册(二、如果主库执行的是事务型的语句,比如。进程,之后在主库执行的新事务会处于。锁,S 模式,这两种模式是冲突的,状态的事务还未提交,也就未释放。原创 2024-03-18 10:38:28 · 1758 阅读 · 0 评论 -
捉虫日记 | MySQL 8.0从库某些情况下记录重放的CREATE TABLE、DROP TABLE语句到慢日志(slow log)
当主从复制采用 binlog 的行模式时,如果从库启用 slow_query_log、log_slow_replica_statements 且从库重放 CREATE TABLE、DROP TABLE 时因特殊情况(比如被从库其他 SQL 占用 MDL 锁)执行耗时较长,会被从库记录到慢日志(slow log),而 ALTER TABLE 却不会被记录到慢日志。按照官方的描述,在 binlog_format 是行模式的情况下,即使启用。相关的 Bug Fix,说明该问题官方尚未修复。原创 2024-03-18 09:44:45 · 1246 阅读 · 0 评论 -
特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
作者:卢文双 资深数据库内核研发以前对 MySQL 测试框架 MTR 的使用,主要集中于 SQL 正确性验证。近期由于工作需要,深入了解了 MTR 的方方面面,发现 MTR 的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其总结成一个系列。本文是第四篇语法篇。原创 2023-07-06 23:23:37 · 919 阅读 · 0 评论 -
源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
作者:卢文双 资深数据库内核研发以前对 MySQL 测试框架 MTR 的使用,主要集中于 SQL 正确性验证。近期由于工作需要,深入了解了 MTR 的方方面面,发现 MTR 的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其总结成一个系列。本文是第三篇源码篇。原创 2023-07-06 23:17:37 · 979 阅读 · 0 评论 -
特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
以前对 MySQL 测试框架 MTR 的使用,主要集中于 SQL 正确性验证。近期由于工作需要,深入了解了 MTR 的方方面面,发现 MTR 的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其总结成一个系列。主要内容如下:- 入门篇:工作机制、编译安装、参数、指令示例、推荐用法、添加 case、常见问题、异常调试- 进阶篇:高阶用法,包括单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁- 源码篇- 语法篇原创 2023-05-07 21:28:13 · 711 阅读 · 1 评论 -
特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
作者:卢文双 资深数据库内核研发以前对 MySQL 测试框架 MTR 的使用,主要集中于 SQL 正确性验证。近期由于工作需要,深入了解了 MTR 的方方面面,发现 MTR 的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其总结成一个系列。主要内容如下:入门篇:机制、编译安装、参数、指令、推荐用法、添加 case、异常调试进阶篇:高阶用法,包括单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁源码篇语法篇原创 2023-04-17 13:42:59 · 907 阅读 · 1 评论 -
源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
很多人看到标题还以为自己走错了夜场,其实没有。ClickHouse 可以挂载为 MySQL 的一个从库 ,先全量再增量的实时同步 MySQL 数据,这个功能可以说是今年最亮眼、最刚需的功能,基于它我们可以轻松的打造一套企业级解决方案,让 OLTP 和 OLAP 的融合从此不再头疼。目前支持 MySQL 5.6/5.7/8.0 版本,兼容 Delete/Update 语句,及大部分常用的 DDL 操作。代码已经合并到 upstream master 分支,预计在20.8版本作为experimental 功能转载 2022-07-07 14:27:31 · 195 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
本文首发于 2020-06-22 21:55:1021 世纪的第二个 10 年,虎哥已经在存储引擎一线奋战近 10 年,由于强大的兴趣驱动,这么多年来几乎不放过 arXiv 上与存储相关的每一篇 paper。尤其是看到带有 draft 的 paper 时,有一种乞丐听到“叮当”响时的愉悦。看paper这玩意就像鉴宝,多数是“赝品”,需要你有“鉴真”的本领,否则今天是张三的算法超越xx,明儿又是王二的硬件提升了yy,让你永远跟不上节奏zz,湮灭在这些没有营养的技术垃圾中,浪费大好青春。言归正传,接下来的3篇,转载 2022-07-11 16:56:37 · 220 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
本文首发于 2020-06-30 21:41:12上篇的 存储引擎技术进化与MergeTree 介绍了存储算法的演进。存储引擎是一个数据库的底盘,一定要稳和动力澎湃。接下来我们将一起来探索下 ClickHouse MergeTree 列式存储引擎,解构下这台“跑车”最重要的部件。所有的存储引擎,无论精良与粗制滥造,最终都是要把数据回写到磁盘,来满足存储和索引目的。磁盘文件的构造可以说是算法的物理体现,我们甚至可以通过这些存储结构反推出其算法实现。所以,要想深入了解一个存储引擎,最好的入手点是它的磁盘存储结构转载 2022-07-11 17:05:42 · 223 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(8)纯手工打造的SQL解析器
本文首发于 2020-07-26 21:55:10现实生活中的物品一旦被标记为“纯手工打造”,给人的第一感觉就是“上乘之品”,一个字“贵”,比如北京老布鞋。但是在计算机世界里,如果有人告诉你 ClickHouse 的 SQL 解析器是纯手工打造的,是不是很惊讶!这个问题引起了不少网友的关注,所以本篇聊聊 ClickHouse 的纯手工解析器,看看它们的底层工作机制及优缺点。枯燥先从一个 SQL 开始:token首先对 SQL 里的字符逐个做判断,然后根据其关联性做 token 分割:比如连续的 Word转载 2022-07-11 17:10:00 · 411 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
本文首发于 2021-01-26 21:31:12在揭秘 ClickHouse Group By 之前,先聊聊数据库的性能对比测试问题。在虎哥看来,一个“讲武德”的性能对比测试应该提供什么信息呢?首先要尊重客观事实,在什么场景下,x 比 y 快?其次是为什么 x 会比 y 快?如果以上两条都做到了,还有一点也比较重要: x 的优势可以支撑多久? 是架构等带来的长期优势,还是一袋烟的优化所得,是否能持续跟上自己的灵魂。如果只是贴几个妖艳的数字,算不上是 benchmark,而是 benchmarket。好了转载 2022-07-11 17:33:29 · 834 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
本文首发于 2020-09-21 22:01:12如果多个 ClickHouse server 可以挂载同一份数据(分布式存储等),并且每个 server 都可写,这样会有什么好处呢?首先,我们可以把副本机制交给分布式存储来保障,上层架构变得简单朴素;其次,clickhouse-server 可以在任意机器上增加、减少,使存储和计算能力得到充分发挥。本文就来探讨一下 ClickHouse 的存储计算分离方案,实现上并不复杂。ClickHouse 运行时数据由两部分组成:内存元数据和磁盘数据。我们先看写流程:转载 2022-07-11 17:27:46 · 567 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
本文首发于 2020-09-15 20:15:14在 MySQL 里,为了保证高可用以及数据安全性会采取主从模式,数据通过 binlog 来进行同步。在 ClickHouse 里,我们可以使用 ReplicatedMergeTree 引擎,数据同步通过 zookeeper 完成。本文先从搭建一个多 replica 集群开始,然后一窥底层的机制,简单吃两口。搭建一个 2 replica 测试集群,由于条件有限,这里在同一台物理机上起 clickhouse-server(2个 replica) + zookee转载 2022-07-11 17:23:37 · 536 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
本文首发于 2020-09-03 21:22:14在 ClickHouse 里,物化视图(Materialized View)可以说是一个神奇且强大的东西,用途别具一格。本文从底层机制进行分析,看看 ClickHouse 的 Materalized View 是怎么工作的,以方便更好的使用它。对大部分人来说,物化视图这个概念会比较抽象,物化?视图?。。。为了更好的理解它,我们先看一个场景。假设你是 一个“幸福”的小程序员,某天产品经理有个需求:实时统计每小时视频下载量。用户下载明细表:计算每小时下载量:转载 2022-07-11 17:20:36 · 328 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
本文首发于 2020-08-28 20:40:14MySQL实时复制原理篇几天前 ClickHouse 官方发布了 v20.8.1.4447-testing,这个版本已经包含了 MaterializeMySQL 引擎,实现了 ClickHouse 实时复制 MySQL 数据的能力,感兴趣的朋友可以通过官方安装包来做体验,安装方式参考 https://clickhouse.tech/#quick-start,需要注意的是要选择 testing 分支。MaterializeMySQL 在 v20.8.1.444转载 2022-07-11 17:18:27 · 218 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
本文首发于 2020-08-20 19:55:14数据库系统为了提高写入性能,会把数据先写到内存,等“攒”到一定程度后再回写到磁盘,比如 MySQL 的 buffer pool 机制。因为数据先写到内存,为了数据的安全性,我们需要一个 Write-Ahead Log (WAL) 来保证内存数据的安全性。今天我们来看看 ClickHouse 新增的 MergeTreeWriteAheadLog 模块,它到底解决了什么问题。对于 ClickHouse MergeTree 引擎,每次写入(即使1条数据)都会在磁盘转载 2022-07-11 17:15:28 · 264 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
本文首发于 2020-06-05 19:37:10一次偶然的机会,和ClickHouse团队做了一次线下沟通,Alexey提到ClickHouse的设计哲学:用工程思维解决商业问题的典范啊!对用户来说,他们关心的不是什么天花乱坠、上天入地的高科技,只是需要一个能很好解决自己问题的方案,这在开源社区是非常难得的,靠实力“野蛮式”生长。于是,我对这个散发着伏特加味道的利器充满了好奇,并参与到ClickHouse的社区中一探究竟,第一感觉是开放、友好、战斗力强(AK47 vs CK16, ClickHouse 2转载 2022-07-10 21:06:42 · 272 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
本文首发于 2020-06-07 17:17:10作为一个 OLAP 的 DBMS 来说,有2个端非常重要:这样内外互通,多条朋友多条路,以实现“数据”级的编排能力。今天谈的是入口端的 MySQL 协议,也是本系列 ClickHouse 的第一个好朋友,用户可通过 MySQL 客户端或相关 Driver 直接链接到 ClickHouse,进行数据读写等操作。本文通过 MySQL的 Query 请求,借用调用栈来了解下 ClickHouse 的数据读取全过程。入口文件在:MySQLHandler.cppMy转载 2022-07-10 21:17:41 · 252 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
本文首发于 2020-06-08 19:57:10上篇的MySQL Protocol和Read调用里介绍了 ClickHouse 一条查询语句的调用栈,本文继续介绍写的调用栈,开整。建表:写入数据:调用栈分析1. 获取存储引擎 OutputStream2. 从 SQL 组装 InputStream 如何组装成 inputstream 结构呢?然后通过 NullAndDoCopyBlockInputStream的 copyData 方法构造出 Block:3. 组装 OutputSt转载 2022-07-10 21:21:48 · 107 阅读 · 0 评论 -
源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
本文首发于 2020-06-12 20:57:10最后更新: 2020-08-15本文谈下 ClickHouse 核心科技:处理器 Processor 和有向无环调度器 DAG Scheduler。这些概念并不是 ClickHouse 首创,感兴趣的同学可以关注下 materialize 的 timely-dataflow,虎哥用 golang 也写过一个原型。拼的是实现细节,正是这些模块的精良设计,才有了 ClickHous e整体的高性能。在传统数据库系统中,一个 Query 处理流程大体是:其中在 P转载 2022-07-10 21:26:02 · 476 阅读 · 0 评论