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


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

通过完成此步骤,您将了解如何查找 删除 事件的详情,以及 Kafka 如何使用 日志压缩 来减少 删除 事件的数量,同时仍使消费者获得所有事件。

流程

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

    mysql> DELETE FROM customers WHERE id=1004;
    Query OK, 1 row affected (0.00 sec)
    Copy to Clipboard Toggle word wrap
    注意

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

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

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

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

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

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

    这个 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": "2.1.4.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
    
      }
    }
    Copy to Clipboard Toggle word wrap
    1
    before 字段现在具有通过数据库提交删除的行的状态。
    2
    after 字段为 null,因为行不再存在。
    3
    source 字段结构具有许多与以前相同的值,但 ts_secpos 字段已更改(在其他情况下 文件 可能已经改变)。
    4
    op 字段值现在是 d,表示此行已被删除。
    5
    ts_ms 字段显示 Debezium 处理此事件的时间戳。

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

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

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

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

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

    以下是同一事件 的值 (用于可读性的格式):

    {
      "schema": null,
      "payload": null
    }
    Copy to Clipboard Toggle word wrap

    如果将 Kafka 设置为 日志紧凑,它将从主题中删除旧的消息,如果主题中至少有一个消息有相同的键。此最后一个事件称为 tombstone 事件,因为它有一个键和一个空值。这意味着 Kafka 将使用相同的键删除所有之前的信息。尽管会删除上述消息,但 tombstone 事件意味着用户仍然可以从开始而不是丢失任何事件读取该主题。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat