如何将couchbase恢复到备份状态?

How to recover couchbase to the status of a backup?

我用cbbackup备份couchbase。然后对数据库做一些操作,比如添加和删除文档。操作完后,我想放弃所有的操作,恢复db到备份的状态。

我做了以下测试。 cbbackup 和 cbrestore 在我的测试中没有帮助。如何实现我的目标?

  1. 备份数据库

    $ rm -rf /tmp/cbbackup
    $ /opt/couchbase/bin/cbbackup http://cb_ip:8091  /tmp/cbbackup -u 'xxx' -p '***' -v
    
  2. 记住社交桶的项目数。

    • 计数:33
  3. 从社交桶中删除一份文档
    • 删除 id:existing-item-110
  4. 将两个新文档添加到社交存储桶
    • Ids: new-item-1, new-item-2
  5. 记住社交桶的项目数。
    • 计数:34
  6. 恢复社交桶

    $ /opt/couchbase/bin/cbrestore /tmp/cbbackup http://cb_ip:8091 -u 'xxx' -p '***' -b mybucket -v
    
  7. 验证是否恢复了删除的文档以及是否删除了添加的文档。

    • 结果:计数:34,没有变化
    • 删除的项目没有回来。
    • 添加的项目没有被删除。
  8. 结论:cbrestore无法将db恢复到备份时间点。不删除备份时间点之后的更改。

  9. 使用cbtransfer恢复数据。结果和结论和cbrestore一样。

    $ /opt/couchbase/bin/cbtransfer /tmp/cbbackup http://cb_ip:8091 -u 'xxx' -p '***' -b mybucket -v
    

在我直接回答你的问题之前,让我解释一下关于 cbbackup 和 cbrestore 的两个重要概念。

  1. 这些工具在备份和恢复过程中不传输原始数据文件。在备份期间,数据从服务器流出并写入磁盘,在恢复期间,数据使用设置操作放入数据库。

  2. Couchbase 有能力在集合期间解决冲突。这意味着如果您备份一个密钥,然后更新它,然后执行恢复并启用冲突解决,那么恢复期间的设置将被丢弃,因为它不是最新更新。

以下是适用于您的用例的两个备份方案。

首先让我们看一下时间点还原场景。为了实现这一点,您应该删除并重新创建您的存储桶,然后 运行 cbrestore。原因是 cbrestore 不会知道您在备份后添加的新密钥,也无法删除它们。

假设在另一种情况下,您只想用备份的数据强制覆盖存储桶中的所有数据。在这种情况下,您想禁用冲突解决,您可以使用“-x conflict_resolve=0”标志来实现。这适用于我备份 1000 个密钥,然后更新它们,然后想要恢复备份后所做的更新的情况。 (注意 conflict_resolve 标志在 Couchbase 4.0 和 4.1 中被意外删除,但会在 4.1.1 和 4.5 中重新添加)

最后一点,我建议不要使用 cbtranfer,因为它没有像 cbbackup 和 cbrestore 那样经过测试,而且该工具通常只作为最后的手段使用。