PostgreSQLCDC数据增量抽取

本文介绍了如何使用 PostgreSQL CDC 客户端进行数据库复制,详细阐述了配置过程、数据库版本需求、先决条件、架构与表设置、初始更改处理,以及生成的记录格式。该客户端将事务视为单个记录,支持数据更改和 DDL 更新,适用于实时数据流处理。

PostgreSQL CDC 客户端

支持的管道类型:
  • 数据收集器

后绿 SQL CDC 客户端源处理预写日志记录 (WAL) 数据,以便为后绿SQL 数据库生成更改数据捕获记录。使用后格雷SQL CDC 客户端源处理来自后绿色SQL 9.4或更高版本的WAR数据。早期版本不支持 WAL。

您可以使用此源来执行数据库复制。您可以将单独的管道与 JDBC 查询使用者或 JDBC 多表使用者源结合使用,以读取现有数据。然后使用 PostgreSQL CDC 客户端源启动管道,以处理后续更改。

后greSQL CDC客户端将单个事务视为单个记录。它可以生成两种类型的记录:一种用于数据更改,另一种用于数据定义语言 (DDL) 更新。

由于每个数据更改事务可以包含多个 CRUD 操作,因此 PostgreSQL CDC 客户端源还可以在记录中包含多个操作。因此,源不会将 CRUD 操作写入 sdc.operation.type 记录标头属性。根据您的使用案例,您可以使用脚本处理器根据需要转换记录。或者,您可以使用字段透视器和其他处理器来分隔数据,以便为每个操作创建记录。

配置 PostgreSQL CDC 客户端时,可以配置更改捕获详细信息,例如要从中读取的架构和表、要使用的初始更改以及要包括的操作。

定义要使用的复制槽的名称,并指定是否在关闭时删除复制槽。您还可以指定当源遇到不受支持的数据类型时的行为,并将记录中这些字段的数据作为未解析的字符串包括在内。当源数据库具有高精度时间戳时,可以将源配置为写入字符串值而不是日期时间值以保持精度。

要确定源连接到数据库的方式,请指定连接信息、查询间隔、重试次数以及所需的任何定制 JDBC 配置属性。 您可以配置高级连接属性。要使用早于 4.0 的 JDBC 版本,请指定驱动程序类名并定义运行状况检查查询。

注意:连接到数据库的用户必须具有复制或超级用户角色。

数据库版本

流集已使用以下数据库版本测试了后格雷SQL CDC 客户端源:
  • PostgreSQL 9.4.18
  • PostgreSQL 9.6.2
  • PostgreSQL 9.6.9
  • PostgreSQL 10.4

连接到后地理数据库数据库时,不需要安装 JDBC 驱动程序。数据收集器包括后绿色SQL所需的JDBC驱动程序。

PostgreSQL 先决条件

若要使 PostgreSQL CDC 客户端源能够读取预写日志记录 (WAL) 更改的数据捕获信息,必须安装 wal2json 逻辑解码器。在每个被监视的 PostgreSQL 实例上安装 wal2json 以进行更改。

流集在 GitHub 上提供 wal2json 逻辑解码器。若要安装 wal2json,请按照 README.md 文件的“生成和安装”部分中的说明进行操作。

然后,按照 README.md 文件的“配置”部分中的配置说明进行操作。

架构、表名和排除模式

配置 PostgreSQL CDC 客户端源时,可以指定包含要处理的更改捕获数据的表。要指定表,请定义架构、表名模式和可选的排除模式。

定义架构和表名模式时,可以使用正则表达式跨多个架构定义一组表或一组表。需要时,还可以使用正则表达式定义排除模式,以从较大的集合中排除表的子集。

例如,假设您要处理销售架构中以 SALES 开头的所有表的变更数据捕获数据,同时排除以短划线 (-) 和单字符后缀结尾的表。可以使用以下配置来指定要处理的表:
  • 架构:销售
  • 表名模式: 销售*
  • 排除模式:销售。

初始更改

初始更改是预写日志记录 (WAL) 数据中要开始处理的点。启动管道时,PostgreSQL CDC 客户端将从指定的初始更改开始处理,并一直持续到您停止管道为止。

请注意,后greSQL CDC客户端进程仅更改捕获数据。如果需要现有数据,则可以在启动 PostgreSQL CDC 客户端管道之前,在单独的管道中使用 JDBC 查询使用者或 JDBC 多表使用者来读取表数据。

