本节为源码解读的第七篇,将主要为大家介绍如何新建虚拟表。了解虚拟表能够理解 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 创建对应迭代器。

相信通过前面的介绍,大家对虚拟表有了一定的了解。




