【问题标题】:How to restore data from MapDB wal (write ahead log) files?如何从 MapDB wal(预写日志)文件中恢复数据?
【发布时间】:2021-06-27 20:53:04
【问题描述】:

我的目标是启用 MapDB 崩溃保护,如果发生崩溃,如何恢复数据。

我已为 MapDB 启用事务

DB db;
HTreeMap< String, String > mapDb;

db = DBMaker.fileDB( "walTest/file1.db" )
        .transactionEnable()
        .allocateStartSize( 64 *1024 *1024 )
        .allocateIncrement( 32 *1024 *1024 )
        .fileMmapEnable()
        .fileMmapEnableIfSupported()
        .fileMmapPreclearDisable()
        .cleanerHackEnable()
        .closeOnJvmShutdown()
        .make();

mapDb = db.hashMap( "Test" ) //$NON-NLS-1$
        .keySerializer( Serializer.STRING )
        .valueSerializer( Serializer.STRING )
        .createOrOpen();

for(int i=0; i<10000;i++)
{
    mapDb.put(""+i, "aaaaaaaaaaa bbbbbbbbbbbbbbbbbb cccccccccccccccccccc dddddddddddddddddd");
    if(i % 100 == 0) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    if(i == 5000)
    {
        db.commit();
    }
}

我看到它创建了 2 个文件,file1.db 和 file1.db.wal.0

现在,我重新启动服务器并使用以下代码读取 MapDB

System.out.println(mapDb.size());

输出为 5001 其他未提交的 5000 个未恢复。

我在执行 mapDb.size() 之前尝试使用 db.commit,但它仍然没有帮助。

那么,wal 文件如何防止服务器或 jvm 崩溃? 我们如何恢复 wal 文件?

【问题讨论】:

    标签: java restore jvm-crash wal mapdb


    【解决方案1】:

    从最新版本 (3.0.8) 开始,我认为您不能。

    查看源代码,它看起来有一些代码应该这样做,但它似乎是一个正在进行中的功能,它没有在内部使用,也没有外部方式来触发代码。

    关于我发现的一些附加细节:使用.transactionEnable() MapDB 将触发 WAL 文件file1.db.wal.0 的创建,尽管它仅在应用程序运行时使用它来允许.rollback()。在下次启动时,即使 WAL 文件存在,它也会忽略内容,并立即开始写入文件,就好像它是新创建的并且为空一样。

    .transactionEnable() 将 MapDB 的存储类设置为StoreWAL,其中有一个类变量wal,它是WriteAheadLog 的一个实例。 WriteAheadLog 有一个子类 WALReplay 以及一个 open 和 replayWAL 函数,它们将 WALReplay 实例作为参数,但我不相信代码目前已准备好生产。

    如果你真的想重播 WAL 文件,那么可以通过:

    1. 使用反射从db.getStore()中获取wal变量
    2. 创建 WALReplay 接口的实现
    3. 调用 replayWAL 或(最好)打开 wal 变量,传入 WALReplay 实现的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      相关资源
      最近更新 更多