Skip to content
广告❤️成为赞助商

数据备份

MongoPlus提供了两种数据备份方式,一种是进行增删改时,向配置的某个数据源也进行写入;另一种则是将某些集合中的数据进行本地备份,并提供了数据导入的功能

数据备份

在使用MongoPlus进行增删改时,AsyncMultipleWriteInterceptor将会通过配置的策略(MultipleWriteHandler),进行异步写入,默认为所有的子数据源写入数据

配置插件

1. 创建写入处理器

java
@Component
public class MongoMultipleWriteHandler extends MultipleWriteHandler {

    public MongoMultipleWriteHandler(MongoPlusClient mongoPlusClient) {
        super(mongoPlusClient);
    }

    /**
     * 写入策略,返回需要写入数据的数据源名称,不存在则抛出异常
     * <p>如果该方法响应数据中存在元素,则直接使用该方法返回值进行写入</p>
     * @param currentDataSource 当前数据源名称
     * @param namespace 集合命名空间
     * @return {@code List<String>} 其他需要写入的数据源名称
     */
    @Override
    public List<String> multipleWrite(String currentDataSource, MongoNamespace namespace) {
        return super.multipleWrite(currentDataSource, namespace);
    }
}

2. 创建数据备份插件

java
@Bean
public AsyncMultipleWriteInterceptor multipleWriteInterceptor(MongoPlusClient mongoPlusClient,
                                                                MongoMultipleWriteHandler multipleWriteHandler){
    // 添加策略
    // save时,向test1和test2写入
    multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.SAVE, Arrays.asList("test1","test2"));
    // remove时,向test1和test2写入
    multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.REMOVE, Arrays.asList("test1","test2"));
    // update时,向test1和test2写入
    multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.UPDATE, Arrays.asList("test1","test2"));
    // bulkWrite时,向test1和test2写入
    multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.BULK_WRITE, Arrays.asList("test1","test2"));
    return new AsyncMultipleWriteInterceptor(mongoPlusClient,multipleWriteHandler);
}

本地备份

通过BackupManager即可实现对MongoDB的本地备份。原理是通过分页查询将得到的Document转换为JSON,写入JSON文件,每页为一个JSON文件,最终打包为zip文件;导入时将zip文件传入,BackupManager则会删除对应的集合后解包执行添加

java
public class Backup {
    @Resource
    private MongoPlusClient mongoPlusClient;

    public void backupTest() {
        String path = "/usr/local/backup/";
        //BackupManager backupManager = new BackupManager(path, Arrays.asList("user", "role"), mongoPlusClient);
        BackupManager backupManager = new BackupManager(mongoPlusClient);
        // 设置每页行数
        backupManager.setLimit(1000);
        // 设置需要备份的集合,可以通过构建BackupManager的构造参数传递List<String>
        backupManager.setCollectionNames(Arrays.asList(User.class, Role.class));
        // 设置需要备份的数据源,默认当前数据源
        backupManager.setDataSourceName("master");
        // 设置备份监听器,每条数据都会回调该方法
        backupManager.setBackupListeners((targetPath, collectionName, document) -> 
                log.info("path: {},collectionName: {},document: {}", 
                        targetPath,
                        collectionName,
                        document.toJson()
                )
        );
        // 执行备份
        Map<String,String> backupResult = backupManager.export();
        backupResult.forEach((key, value) -> System.out.println("collectionName: "+key+"| path: "+value));
        // 执行导入
        backupManager.imports(".zip");
    }

}

通过上述配置方式,即可实现MongoPlus对数据的备份,异步写入