Docs 菜单
Docs 主页
/ /
Atlas App Services
/ /

同步错误

在此页面上

  • 概述
  • 同步协议错误
  • Flexible Sync 错误
  • MongoDB 转换器错误
  • MongoDB 连接错误
  • 同步客户端错误
  • 处理同步错误
  • 设置客户端日志级别

当使用 Atlas Device Sync 开发应用程序时,您可能会遇到错误。此部分列出了常见的同步错误,并描述了如何处理这些错误。

注意

如果您遇到此页面未列出的错误,您可以提交支持票证

下表描述了 Device Sync 协议错误以及如何处理这些错误。Atlas App Services 在 Device Sync 日志中报告错误。

错误名称
说明
ErrorBadClientFileIdent

终止并重新启用 Device Sync 后,如果服务器无法访问客户端使用的 Realm 文件,则会出现该错误。

该错误触发客户端重置。要从该错误中恢复,请执行客户端重置

ErrorClientFileUserMismatch

该错误表明,客户端尝试同步与指定用户以外的身份关联的 Realm 文件。如果在用户离线时终止并重新启用了 Device Sync,这会使他们以前的身份失效,则可能会出现该错误。

要从该错误中恢复,请删除本地 Realm 文件,然后重新打开 Realm。

ErrorDivergingHistories

该错误表明,客户端尝试同步具有与服务器 Realm 不同的同步历史记录的 Realm 文件。如果在用户离线时终止并重新启用了 Device Sync,这会使他们以前的同步历史记录失效,则可能会出现该错误。

该错误触发客户端重置。要从该错误中恢复,请执行客户端重置

ErrorPermissionDenied

当用户的数据访问权限不足以完成特定请求时,就会出现此错误。如果用户尝试在没有读取权限的情况下打开 Realm,或在没有写入权限的情况下修改数据,就可能会发生这种情况。

要排除此错误,请查看您的规则,确保用户拥有适当的数据访问权限。

ErrorOtherError
此错误表示不属于任何更具体错误的内部故障。例如,当达到免费套餐 Atlas 集群的存储限制时,就可能出现此错误。

在应用使用 Flexible Sync 时,可能会出现以下错误。

错误名称
说明
ErrorBadQuery

该错误表示客户端查询无效或格式不正确。该错误包含一条信息,此消息会详细说明查询无效的原因。

要从该错误中恢复,您可能需要确认查询语法正确无误,并且使用的是服务器上支持的查询操作符。此外,确认您查询的是 Flexible Sync 配置中的可查询字段。如果您的查询使用索引可查询字段,请确保该查询满足索引可查询字段的有效客户端查询要求

LimitsExceeded

此错误表明正在使用的查询已超过256 kB 的大小限制。

要从此错误中恢复,请重新构造查询,确保查询中的数据不超过可接受的大小限制。

ErrorServerPermissionsChanged

此错误表示身份文件的服务器权限自上次使用以来已发生改变。

该错误触发客户端重置。要从该错误中恢复,请执行客户端重置

ErrorInitialSyncNotCompleted

该错误表示,客户端试图在初始同步尚未完成时打开会话。当应用刚刚启用同步,并且仍在构建同步历史记录的过程中时,可能会发生这种情况。

客户端尝试重新连接,直到此过程完成。然后,该错误得到解决,同步功能开始正常工作。

ErrorCompensatingWrite

当客户尝试“非法”写入时,会发生这种非致命错误。以下操作被视为非法写入:

  • 在打开订阅之前创建对象。

  • 创建一个在客户端查询视图之外的对象。“查询视图”既包括客户端的订阅,也包括客户端的读取权限。

  • 修改客户端的查询视图之外的对象。

  • 创建、删除或修改客户端没有写入权限的对象或字段。

  • 以某种方式修改对象,使得在该写入操作之后,客户端不再对该对象或字段拥有写入权限。

  • 更新现有对象的索引可查询字段值。

因为本地 Realm 没有“非法”写入的概念,所以本地写入总是会成功。同步时,服务器会注意到非法写入。服务器随即撤销更改。撤销操作(称为“补偿写入”)会同步回客户端,使得客户端 Realm 不再存在非法写入。服务器也会发送该错误,让客户端知道发生了什么。

在对给定对象的非法写入和相应的补偿写入之间,对该对象的任何本地写入都会丢失。

例子

请考虑以下伪代码示例:

