TcaplusDB OMS控制台 - 修改表
1. 功能说明
表添加后,可选择变更。
改表/表重建注意事项:
服务端改表完成后,需要更新客户端的表结构(TDR表、PB表的表结构需要重新生成,重启客户端链接)
如果不重启客户端链接,tdr表可以在运行过程中,调用RegistTable切换表meta,用新的tdr结构读写,业务要自行保证表变更的兼容性(tdr表作个动态库,变更了表结构后,重新编译生成,然后动态加载)
2. 操作步骤
业务维护--表管理--选择需要变更的表,可单张表变更,也可多个表变更
进入变更表页面,上传新的表定义文件,或者选择已上传的表定义进行变更
3. 注意事项
PB表变更
(1)主键字段不能删除。
(2)主键字段名和字段类型不能改变。
(3)不能增加主键字段。
(4)普通字段有 required 标识的不能删除。
(5)同标识号的字段名称和字段类型不能改变。
(6)增加的普通字段名要符合命名规则 。
TDR表变更
(1)一个表内不允许有重复的字段名。要求Key字段名无重名,Value字段名无重名,Value字段名和Key字段名无重名。
(2)tdr meta定义中primarykey的值(即Key字段名)必须属于存在的字段名,splittablekey的值必须属于存在的primarykey的值(即Key字段名)。注意:primarykey定义的就是Key字段。
(3)不允许删除Key字段,不允许添加Key字段,不允许更改Key字段类型。Key字段长度不允许改变。不允许给Key字段配置默认值。
(4)允许添加Value字段,允许更改Value字段默认值,不允许删除Value字段,不允许更改Value字段类型,Value字段最大长度允许加长不允许缩短,允许更改Value字段默认值但默认值实际长度不能超过该Value字段的最大长度。
(5)Index字段必须属于存在的Key字段名,Index字段中必须包含splittablekey所指定的字段,并且Index字段必须全部属于primarykey。
(6)Index字段中不允许有重复的字段名,Index字段的column属性长度不能超过120个字节
(7)List类型表不允许配置Index字段。
(8)List类型表的LIST最多元素个数允许被改大不允许被改小,同时List类型表的LIST最多元素个数不能超过10000个。
(9)Index的数量及Index所包括的字段名均不允许变更。
(10)修改“LIST最多元素个数”需要表所在的tcapsvrs版本均高于3.13.0.115217。
(11)现有的TDR限制: Key字段名不允许变更、Value字段名不允许变更。
(12)如果新增字段定义了count没定义refer的字段,不允许通过变更
(13)tcaplus表的entry字段个数上限是256个, 到达110个的时候会有warning提示, list类型表value个数上限需减1
(14)关于tdr表变更(新增列),使用旧版本tdr信息的业务实例读取后再更新写入的情况:
a.如果表增加了一个新的一级字段Data1,那在服务端会Merge;即client1写入Data和Data1字段,client2还是老的表结构,只认识Data字段,只更新Data字段,在Tcaplus服务端会将本次更新的Data和Data1进行Merge,一级字段是会保留高版本的数据的。 b.如果表在Data字段增加了一个新的二级字段Data1,那么对Data字段的修改会相互覆盖, 原因是目前二级字段Tcaplus没有解析,直接用客户端的结果覆盖了。 c.对于pb表来说,如是全记录更新,则是整条记录覆盖;如果是部分字段更新,则只更新指定的字段,其它字段值不变,但整体记录version会加1
4.表变更兼容性说明
TcaplusDB允许用户在线进行表变更操作,此时可能存在新老客户端,同时读写数据的问题,这里需要考虑数据读写的兼容性
对于TDR表
(1)如果添加了一级字段:新客户端写入了这个一级字段,老客户端不会读到,Tcapsvr会保留;老客户端写入不带这个一级字段,Tcapsvr不会删除已存储的新一级字段,保留
(2)如果修改了一级字段:由于key和value字段都不能修改数据类型,故只存在一级字段数组变长这个场景,如果老客户端读到新客户端写的超长数组,老客户端会根据本地数组大小,做截断处理
(3)如果修改了嵌套字段,一级字段没动:新老客户端,对相同的记录进行读写,由于Tcapsvr存储是按一级字段编码的,一级字段的内容会相互覆盖,用户读取数据的兼容性依赖于TDR的解包兼容性(tdr高版本的meta可以解低版本的数据,低版本的meta解高版本的数据可能会错乱)
对于PB表
由于pb的更新是将整个message打包为value后写入,后端写入的就是用户整个message打包后的内容,新老客户端同时更新这条记录时:
(1)高版本客户端写入的数据, 低版本客户端unpack到的msg,新增的字段会被protobuf保留到unknown fields里,低版本客户端再set到tcaplus时,如果不主动清理unkown fields,则新的数据会保留,发送到服务端直接存储, 从客户层面看表现为合并语义。
(2)高版本客户端写入的数据, 低版本客户端unpack到的msg, 主动清理unkown fields,或被用户从msg中拷贝字段给另一个新msg ,最后将新msg写到tcaplus时,新增的字段是不存在的,从客户层面看表现为覆盖语义
5. 相关文档
用户除了通过OMS控制台修改表之外,还可以通过调用WebService API修改表,WebService API主要用于需要通过代码进行自动修改表的场景。