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

Data Backup

MongoPlus provides two types of data backup. One is writing to a configured data source during insert, update, or delete operations. The other is local backup of certain collections, with data import functionality.

Data Backup

When performing insert, update, or delete operations using MongoPlus, AsyncMultipleWriteInterceptor will asynchronously write to other data sources based on the configured strategy (MultipleWriteHandler). By default, it writes to all configured sub-data sources.

Plugin Configuration

1. Create a Write Handler

java
@Component
public class MongoMultipleWriteHandler extends MultipleWriteHandler {

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

    /**
     * Write strategy: returns the data source names where data should be written. Throws an exception if not found.
     * <p>If elements exist in the response data, this method's return value is used directly for writing.</p>
     * @param currentDataSource Current data source name
     * @param namespace Collection namespace
     * @return {@code List<String>} Other data source names to write to
     */
    @Override
    public List<String> multipleWrite(String currentDataSource, MongoNamespace namespace) {
        return super.multipleWrite(currentDataSource, namespace);
    }
}

2. Create the Data Backup Plugin

java
@Bean
public AsyncMultipleWriteInterceptor multipleWriteInterceptor(MongoPlusClient mongoPlusClient,
                                                                MongoMultipleWriteHandler multipleWriteHandler){
    // Add strategies
    // On save, write to test1 and test2
    multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.SAVE, Arrays.asList("test1","test2"));
    // On remove, write to test1 and test2
    multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.REMOVE, Arrays.asList("test1","test2"));
    // On update, write to test1 and test2
    multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.UPDATE, Arrays.asList("test1","test2"));
    // On bulkWrite, write to test1 and test2
    multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.BULK_WRITE, Arrays.asList("test1","test2"));
    return new AsyncMultipleWriteInterceptor(mongoPlusClient,multipleWriteHandler);
}

Local Backup

Use BackupManager to perform local backups of MongoDB. It works by paginated queries that convert each Document to JSON and write it to a JSON file per page, then finally packages them into a zip file. For import, pass the zip file to BackupManager, which will delete the corresponding collections before unpacking and adding the data.

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);
        // Set rows per page
        backupManager.setLimit(1000);
        // Set collections to backup (can be passed via constructor)
        backupManager.setCollectionNames(Arrays.asList(User.class, Role.class));
        // Set data source for backup, default is current data source
        backupManager.setDataSourceName("master");
        // Set backup listener, called for each data item
        backupManager.setBackupListeners((targetPath, collectionName, document) ->
                log.info("path: {}, collectionName: {}, document: {}",
                        targetPath,
                        collectionName,
                        document.toJson()
                )
        );
        // Execute backup
        Map<String,String> backupResult = backupManager.export();
        backupResult.forEach((key, value) -> System.out.println("collectionName: "+key+"| path: "+value));
        // Execute import
        backupManager.imports(".zip");
    }
}

With the above configuration, MongoPlus can perform data backup and asynchronous writes.