obj1.fieldA = 10 // illegal due to field-level permissions
obj1.fieldB = 5 // legal
DELETE obj1 // legal
DELETE obj2 // legal

此处,用户没有写入到 fieldA 的权限,但仍然尝试进行写入 — 这是非法 写入。然后,用户对同一对象执行两次合法 写入,并对另一对象执行另一次合法写入。在收到对 obj1.fieldA 的非法写入的补偿写入后,对该对象的后续两次合法写入将会丢失。最终结果是,obj1 仍然存在,并且它的两个字段值是尝试的修改之前的值。同时,删除 obj2 与导致补偿写入的非法写入无关,因此,该删除操作不受影响并删除 obj2。

非法写入在应用日志中显示为非致命错误。非法写入可能表示应用程序代码执行您无意执行的操作。

在以下情况下,在进行“非法”写入后,您将看到 ErrorWriteNotAllowed 而不是 ErrorCompensatingWrite

  • 在使用链接到 realm-core 12.1.0 之前的 realm-core 版本的较旧 SDK 版本时。在这种情况下,服务器不会撤销非法写入,并且您需要执行手动客户端重置

  • 在启用了数据导入情况下修改集合中的对象时。在这种情况下,错误不是致命的,不会触发客户端重置。服务器跳过非法更改,而不会将其应用于同步的 MongoDB 集群。

在 Device Sync 和 MongoDB Atlas 之间的转换过程中可能会出现以下错误。

错误名称
说明
MaxIntegrationAttempts

当 MongoDB 转换器无法集成变更集时,它会重试固定次数。当转换器达到最大重试次数且无法提交更改时,会发生此错误。这通常是由集群大小不足引起的。这可能是因为事务非常大,超出了集群的可用资源。例如,设备长时间离线后,尝试同步非典型数量的批处理事务。或者,集群资源一般不足以满足应用的需求。

您可以通过升级集群层来解决此错误。

为了避免此错误,请确保关联的 MongoDB 集群满足应用的需求。此外,请确保您的应用使用最佳实践来读取和写入数据。有关更多信息,请参阅 Atlas 集群大小调整和层级选择

MongoEncodingError

当 MongoDB Atlas 写入操作(即不是同步客户端)修改文档,使其不再符合应用的模式时,就会出现此错误。与模式不匹配的文档无法同步,对此类文档锁表示的对象的任何本地更新都不会传播。

有关更多信息,请参阅未同步的文档

TranslatorCorrectiveErasure
当同步 MongoDB 集群拒绝 Device Sync 传播更改的写入操作时,就会出现此错误。这通常是由重复键异常引起的,也就是两个对象使用相同的主键。要避免此错误,请使用 ObjectIdUUID 作为主键值。或者,确保每个同步对象具有唯一的主键,甚至是跨分区的唯一主键。
TranslatorFatalError — ChangeStreamHistoryLost

如果 oplog 中的旧条目在服务器端“转换器”进程读取之前已过期,则会出现该错误。如果没有这些条目,转换器无法使 MongoDB 集群和 Realm 对象服务器达到等效的状态。

在以下情况下,可能会出现该问题:

  • Sync 暂停时间太长,而导致条目从 oplog 中消失。

  • 删除转换器正在使用的集合。

  • 无法访问 MongoDB 集群的时间太长。

免费套餐具有共享 oplog,因此更容易受到此错误的影响。

要解决该错误,请终止重新启用 Sync

如果您在新创建的集群上启用 Device Sync,该操作可能会无法解析集群 URI。出现这种情况是因为集群的 SRV 记录尚未传播。有两种可能的解决方法:

如果错误似乎是由连接的客户端引起的,同步协议将返回 ERROR 消息。每条消息包含错误代码号和描述。

要查看同步错误的完整列表,请参阅 错误代码列表 在 Realm Database Core GitHub 存储库中。

每个使用同步的应用程序都需要一个同步错误处理程序。要了解有关同步错误处理的更多信息,请参阅您首选的 SDK:

您可以指定客户端日志级别。如果将日志级别设置为 tracedebug,则可以在应用程序开发过程中帮助诊断问题。您可以记录有关所有同步事件的一般信息或详细信息,或仅记录警告或错误。

重要

非常详细的日志记录会对性能产生负面影响。对于生产部署,请降低日志级别。

有关可用日志级别的更多信息,包括如何设置客户端日志级别,请参阅您的首选 SDK 文档。

后退

客户端重置

来年

使用同步功能进入生产阶段