Couchbase文档元数据异常咨询:已删文档复现且flags/expiration为0
已删除文档在Couchbase+Sync Gateway环境中重现的排查与解决
问题背景
环境采用Couchbase Server搭配Sync Gateway架构,出现以下异常:
- 部分疑似已删除的文档重新出现在数据库中,昨日查询时该文档不存在
- 文档主体的
lastupdate字段指向去年日期,但元数据中的CAS值对应最新时间(1669165471522357248,转换为时间为2022年11月23日左右) - 文档元数据特征:
flags=0、expiration=0,在Couchbase及Sync Gateway日志中未找到该文档ID的任何操作记录
文档元数据如下:
{ "flags": 0, "expiration": 0, "id": "SomeIDXXX::YYY", "cas": 1669165471522357248, "type": "json" }
可能原因与排查步骤
1. Sync Gateway墓碑清理机制异常
Sync Gateway默认会保留已删除文档的墓碑(tombstone)7天,用于同步时告知客户端文档已删除。若墓碑被提前清理,持有旧文档缓存的客户端重新同步时,会将旧文档作为新文档插入数据库。
- 检查Sync Gateway配置文件中的
purge_interval(墓碑清理间隔)和revision_limit(版本保留数)参数,确认是否因配置不合理导致墓碑被过早清理 - 通过Sync Gateway REST API(
GET /{db}/_all_docs?include_docs=true&keys=["SomeIDXXX::YYY"])检查该文档是否存在墓碑记录
2. 客户端离线缓存触发的重复插入
如果客户端在文档删除前已缓存该文档,后续离线后重新上线时,若Sync Gateway的墓碑已不存在,客户端会将旧文档重新写入。
- 排查涉及该文档ID的客户端同步日志,确认是否有客户端发起了文档插入请求
- 检查客户端的冲突解决策略,是否存在旧版本文档覆盖最新数据的逻辑漏洞
3. Couchbase Server数据恢复/同步异常
- 检查Couchbase Server的备份恢复记录,确认是否有近期的恢复操作还原了旧文档
- 若配置了XDCR跨集群复制,排查是否从其他集群同步了已删除的旧文档副本
4. 元数据flags=0的特殊说明
Couchbase中flags=0表示文档无特殊标记,正常删除的文档会带有墓碑标记。该文档的flags为0,说明它是被当作新文档插入的,而非墓碑恢复。
- 使用Couchbase CLI命令
couchbase-cli document-get -c <cluster-host> -u <username> -p <password> --bucket <bucket-name> --id SomeIDXXX::YYY查看文档完整内容,确认是否包含Sync Gateway管理的_rev字段,判断是否由Sync Gateway写入 - 对比CAS值对应的时间,确认文档插入时间是否与重现时间匹配
临时处理方案
- 手动删除该文档,确保Sync Gateway生成对应的墓碑记录,避免客户端再次同步旧版本
- 调整Sync Gateway的墓碑保留时间(如延长
purge_interval),确保客户端有足够时间同步删除状态
内容的提问来源于stack exchange,提问作者serkanz
相关产品推荐
相关产品推荐

