首页
解决方案
数据库专业技术服务全栈式PostgreSQL解决方案Oracle分布式存储化数据库云PolarDB一体化解决方案
产品
CLup:PostgreSQL高可用集群平台 CMiner: PostgreSQL中的CDC CData高性能数据库云一体机 CBackup数据库备份恢复云平台 CPDA高性能双子星数据库机 CSYun超融合虚拟机产品 ZQPool数据库连接池 ConshGuard数据保护产品
文档
文章
客户及伙伴
中启开源
关于我们
公司简介 联系我们
中启开源
修改标题
往前插入
往后插入
删除

日常运维

1. 增加或移除要同步的表

当我们需要增加要同步的表时,需要使用函数“cminer_dict_add_table()”增加需要同步的表,如下所示:

  1. postgres=# select cminer_dict_add_table('postgres','public','test06');
  2. cminer_dict_add_table
  3. -----------------------
  4. 1
  5. (1 row)

但是这时cminer的解码程序在内存缓存了表的字典数据,上面的设置不会马上生效,我们可以调用函数“cminer_invalid_dict_cache”让解码程序中缓存的表的字典数据失效,这时新增的表的数据就能解码出来:

  1. postgres=# select cminer_invalid_dict_cache();
  2. cminer_invalid_dict_cache
  3. ---------------------------
  4. t
  5. (1 row)

当然重启解码程序,也是可以让新增加的表生效。

移除同步的表可以用函数“cminer_dict_remove_table()”,如下所示:

  1. postgres=# select cminer_dict_remove_table('postgres','public','test04');
  2. cminer_dict_remove_table
  3. --------------------------
  4. t
  5. (1 row)

如果这个表的字典信息已经缓存在解码程序中,解码程序仍然会对这张表解码,如果要停止这张表的解码,需要让解码程序中缓存的表的字典数据失效:

  1. postgres=# select cminer_invalid_dict_cache();
  2. cminer_invalid_dict_cache
  3. ---------------------------
  4. t
  5. (1 row)

2. DDL操作

表增加列,CMiner可以捕获增加的列,并自动更新cminer_pg_attribute表。所以不需要做任何工作。

当表删除列时,PG数据库只是在pg_attribute中把列标记成删除。这时解码出来的数据中仍然有这一列,但这一列为空。

以下DDL操作cminer会自动处理:

  1. 自动加字段
  2. 删除字段
  3. truncate table

表以下DDL操作需要知会cminer这边:

  1. 把要同步的表drop table;
  2. 把要同步的表改名;
  3. 把同步的表改列名;
  4. 修改字段类型或修改字段精度
  5. 对表做vacuum full操作
  6. 其他未知的类型,请咨询。

3. 对无主键表的解码方法

表cminer_pkdef:解码时对应的原库的表的主键以及oid信息,各列的解释如下:

知道了上面的结构,如果表没有主键,当调用select cminer_build_dictionary()或select cminer_rebuild_dictionary()在上面的表中就不会生成相应表的配置,导致无法解码相应的表,但是我们可以手工在上面的表中插入相应表的数据之后,也是可以对指定的表完成解码的。

例如:

  1. create table test01(id1 int, id2 int, t text);

表test01的oid为900000,表所在的数据库的oid为800000,而我们知道表test01的列id1+id2是唯一的,同时列id1的attnum为1,列id1的attnum为2,则我们可以这样:

  1. insert into cminer_pkdef(dboid,relid,attnum) values(800000,900000,1);
  2. insert into cminer_pkdef(dboid,relid,attnum) values(800000,900000,2);

然后在cminer中执行:

  1. 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中,这需要注意。

目录
img