后greSQL CDC客户端提供了几种配置初始更改的方法:

从最新更改

源处理启动管道后发生的所有更改。

从指定的日期时间

源处理在指定日期时间及以后发生的所有更改。使用以下格式:日-月-年-HH24:米:秒

从指定的日志序列号 (LSN)

源处理在指定的 LSN 及更高版本中发生的所有更改。使用指定的 LSN 时,源开始处理与 LSN 关联的时间戳。如果在WAL数据中找不到LSN,则源继续从下一个可用的更高LSN读取。

通常,数据库管理员可以提供要使用的 LSN。

您希望处理销售架构中的所有现有数据,然后捕获更改的数据,将所有数据写入 Google 大表。为此,请创建两个管道。

要从模式中读取现有数据,请将管道与 JDBC 多表使用者和 Google 大表目标结合使用,如下所示:

读取所有现有数据后,停止 JDBC 多表使用者管道并启动以下 PostgreSQL CDC 客户端管道。此管道配置为选取启动管道后发生的更改,但如果要防止数据丢失的任何机会,则可以将初始更改配置为确切的日期时间或更早的 LSN:

生成的记录

后greSQL CDC客户端将单个事务视为单个记录。它可以生成两种类型的记录:一种用于数据更改,另一种用于数据定义语言 (DDL) 更新。

由于每个数据更改事务可以包含多个 CRUD 操作,因此 PostgreSQL CDC 客户端源还可以在记录中包含多个操作。

因此,源不会将 CRUD 操作写入 sdc.operation.type 记录标头属性。根据您的使用案例,您可以使用脚本处理器根据需要转换记录。或者,您可以使用字段透视器和其他处理器来分隔数据,以便为每个操作创建记录。

由 PostgreSQL CDC 客户端源生成的每条记录都包含相同的基本字段。数据更改的记录包括字段中的更改数据捕获详细信息。DDL 更改的记录(如插入新列)在字段中没有详细信息。changechange

后格雷SQL CDC客户端源记录包括以下字段:

字段名称描述: __________
西德交易标识。
下一个下一个逻辑序列号 (LSN)。
时间戳具有亚秒级粒度的时间戳,包括与 UTC 的时区偏移量。
改变一个列表字段,其中包含有关每个数据更改的以下详细信息:
  • kind - 操作类型:插入、更新或删除。
  • 架构 - 架构名称。
  • 表 - 表名。
  • 列名 - 与更改关联的列的列表。
  • 列类型 - 列的数据类型列表。
  • 列值 - 列的新值列表。
  • oldkeys - 包含已更改字段的先前信息的映射字段。包括以下字段:
    • 键名 - 列的名称列表。
    • 键类型 - 列的数据类型列表。
    • 键值 - 列的值列表。

DDL 更改记录不包含任何更改详细信息。

更改的数据示例记录

