OceanBase 0.4 自举时库表创建过程
传说,在OceanBase 0.4之前,表结构定义,包括系统内部元数据表,都从Schema文件中读取。0.4版本之后,通过SQL语句创建表结构(《OceanBase 0.4.2 SQL 参考指南》、《OceanBase 0.5 SQL 参考指南》)。
在开源的OceanBase 0.4版本(OB唯一开源版本)的RootServer代码中,是可以看到从文件中读取Schema配置的代码段,在src/rootserver/ob_root_server2.cpp:340: ()
else if (!local_schema_manager_->parse_from_file(config_.schema_filename, config))
{
TBSYS_LOG(ERROR, "parse schema error chema file is %s ", config_.schema_filename.str());
res = false;
}
其中,config_.schema_filename的默认值是”etc/schema.ini“,但,这个文件安装以后的内容很简单(源码构建时由src/rootserver/schema.ini拷贝至${prefix}/etc/schema.ini):
[app_name]
name=obtest # edit the app name when you deploy OceanBase for the first time
max_table_id=2000 # do not edit
说明,从0.4版本开始,至少应用的库表Schema结构定义不再从配置文件中读取,而是通过SQL来定义。
Schema配置文件格式
通过一个示例来大致了解Schema配置文件格式:
[app_name]
name=collect
max_table_id=1003
[collect_item_id]
table_id=1001
table_type=2
column_info=1,16,item_name,varchar,20
column_info=1,17,new_price,int
rowkey=item_name
rowkey_max_length=9
max_column_id=17
[collect_info]
table_id=1002
table_type=2
colume_info=1,16,uid,int
column_info=1,17,item_name,varchar,20
column_info=1,18,item_price,int
column_info=1,19,collect_time,create_time
rowkey=uid,item_name
join=[item_name$item_name]%collect_item_id:item_name$item_name,item_price$new_price
rowkey_max_length=17
max_column_id=19
应用的信息
[app_name]
name=collect
max_table_id=1003
应用的信息都写在 app_name 这个section 中. 目前主要有两个配置项:
- name 用来配置应用的名称, 是一个长度不超过128位的字符串.
- max_table_id 用来记录当前已经使用的最大的table_id.
在OceanBase中, 每个表都由table_id唯一标识, 且table_id不可以被重复使用. max_table_id 这个配置项, 主要是为了方便 schema 生成程序记录已经使用过的table_id.
代码入口: