日常运维
1. 增加或移除要同步的表
当我们需要增加要同步的表时,需要使用函数“cminer_dict_add_table()”增加需要同步的表,如下所示:
postgres=# select cminer_dict_add_table('postgres','public','test06');
cminer_dict_add_table
-----------------------
1
(1 row)
但是这时cminer的解码程序在内存缓存了表的字典数据,上面的设置不会马上生效,我们可以调用函数“cminer_invalid_dict_cache”让解码程序中缓存的表的字典数据失效,这时新增的表的数据就能解码出来:
postgres=# select cminer_invalid_dict_cache();
cminer_invalid_dict_cache
---------------------------
t
(1 row)
当然重启解码程序,也是可以让新增加的表生效。
移除同步的表可以用函数“cminer_dict_remove_table()”,如下所示:
postgres=# select cminer_dict_remove_table('postgres','public','test04');
cminer_dict_remove_table
--------------------------
t
(1 row)
如果这个表的字典信息已经缓存在解码程序中,解码程序仍然会对这张表解码,如果要停止这张表的解码,需要让解码程序中缓存的表的字典数据失效:
postgres=# select cminer_invalid_dict_cache();
cminer_invalid_dict_cache
---------------------------
t
(1 row)
2. DDL操作
表增加列,CMiner可以捕获增加的列,并自动更新cminer_pg_attribute表。所以不需要做任何工作。
当表删除列时,PG数据库只是在pg_attribute中把列标记成删除。这时解码出来的数据中仍然有这一列,但这一列为空。
以下DDL操作cminer会自动处理:
- 自动加字段
- 删除字段
- truncate table
表以下DDL操作需要知会cminer这边:
- 把要同步的表drop table;
- 把要同步的表改名;
- 把同步的表改列名;
- 修改字段类型或修改字段精度
- 对表做vacuum full操作
- 其他未知的类型,请咨询。
3. 对无主键表的解码方法
表cminer_pkdef:解码时对应的原库的表的主键以及oid信息,各列的解释如下:
- dboid:源库的数据库对应的oid。即可以在源库中查询pg_database中的oid字段得到,如: select oid,datname from pg_database;
- relid:需要解码的表对应的oid,可以查询源库的pg_class中的oid字段得到,如:selecct oid, relname from pg_class;
- attnum: 源库的数据库对应的解码表的字段id。起始为1。可以查询源库中的pg_attribute表中的attnum得到,如:select attname,attnum from pg_attribute where attrelid=XXX;其中“attrelid=XXX”是表的oid。
知道了上面的结构,如果表没有主键,当调用select cminer_build_dictionary()或select cminer_rebuild_dictionary()在上面的表中就不会生成相应表的配置,导致无法解码相应的表,但是我们可以手工在上面的表中插入相应表的数据之后,也是可以对指定的表完成解码的。
例如:
create table test01(id1 int, id2 int, t text);
表test01的oid为900000,表所在的数据库的oid为800000,而我们知道表test01的列id1+id2是唯一的,同时列id1的attnum为1,列id1的attnum为2,则我们可以这样:
insert into cminer_pkdef(dboid,relid,attnum) values(800000,900000,1);
insert into cminer_pkdef(dboid,relid,attnum) values(800000,900000,2);
然后在cminer中执行:
cminer_invalid_dict_cache();
做完这个之后,可以正常解码test01表了。
注意:
如果每次调用select cminer_build_dictionary()或select cminer_rebuild_dictionary()重建数据字典之后,表cminer_pkdef中的内容都会重建,前面我们手工插入的内容会消失,需要再次手工插入进入。
4. 特殊数字的注意
在PostgreSQL中numeric和float类型有“NaN”类型表示不是一个数字,float类型有“Infinity”和“-Infinity”表示正无穷大和负无穷大,而最终我们解码出的数据输出为json类型的数据,而标准的json并不支持这些特殊类型,所以CMiner会自动把这些特殊数据转成null放到json中,这需要注意。