版权声明:本文参考CSDN博主「阿福Chris」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chrisy521/article/details/127142293
- Client 向灰色框框里的服务端发起访问请求;
- NET 网络模块接受到请求以后,将请求交给 Parser 模块进行词法解析(LEX)和语法解析(YACC);
- 经过词法解析和语法解析后,转发给 Plan Cache 这个模块,当前的 Plan Cache 不做任何特殊处理,直接丢给 Resolver 模块;
- Resolver 模块会将 Parser 模块解析出来的语法树进行细化,比如把里面表的名字转换成某一个对象、比如把 SELECT * 中的 * 转换为表中的各个字段;当然在这个阶段还会进行一些预检,比如查看该表是否存在;
- 接下来会传给优化阶段的 Transformer 和 Optimizer,这两个部分像前一篇文章纪老师提到的一样,会不断的迭代,尽量找到一个低成本的执行计划;Transformer 会根据一些 SQL 规则进行一些优化;Optimizer 会根据一些统计数据找到一个更好的查询路径;
- 然后会传给后面的 Executor 执行模块,按照执行计划执行查询,把执行结果返回给 NET 网络模块;
- NET 模块通过 Socket 返回给客户端
MiniOB 开发调试环境搭建
当前已经确认没问题的环境是 Mac 和 Linux 机器,如果是 Windows 机器的话,可以尝试 Linux 子系统、虚拟机 Linux 或 Docker 来做。
环境搭建大概需要如下几个步骤:
安装 CMAKE,版本建议 3.20 以上的版本
安装 GCC,版本建议 8.3 以上的版本
下载代码
安装依赖库
编译 MiniOB
依赖库和MiniOB的编译,可以参考文章:https://github.com/oceanbase/miniob/blob/main/docs/how_to_build.md 进行。如果有遇到问题,可以在我的帖子中搜索 MiniOB 编译问题解决的那个帖子。
注意:在编译时为了方便调试,建议将 DEBUG选项加上,比如:cmake … -DDEBUG=ON
如果大家希望采用 Docker,可以参考一下 Docker Hub 的位置下载已经准备好的环境:
上手调试环境演示
上面的开发调试环境搭建好了以后,接下来我们跟着运来老师一起来看一下如何使用和调试 MiniOB。
- 编译好以后,在 MiniOB 目录的 build 文件夹下,会生成 bin 文件夹,可执行的 server 和 client 文件都在此处
- 下面我们通过指定 sock 和 配置文件 的方式启动 observer,指定 & 符号启动后台运行
$ ./bin/observer -s miniob.sock -f ../etc/observer.ini &
[1] 13072
Successfully load ../etc/observer.ini
- 启动后,会在本地生成一个日志文件,如果平时我们使用 gdb 比较麻烦,可以通过查看日志来进行一些问题定位操作
-rw-r--r-- 1 chris staff 47085 10 2 14:27 observer.log.20221002
- 接着,我们可以使用客户端连接到 observer 进行一些操作
$ ./bin/obclient -s miniob.sock miniob > show tables; t1 miniob > create table t2(id int); SUCCESS miniob > insert into t2(id) values(1); Failed to parse sql miniob > insert into t2 values(1); SUCCESS miniob > select * from t2; id 1 miniob >