4.3. 删除数据库中的记录并查看 删除 事件


现在,您已了解 Debezium MySQL 连接器如何捕获 inventory 数据库中的 createupdate 事件,现在您可以删除其中一个记录以查看连接器如何捕获它。

通过完成此步骤,您将了解如何找到有关 删除 事件的详细信息,以及 Kafka 如何使用 日志压缩 来减少 删除 事件的数量,同时仍允许用户获取所有事件。

流程

  1. 在运行 MySQL 命令行客户端的终端中,运行以下语句:

    mysql> DELETE FROM customers WHERE id=1004;
    Query OK, 1 row affected (0.00 sec)
    注意

    如果上述命令失败并显示外键约束违反情况,则必须使用以下声明从 addresses 表中删除客户地址的引用:

    mysql> DELETE FROM addresses WHERE customer_id=1004;
  2. 切换到运行 kafka-console-consumer 的终端,以查看 两个新 事件。

    通过删除 customers 表中的行,Debezium MySQL 连接器会生成两个新事件。

  3. 对第一个新时间检查 keyvalue

    以下是第一个新事件 的密钥 详情(针对可读性格式化):

    {
      "schema": {
        "type": "struct",
        "name": "dbserver1.inventory.customers.Key",
        "optional": false,
        "fields": [
          {
            "field": "id",
            "type": "int32",
            "optional": false
          }
        ]
      },
      "payload": {
        "id": 1004
      }
    }

    这个 key 与在前两个事件中的 key 相同。

    以下是第一个新事件 的值 (针对可读性格式化):

    {
      "schema": {...},
      "payload": {
        "before": {  
    1
    
          "id": 1004,
          "first_name": "Anne Marie",
          "last_name": "Kretchmar",
          "email": "annek@noanswer.org"
        },
        "after": null,  
    2
    
        "source": {  
    3
    
          "name": "3.0.8.Final",
          "name": "dbserver1",
          "server_id": 223344,
          "ts_sec": 1486501558,
          "gtid": null,
          "file": "mysql-bin.000003",
          "pos": 725,
          "row": 0,
          "snapshot": null,
          "thread": 3,
          "db": "inventory",
          "table": "customers"
        },
        "op": "d",  
    4
    
        "ts_ms": 1486501558315,  
    5
    
        "ts_us": 1486501558315901,  
    6
    
        "ts_ns": 1486501558315901687  
    7
    
      }
    }
    Expand
    表 4.2. 事件值中的字段描述
    描述

    1

    before 字段现在具有与数据库提交删除的行状态。

    2

    after 字段为 null,因为行不再存在。

    3

    source 字段结构有许多与以前相同的值,但 ts_secpos 字段的值已改变。在某些情况下,file 值也可能改变。

    4

    现在,他 op field 值是 d,表示该记录已被删除。

    5

    ts_msts_usts_ns 字段显示时间戳来指示 Debezium 处理事件的时间。

    因此,此事件提供了一个消费者,其中包含处理删除行所需的信息。也提供了旧值,因为有些用户可能需要它们才能正确处理删除。

  4. 为第二个新时间检查 keyvalue

    以下是第二个新事件 的密钥 (针对可读性格式化):

      {
        "schema": {
          "type": "struct",
          "name": "dbserver1.inventory.customers.Key"
          "optional": false,
          "fields": [
            {
              "field": "id",
              "type": "int32",
              "optional": false
            }
          ]
        },
        "payload": {
          "id": 1004
        }
      }

    同样,这个 key 与前三个事件的键完全相同。

    以下是同一事件 的值 (针对可读性格式化):

    {
      "schema": null,
      "payload": null
    }

    如果将 Kafka 设置为 日志紧凑,如果稍后在同一键的主题中至少有一个消息,它将从主题中删除旧的信息。最后一个事件称为 tombstone 事件,因为它有一个键和一个空值。这意味着 Kafka 将删除具有相同键的所有之前信息。虽然删除了前面的信息,tombstone 事件表示用户仍然可以从开始读取主题,而不会丢失任何事件。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部