云数据库 RDS-RDS for PostgreSQL发布与订阅:发布使用限制

时间:2024-05-31 17:29:18

发布使用限制

  • 发布目前只能包含表(即:索引,序列号,物化视图这些不会被发布),每个表可以添加到多个发布中。
  • 一个publication允许有多个订阅者。
  • 允许使用all tables发布所有表。
  • 在同一个数据库中,可以创建多个publication,但是不能重名。已创建的publication可以通过查询pg_publication获取。
  • 发布可以筛选所需的变更类型:包括insert、update、delete 和truncate的任意组合,类似触发器事件,默认所有变更都会被发布。

    例如:发布表t1的updatedelete操作。

    CREATE PUBLICATION update_delete_only FOR TABLE t1
        WITH (publish = 'update, delete') ;
  • 复制标识:当发布了表的update, delete时,表必须设置复制标识(Replica Identity),如果设置了nothing,则执行update, delete时会报错。

    表上的复制标识可以通过查阅pg_class.relreplident获取。

    这是一个字符类型的“枚举”,标识用于组装 “复制标识” 的列:d = default ,f = 所有的列,i 使用特定的索引,n 没有复制标识。

    表上是否具有可用作复制标识的索引约束,可以通过以下查询获取:

    SELECT quote_ident(nspname) || '.' || quote_ident(relname) AS name, con.ri AS keys,
           CASE relreplident WHEN 'd' THEN 'default' WHEN 'n' THEN 'nothing' WHEN 'f' THEN 'full' WHEN 'i' THEN 'index' END AS replica_identity
    FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid, LATERAL (SELECT array_agg(contype) AS ri FROM pg_constraint WHERE conrelid = c.oid) con
    WHERE relkind = 'r' AND nspname NOT IN ('pg_catalog', 'information_schema', 'monitor', 'repack', 'pg_toast')
    ORDER BY 2,3;
  • 复制标识配置

    表到复制标识可以通过ALTER TABLE进行修改。

    ALTER TABLE table_name REPLICA IDENTITY 
    { DEFAULT | USING INDEX index_name | FULL | NOTHING };
    -- 具体有四种形式
    ALTER TABLE t_normal REPLICA IDENTITY DEFAULT;                    -- 使用主键,如果没有主键则为FULL
    ALTER TABLE t_normal REPLICA IDENTITY FULL;                       -- 使用整行作为标识
    ALTER TABLE t_normal REPLICA IDENTITY USING INDEX t_normal_v_key; -- 使用唯一索引
    ALTER TABLE t_normal REPLICA IDENTITY NOTHING;                    -- 不设置复制标识
  • 复制标识在实际使用中的注意事项
    • 表上有主键,使用默认的default复制标识。
    • 表上没有主键,但是有非空唯一索引,显式配置index复制标识。
    • 表上既没有主键,也没有非空唯一索引,显式配置full复制标识(运行效率非常低,仅能作为兜底方案)。
    • 其他所有情况,都无法正常完成逻辑复制功能。输出的信息不足,可能会报错。
    • 特别需要注意:如果nothing复制标识的表纳入到逻辑复制中,对其进行删改会导致发布端报错。
support.huaweicloud.com/bestpractice-rds/rds_pg_04_0008.html