【问题标题】:svn recovery - restoring individual revisionssvn recovery - 恢复个别修订
【发布时间】:2010-11-20 19:41:26
【问题描述】:

不管我是如何来到这里的,我都处于从备份中恢复 SVN 存储库的位置。不幸的是,备份略有损坏,在 19000 多个修订版中,大约有 80 个丢失了。备份是一个 bzip2 文件,我能够使用 bzip2recover 恢复大约 99% 的块。这些是“已知良好”,因为它们已成功解压缩。

因此,我能够创建一个已知良好提交和丢失提交的列表。

原始存储库也已损坏,但许多文件仍然存在。不幸的是,整个存储库已损坏。

所以我很幸运能够从原始 db/revs 和 db/revprops 目录中获得这些缺失修订的文件。很可能备份 bz2 文件的损坏与 db/revs 文件的损坏不一致。

我已将所有内容重建到 r13892,但我知道 r13893 已损坏,因此我没有 r13893 的转储。我确实有原始存储库中的文件 db/revs/13893 和 db/revprops/13893。

我使用 svn-1.4 创建并重建了存储库,但我升级到了 svn-1.6,以便可以使用选择性 svnadmin verify 命令(在单个或一系列提交上)。

我想也许我可以将这两个文件放入新的存储库,更新 db/current [1] 然后继续。但是,当我尝试验证时出现此错误:

$ svnadmin verify new-svn
* Verified revision 1.
...
* Verified revision 13889.
* Verified revision 13890.
* Verified revision 13891.
* Verified revision 13892.
svnadmin: Can't read file 'svn/db/revs/13214': End of file found

所以这显然行不通。不知道 13214 与这里有什么关系。

我降级回 svn-1.4.6 以防万一 1.6 发生任何奇怪的事情。不幸的是,我得到了相同的结果 - 修订版 13893 没有验证:

...
* Verified revision 13891.
* Verified revision 13892. svnadmin: Can't read file 'svn/db/revs/13214':
End of file found

这就是我所知道的:

  • 我知道修订版 1 到 13892 是 100% 正确的(除非 bz2 块解压缩不正确但通过校验和的可能性极小)。
  • 我不知道原始 SVN 存储库中的 r13893 文件是否正常 - 它们可能已损坏,但损坏的数量非常小,不太可能(但可能)。

有没有人知道我可以如何填补这个漏洞?请注意,我拥有一个 100% 自信的 r13894,所以如果我可以插入 r13893,我可以继续进行其余的恢复。

[1] 我用这个脚本更新了 db/current: http://svn.haxx.se/users/archive-2005-12/att-0630/make-current-fix.py

我在其他一些 SVN 存储库上对此进行了测试(在禁用对 db/current 的写入之后!)以验证它产生的值与已经存在的值相同。确实如此。

【问题讨论】:

    标签: svn backup recovery rebuild


    【解决方案1】:

    关于这个:

    svnadmin: Can't read file 'svn/db/revs/13214': End of file found
    

    我怀疑 rev 13893 引用了 rev 13214 中的某些内容(例如文件副本、skip-rev 内容或其他内容)。

    在进行 svn 加载时,新版本是否与原始版本匹配?我记得遇到过这样的情况,我的转储引用了 rev 0,它被加载为 rev 1。如果这里发生类似的情况,对 rev 13214 的反向引用将关闭一个。

    您可以尝试使用 repo db 中的文件以转储格式创建丢失的 rev。不幸的是,我不知道有什么工具可以做到这一点。但我建议查看SvnDumpTool;它能够以很多有用的方式操纵 svn 转储。

    披露:我过去曾为 svndumptool 做过贡献

    【讨论】:

    • 是的,在 r13893 的顶部它说: DELTA 13214 0 12567271 所以它是 13214 顶部的一个增量,它解释了它的来源。我注意到的一件事是我重建的二进制提交(在 db/revs 中)以这个开头:SVN^A^@^@^@ 然而我原来的 r13893 提交看起来像这样:SVN^@^@^@ 请注意,“SVN”之后的第一个字节在旧提交中是 ^@ (00),但在新提交中是 ^A (01)。这是 xdelta 版本号吗?也许我需要使用相同 xdelta 格式的 subversion 版本重建 1 到 13892?
    • 我不知道 ^@ vs ^A。但是在加载转储时,它应该告诉您原始的转速是多少,以及新创建的转速是多少。这两个数字匹配吗?
    • 是的,这些数字匹配。我实际上解决了这个问题 - 这是因为我用 1.4 创建了新的 repo,但是旧文件是用 1.3 创建的,所以 xdelta 格式不同。我从 svn-1.3 重新开始,现在这个问题已经解决了。不幸的是 svnadmin segfaults 后来,所以一切都不是很好......
    猜你喜欢
    • 2023-03-11
    • 2017-09-16
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多