下面是已更改数据的示例记录。请注意,此单个 xid 如何包含六个操作:
<span style="color:#333333"><span style="background-color:#eeeeee"><code>{
  "xid": 598,
  "nextlsn": "0/16751E8",
  "timestamp": "2018-07-13 13:24:44.152109-07",
  "change": [
    {
     <strong> "kind": "update",</strong>
      "schema": "public",
      "table": "table1",
      "columnnames": [
        "id",
        "value"
      ],
      "columntypes": [
        "integer",
        "character(33)"
      ],
      "columnvalues": [
        1,
        "a"
      ],
      "oldkeys": {
        "keynames": [
          "value"
        ],
        "keytypes": [
          "character(33)"
        ],
        "keyvalues": [
          "a"
        ]
      }
    },
  {
      <strong>"kind": "update",</strong>
      "schema": "public",
      "table": "table1",
      "columnnames": [
        "id",
        "value"
      ],
      "columntypes": [
        "integer",
        "character(33)"
      ],
      "columnvalues": [
        2,
        "b                                "
      ],
      "oldkeys": {
        "keynames": [
          "value"
        ],
        "keytypes": [
          "character(33)"
        ],
        "keyvalues": [
          "b                                "
        ]
      }
    },
    {
      <strong>"kind": "update",</strong>
      "schema": "public",
      "table": "table1",
      "columnnames": [
        "id",
        "value"
      ],
      "columntypes": [
        "integer",
        "character(33)"
      ],
      "columnvalues": [
        3,
        "c                                "
      ],
      "oldkeys": {
        "keynames": [
          "value"
        ],
        "keytypes": [
          "character(33)"
        ],
        "keyvalues": [
          "c                                "
        ]
      }
    },
    {
     <strong> "kind": "update",</strong>
      "schema": "public",
      "table": "table2",
      "columnnames": [
        "id",
        "name"
      ],
      "columntypes": [
        "integer",
        "character varying(255)"
      ],
      "columnvalues": [
        1,
        "a"
      ],
      "oldkeys": {
        "keynames": [
          "id"
        ],
        "keytypes": [
          "integer"
        ],
        "keyvalues": [
          1
        ]
      }
    },
    {
      <strong>"kind": "update",
</strong>      "schema": "public",
      "table": "table2",
      "columnnames": [
        "id",
        "name"
      ],
      "columntypes": [
        "integer",
        "character varying(255)"
      ],
      "columnvalues": [
        2,
        "b"
      ],
      "oldkeys": {
        "keynames": [
          "id"
        ],
        "keytypes": [
          "integer"
        ],
        "keyvalues": [
          2
        ]
      }
    },
    {
      <strong>"kind": "update",</strong>
      "schema": "public",
      "table": "table2",
      "columnnames": [
        "id",
        "name"
      ],
      "columntypes": [
        "integer",
        "character varying(255)"
      ],
      "columnvalues": [
        3,
        "c"
      ],
      "oldkeys": {
        "keynames": [
          "id"
        ],
        "keytypes": [
          "integer"
        ],
        "keyvalues": [
          3
        ]
      }
    }
  ]
}
</code></span></span>

示例记录

下面是 DDL 更改的示例记录。请注意,此记录不包含字段中的详细信息: change
<span style="color:#333333"><span style="background-color:#eeeeee"><code>{
  "xid":600,
  "nextlsn":"0/16794A8",
  "timestamp":"2018-07-17 09:56:08.115141-07",
  "change":[]
}</code></span></span>

CDC 标头属性

后绿 SQL CDC 客户端在以下记录标头属性中包含后绿 SQL 更改数据捕获信息:
CDC 标头属性描述: __________
postgres.cdc.lsn此记录的逻辑序列号。
后格里斯交易标识。
postgres.cdc.timestamp交易时间戳。

配置后显式SQL CDC 客户端源

配置后格雷SQL CDC客户端源以处理来自后格雷SQL数据库的WAR更改数据捕获数据。

