恢复备份和快照
从备份或快照恢复 Neo4j 数据库可能会导致 **CDC 应用程序中的数据丢失和数据损坏**。以下部分概述了在使用 CDC 并打算恢复数据库备份时可能会遇到的问题,以及如何缓解这些问题。
意外更改事件
从之前的快照恢复 Neo4j 数据库时,自快照创建以来的更改会在数据库中恢复。没有让 CDC 客户端应用程序知道这些更改“从未发生”的过程。实际上,您的 CDC 客户端应用程序期望某些更改已发生,尽管根据您的 Neo4j 数据库,它们“从未发生”。
一些有问题的场景示例是
-
实体“第二次”创建
在快照和还原操作之间创建的节点/关系存在于您的 CDC 应用程序中,但不存在于 Neo4j 数据库中。如果节点/关系在您的 Neo4j 数据库中(重新)创建,您的 CDC 应用程序会看到重复的节点/关系。 -
“丢失”的实体
在快照和还原操作之间删除的节点/关系 *不存在* 于您的 CDC 应用程序中,但 *存在* 于 Neo4j 数据库中(再次)。如果更新了节点/关系,您的 CDC 应用程序会看到对先前删除的实体的更新。 -
属性不同步
属性上的更改可能已在还原操作中回滚。例如,您 Neo4j 数据库中的Movie
节点可能具有 5 星评级,而您的 CDC 应用程序看到的最新更改将评级从 5 星更改为 3 星。
如果您的 CDC 应用程序依赖于内部状态,您可能需要恢复 CDC 应用程序的状态,就好像它正在使用具有现有数据的全新数据库一样。有关此过程的详细信息,请参阅 从现有数据库初始化 CDC 应用程序.
更改事件丢失
Neo4j 还原过程会将现有数据库替换为 **全新** 的数据库。此数据库具有新的事务日志,并且从旧事务日志生成的任何更改标识符(游标)都无法与新数据库一起使用。此外,请确保还原的数据库的事务日志保留设置与现有数据库的设置相匹配。
以下步骤概述了如何缓解此问题。
-
将数据库设置为只读模式。
-
记下数据库的 CDC 模式。
-
验证您的 CDC 应用程序是否已赶上并已使用数据库中的所有更改。
-
停止您的 CDC 应用程序。
-
从备份恢复数据库。
-
将还原的数据库设置为只读模式。
-
确保还原的数据库具有与现有数据库相同的 CDC 模式值。
-
重新启动您的 CDC 应用程序,使用
db.cdc.earliest
作为起始更改标识符。 -
启用对还原的数据库的写入。
-
验证更改是否由您的 CDC 应用程序使用。
不一致的 elementIds
db.cdc.query
返回的 elementIds 不保证在更改数据库的操作中保持稳定。还原备份后,对现有元素的新更改将在新的 elementId 下发布。
您应该使用逻辑/业务键来识别元素,而不是 elementId,请参阅 elementIds 和关键属性的作用.