暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase源码解读(七):带你看透虚拟表

330

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

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论