使用源之前,请完成前提条件任务

  1. 在“属性”面板的“常规”选项卡上,配置以下属性:
    一般财产描述: __________
    名字艺名。
    描述: __________可选说明。
    记录错误阶段的错误记录处理:
    • 丢弃 - 丢弃记录。
    • 发送到错误 - 将记录发送到管道以进行错误处理。
    • 停止管道 - 停止管道。
  2. “后灰色SQL CDC”选项卡上,配置以下属性:
    PostgreSQL CDC 化学性质描述: __________
    要跟踪的表。根据需要指定相关属性。

    使用简单或批量编辑模式,单击添加图标以定义其他表配置。

    图式要使用的架构。您可以输入架构名称或使用正则表达式来指定一组架构。
    表名模式指定要跟踪的表的表名称模式。您可以输入表名或使用正则表达式来指定一组表。
    排除模式一种可选的表排除模式,用于定义要排除的表的子集。您可以输入表名或使用正则表达式指定要排除的表的子集。
    初始更改读取的起点。使用以下选项之一:
    • 从最新更改 - 处理启动管道后到达的更改。
    • 从日期开始 - 处理从指定日期开始的更改。
    • 从 LSN - 处理从指定的日志序列号开始的更改。
    开始日期启动管道时要读取的日期时间。

    使用以下格式:日-月-年-HH24:米:秒

    For a date-based initial change only.

    DB Time ZoneTime zone of the database. For a date-based initial change only.
    启动液化硅橡胶启动管道时要从中开始读取的日志序列号。如果找不到 LSN,则源继续从下一个可用的更高 LSN 读取。

    仅适用于基于 LSN 的初始更改。

    关闭时删除复制槽每次使用后删除复制槽。保留复制槽会导致此槽继续生成 WAL 记录,但可能会导致性能下降。
    注意:此选项在 9.5 之前的 PostgreSQL 版本中不受支持。早期版本的 PostgreSQL 不包含所需的功能。
    复制槽复制槽的名称。仅包含小写字母和数字。

    默认值为 。sdc

    操作要包括的操作。
    添加不受支持的字段包括记录中数据类型不受支持的字段。启用后,源将添加字段名称,并将数据作为未解析的字符串传递。
    将时间戳转换为字符串使源能够将时间戳写入字符串值,而不是日期时间值。字符串保持存储在源数据库中的精度。

    将时间戳写入不存储纳秒的数据收集器日期或时间数据类型时,源将时间戳的任何纳秒存储在字段属性中。

    查询超时在终止 WAL 查询并返回批处理之前等待的时间。

    默认值为 300 秒。${ 5 * MINUTES }

    轮询间隔检查更新之间的间隔。
  3. “JDBC”选项卡上,配置以下 JDBC 属性:
    京东财经地产描述: __________
    JDBC 连接字符串

    用于连接到数据库的连接字符串。使用以下语法:

    <span style="color:#333333"><code>jdbc:postgresql://<host>:<port>/<dbname></code></span>
    注意:如果在连接字符串中包含 JDBC 凭据,请使用为源创建的用户帐户。该用户必须具有超级用户或复制角色。
    最大批大小(记录)一次处理的最大记录数。接受的值最高可达数据收集器最大批大小。

    默认值为 1000。数据收集器默认值为 1000。

    使用凭据允许在“凭据”选项卡上输入凭据。在 JDBC 连接字符串中不包含凭据时使用。
    其他 JDBC 配置属性要使用的其他 JDBC 配置属性。要添加属性,请单击添加并定义 JDBC 属性名称和值。

    按照 JDBC 的预期使用属性名称和值。

  4. 要将 JDBC 凭证与 JDBC 连接字符串分开输入,请在凭证选项卡上配置以下属性:
    凭据属性描述: __________
    用户名JDBC 连接的用户名。

    指定的用户必须具有超级用户或复制角色。

    密码JDBC 帐户的密码。
    提示: 要保护用户名和密码等敏感信息,可以使用 运行时资源凭证存储。
  5. 使用早于 4.0 的 JDBC 版本时,在“旧版驱动程序”选项卡上,可以选择配置以下属性:
    旧驱动程序属性描述: __________
    JDBC 类驱动程序名称JDBC 驱动程序的类名。对于早于 4.0 版的 JDBC 版本是必需的。
    连接运行状况测试查询用于测试连接运行状况的可选查询。仅当 JDBC 版本早于 4.0 时才建议使用。
  6. 在“高级”选项卡上,可以选择配置高级选项。
    在大多数情况下,这些属性的默认值应该有效:
    高级属性描述: __________
    最大池大小要创建的最大连接数。

    默认值为 1。建议的值为 1。

    最小空闲连接数要创建和维护的最小连接数。若要定义固定连接池,请设置为与“最大池大小”相同的值。

    默认值为 1。

    连接超时等待连接的最长时间。在表达式中使用时间常量来定义时间增量。
    默认值为 30 秒,定义如下:
    <span style="color:#333333"><code>${30 * SECONDS}</code></span>
    空闲超时允许连接空闲的最长时间。在表达式中使用时间常量来定义时间增量。

    使用 0 可避免删除任何空闲连接。

    当输入的值接近或大于连接的最长生存期时,数据收集器将忽略空闲超时。

    默认值为 10 分钟,定义如下:
    <span style="color:#333333"><code>${10 * MINUTES}</code></span>
    最大连接寿命连接的最长生存期。在表达式中使用时间常量来定义时间增量。

    使用 0 不设置最大生存期。

    设置最大生存期后,最小有效值为 30 分钟。

    默认值为 30 分钟,定义如下:
    <span style="color:#333333"><code>${30 * MINUTES}</code></span>
    强制实施只读连接创建只读连接以避免任何类型的写入。

    默认值为启用。不建议禁用此属性。

    事务隔离用于连接到数据库的事务隔离级别。

    默认值是为数据库设置的默认事务隔离级别。您可以通过将级别设置为以下任一值来覆盖数据库缺省值:

    • 已阅读已提交
    • 读取未提交
    • 可重复读取
    • 序列 化
    初始化查询要在阶段连接到数据库后立即执行的 SQL 查询。用于根据需要设置数据库会话。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVASoftEngineer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值