3.3. 删除数据库中的记录并查看 删除 事件
现在,您已经了解了 Debezium MySQL 连接器如何捕获 清单 数据库中的 创建和更新 事件,现在您将删除其中一个记录并查看连接器如何捕获它。
完成这个步骤,您将了解如何查找有关 删除 事件的详情,以及 Kafka 如何使用 日志压缩 来减少 删除 事件的数量,同时仍然可让用户获取所有事件。
流程
在运行 MySQL 命令行客户端的终端中,运行以下声明:
mysql> DELETE FROM customers WHERE id=1004; Query OK, 1 row affected (0.00 sec)注意如果上述命令失败并显示外键约束违规,则必须使用以下声明从地址表中删除 对客户地址 的引用:
mysql> DELETE FROM addresses WHERE customer_id=1004;切换到运行
kafka-console-consumer的终端,以查看 两个新 事件。通过删除
客户表中的行,Debezium MySQL 连接器会生成两个新事件。查看第一个新事件的键和值。
以下是第一个新事件 的密钥 的详细信息(为可读性而格式化):
{ "schema": { "type": "struct", "name": "dbserver1.inventory.customers.Key" "optional": false, "fields": [ { "field": "id", "type": "int32", "optional": false } ] }, "payload": { "id": 1004 } }这个密钥 与您在前两个事件中的 键 相同。
以下是第一个 新事件的值 (为可读性而格式化):
{ "schema": {...}, "payload": { "before": {1 "id": 1004, "first_name": "Anne Marie", "last_name": "Kretchmar", "email": "annek@noanswer.org" }, "after": null,2 "source": {3 "name": "1.9.7.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": 14865015583155 } }因此,此事件向消费者提供处理行删除所需的信息。也提供了旧值,因为某些消费者可能需要它们正确处理删除操作。
检查第二个新事件的键和值。
以下是第二个新事件 的密钥 (格式化以便于阅读):
{ "schema": { "type": "struct", "name": "dbserver1.inventory.customers.Key" "optional": false, "fields": [ { "field": "id", "type": "int32", "optional": false } ] }, "payload": { "id": 1004 } }再次,此密钥 与您在前面三个事件中的键完全相同。
以下是同一事件 的值 (为可读性而格式化):
{ "schema": null, "payload": null }如果将 Kafka 设置为 紧凑,它将从主题中删除旧的信息,如果后面的主题中至少有一个相同的键的消息。最后一个事件称为 tombstone 事件,因为它有一个 key 和 empty 值。这意味着 Kafka 将删除所有具有相同密钥的消息。尽管会删除之前的消息,但 tombstone 事件意味着消费者仍然可以从一开始读取主题,而不会错过任何事件。