本节为源码解读的第七篇,将主要为大家介绍如何新建虚拟表。了解虚拟表能够理解 OceanBase 内部的模块设计,更重要的是运维和诊断需要的信息很多是通过虚拟表实现的。
前六篇可参考:
1、OceanBase 数据库源码解读(一)引言:https://open.oceanbase.com/articles/1100222
2、OceanBase 数据库源码解读(二)目录结构:https://open.oceanbase.com/articles/1100224
3、OceanBase 源码解读(三)SQL 的一生:https://open.oceanbase.com/articles/1100225
4、OceanBase 源码解读(四)分区的一生:https://open.oceanbase.com/articles/1100236
5、OceanBase 源码解读(五)事务的一生:https://open.oceanbase.com/articles/1100237
6、OceanBase 源码解读(六)租户的一生:https://open.oceanbase.com/articles/1100242
虚拟表严格说应该属于视图,是把内存数据结构映射成可以用 SQL 语句直接查询的“表”。
视图的概念:https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/view
虚拟表的命名
虚拟表命名是以 oceanbase.__all_virtual 为前缀,从 sys 租户的 __all_table 中可以查到部分虚拟表。
注意:
- 这些虚拟表不是公开的接口(所以也没有公开文档),不能保证跨版本兼容。因此外部应用时应使用公开的 oceanbase.v$ 视图和数据字典。
- MySQL 租户下所有 show 语句(如 show variables),都是通过一个特殊的 SQL 改写为对对应虚拟表的 select。
如:show parameters like '%syslog%' 语句被改写为 select * from __all_virtual_parameter_stat where name like '%syslog%' 。
新建虚拟表
1.添加表定义。在 share/inner_table/ob_inner_table_schema_def.py 中定义了所有内部表(系统表)。给虚拟表预留的 ID 是10000-20000。按照里面的某个 MySQL 租户虚拟表添加。然后运行 generate_inner_table_schema.py 脚本会自动产生这个表定义相关的 C++ 代码。
2. 实现这个虚拟表内容的迭代器。每个虚拟表实现接口 ObVirtualTableScannerIterator。
当前虚拟表的实现分为两类:
- RS 虚拟表位于 rootserver/virtual_table,展示的是 RS 特有信息。
- observer/virtual_table 里的虚拟表展示的是每个节点上的信息。
3.在 ObVTIterCreator 的 switch-case 中根据表 ID 创建对应迭代器。
相信通过前面的介绍,大家对虚拟表有了一定的了解。
好了,这个系列的第一个练习题来了。请给 observer 新增虚拟表 __all_virtual_os_process,可以 select 出每台 observer 上的操作系统进程信息。让我们一起动起手来吧!https://github.com/oceanbase/oceanbase/discussions/290
(未完待续.....敬请期待第八篇哟)
如果您有任何疑问,可以通过以下方式与我们进行交流:
微信群:扫码添加小助手,将拉你进群哟~
钉钉群:33254054
欢迎大家一起参与社区贡献, 指南请参考看这里 :https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/how-to-contribute
社区答疑:https://open.oceanbase.com/answer