Minecraft Bedrock(WIN10) 世界因丢失 db/MANIFEST 文件而损坏

Minecraft Bedrock(WIN10) world corrupted because of missing db/MANIFEST file

我最近 运行 遇到了一个非常具体的问题,该问题导致我的 Minecraft Bedrock 世界被破坏(我的世界中几乎没有整块)。事实证明,问题是因为我使用的是使用以下命令通过 7zip 创建的备份:

7z.exe a -r minecraftWorlds.7z %LOCALAPPDATA%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\minecraftWorlds\*.*

…没有添加没有扩展名的文件,特别是 {worldID}/db 目录中的 MANIFEST 文件。

我不得不为 Windows 10 卸载 Minecraft,它删除了所有资源包并保存了世界,但我认为我很好,因为我有一个每天备份的脚本。所以我重新安装了 Minecraft 并恢复了我的备份,然后加载了我的世界,就像我说的,我的世界中丢失了整个块。

所以我创建了一个新世界并将其保存文件夹与我恢复的文件夹进行比较,就在那时我注意到我的世界缺少 /db 子目录中的 MANIFEST 文件。

在我的调查中,我发现了很多针对损坏世界的可能修复方法,但它们都与损坏的 level.dat 文件有关,而与 db 目录中丢失的文件无关。

None 像 MCCToolchest 这样的工具甚至可以打开世界数据文件,因为这些缺少 MANIFEST 文件。

那么有什么要做的吗?

首先,使用 7-zip 备份 Minecraft Bedrock (Windows 10) 世界的正确命令是:

7z.exe a -r minecraftWorlds.7z %LOCALAPPDATA%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\minecraftWorlds\*

…最后没有“.*”。这将为存储在您的 minecraftWorlds 目录中的 所有 文件创建一个备份。

我做的研究越多,Minecraft 世界数据似乎以名为 leveldb 的数据库格式保存。这是一个基于 key/value 对的数据库,加载到内存中并存储在 {worldID}/db 文件夹中的一系列文件中。

以下是我能够恢复工作 MANIFEST 文件并恢复我的世界的方法!

你需要一个 POSIX OS。由于手边没有,我通过 Ubuntu 18.04 LTS 安装了“Windows-subsystem-for-linux”,可以从 Microsoft Store 应用免费安装。

安装、配置并启动此应用程序后,您基本上会进入 bash 命令提示符。

  • 首先,安装构建工具
sudo apt-get install git cmake g++ libsnappy-dev
git clone --recurse-submodules https://github.com/google/leveldb.git
cd leveldb && mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .

构建成功后,您需要使用您最喜欢的 linux 编辑器创建以下 C++ 程序,将文件保存为 ldbrpr.cc:

#include <cstdlib>
#include <leveldb/db.h>

int main(int argc,char *argv[])
{
    if(argc==2)
    {
        leveldb::Options o;
        leveldb::Status s=leveldb::RepairDB(argv[1],o);
        return s.ok()?EXIT_SUCCESS:EXIT_FAILURE;
    }
    else return EXIT_FAILURE;
}

保存文件后,您需要对其进行编译。

g++ -o ldbrpr ldbrpr.cc -lleveldb -lpthread -L ~/leveldb/lib -I ~/leveldb/include

执行此命令后,您应该找到一个名为:ldbrpr

的可执行文件
ls -las

您现在需要为每个 world-save 文件夹执行此程序。这是通过以下命令完成的:

./ldbrpr /mnt/c/Users/DEV/AppData/Local/Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState/games/com.mojang/minecraftWorlds/{worldsavefoldername}/db

将 {worldsavefoldername} 替换为您要恢复的每个世界的文件夹名称。如果您不是 运行 而不是 windows-subsystem-for-linux,路径可能会有所不同。如果您 运行 在不同的机器或 VM 上执行这些命令,则需要将 world-save 文件夹复制到该实例。

现在,下一部分很关键。 Minecraft 使用专有版本 leveldb,因此它似乎只恢复了一个数据文件,它会将所有其他数据文件放入一个名为 lost.

的子目录中

因为我们的数据文件实际上并没有损坏,只有我们的 MANIFEST 文件,在 Windows 资源管理器中打开你的世界 save-folder,在 db 子文件夹中,删除 *.ldb 文件和 LOG 文件。这应该只留下两个 MANIFEST 个文件和一个名为 lost 的文件夹。现在将 db\lost 文件夹中的所有文件复制回 db 文件夹。

现在启动 Minecraft,您的世界应该可以正常加载。