- 直接操作文件系统(推荐用于自动化脚本):通过 Java 代码调用 MongoDB 的
mongodump命令行工具,这是最常用、最可靠的方式,因为它直接利用了 MongoDB 官方提供的备份功能。 - 使用 Java 驱动 API(适用于程序内逻辑备份):通过 Java 驱动连接到 MongoDB,查询所有集合的数据,然后将数据序列化(如转为 JSON)并写入文件,这种方式更灵活,但性能较差,不适用于大型数据库。
下面我将详细介绍这两种方法,并提供完整的代码示例。

调用 mongodump 命令(推荐)
这是生产环境中最常用的方法,Java 的 Runtime 或 ProcessBuilder 类可以用来执行外部命令。
核心思路
- 确保你的服务器上已经安装了 MongoDB,
mongodump命令在系统的环境变量PATH中。 - Java 代码构建
mongodump命令的参数,--uri: MongoDB 连接字符串。--out: 备份文件输出的目录。--username,--password: 如果需要认证。--db,--collection: 如果只需要备份特定数据库或集合。
- 使用
ProcessBuilder执行该命令。 - 捕获命令的输出流(
stdout和stderr)来监控备份过程和错误信息。 - 等待命令执行完成,并根据其退出码判断备份是否成功。
完整代码示例
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class MongoDbBackup {
public static void main(String[] args) {
// --- 配置信息 ---
// MongoDB 连接字符串,包含认证信息
String mongoUri = "mongodb://admin:password@localhost:27017/";
// 备份输出的根目录
String outputDir = "/path/to/your/backup/directory";
// 要备份的特定数据库(可选,不指定则备份所有)
String databaseToBackup = "myDatabase";
// 是否备份所有数据库(databaseToBackup 为空,则此参数生效)
boolean all dbs = true;
// 构建命令
ProcessBuilder processBuilder = new ProcessBuilder();
// 构建命令数组
// 注意:如果你的路径或密码中有空格,需要用引号括起来
String[] command;
if (all dbs || databaseToBackup == null || databaseToBackup.isEmpty()) {
command = new String[]{"mongodump", "--uri=" + mongoUri, "--out=" + outputDir};
} else {
command = new String[]{"mongodump", "--uri=" + mongoUri, "--db=" + databaseToBackup, "--out=" + outputDir};
}
processBuilder.command(command);
processBuilder.redirectErrorStream(true); // 合并错误流和标准输出流
System.out.println("Executing backup command: " + String.join(" ", command));
try {
Process process = processBuilder.start();
// 读取命令的输出流
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 等待命令执行完成
int exitCode = process.waitFor();
if (exitCode == 0) {
System.out.println("Backup completed successfully!");
System.out.println("Backup files are located at: " + outputDir);
} else {
System.err.println("Backup failed with exit code: " + exitCode);
}
} catch (IOException e) {
System.err.println("Error executing mongodump command: " + e.getMessage());
e.printStackTrace();
} catch (InterruptedException e) {
System.err.println("Backup process was interrupted: " + e.getMessage());
Thread.currentThread().interrupt(); // 恢复中断状态
}
}
}
如何运行
-
安装 MongoDB: 确保你的服务器或本地机器上安装了 MongoDB。
-
配置环境变量: 确保
mongodump命令可以在任何目录下执行。 -
修改代码: 将示例代码中的
mongoUri和outputDir修改为你自己的配置。
(图片来源网络,侵删) -
编译运行:
# 编译 (假设文件名为 MongoDbBackup.java) javac MongoDbBackup.java # 运行 java MongoDbBackup
使用 Java 驱动 API
这种方法不依赖 mongodump,完全在 Java 程序内部完成,适用于需要将备份逻辑嵌入到现有应用中的场景,但不推荐用于大规模数据备份。
核心思路
- 添加 MongoDB Java 驱动依赖(如 Maven 或 Gradle)。
- 使用
MongoClient连接到 MongoDB。 - 获取所有数据库名称,遍历每个数据库。
- 对每个数据库,获取所有集合名称,遍历每个集合。
- 对每个集合,使用
find()查询所有文档。 - 将查询到的
Document对象转换为 JSON 字符串。 - 将 JSON 字符串写入到对应的文件中(文件路径可以按
database/collection.json组织)。
Maven 依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.11.1</version> <!-- 使用最新稳定版本 -->
</dependency>
完整代码示例
import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.bson.conversions.Bson;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class MongoDbBackupWithDriver {
public static void main(String[] args) {
// --- 配置信息 ---
String connectionString = "mongodb://admin:password@localhost:27017/";
String outputDir = "/path/to/your/java/backup/directory";
try (MongoClient mongoClient = MongoClients.create(connectionString)) {
// 1. 获取所有数据库列表
MongoIterable<String> databaseNames = mongoClient.listDatabaseNames();
// 2. 确保输出目录存在
Files.createDirectories(Paths.get(outputDir));
for (String dbName : databaseNames) {
// 跳过系统数据库
if (dbName.startsWith("admin") || dbName.startsWith("config") || dbName.startsWith("local")) {
continue;
}
System.out.println("Backing up database: " + dbName);
MongoDatabase database = mongoClient.getDatabase(dbName);
// 3. 获取当前数据库的所有集合
MongoIterable<String> collectionNames = database.listCollectionNames();
// 为每个数据库创建一个子目录
Path dbOutputPath = Paths.get(outputDir, dbName);
Files.createDirectories(dbOutputPath);
for (String collectionName : collectionNames) {
System.out.println(" -> Backing up collection: " + collectionName);
MongoCollection<Document> collection = database.getCollection(collectionName);
// 4. 查询所有文档
FindIterable<Document> documents = collection.find();
// 5. 将文档写入文件
Path collectionFilePath = dbOutputPath.resolve(collectionName + ".json");
try (FileWriter writer = new FileWriter(collectionFilePath.toFile())) {
// 使用 toJson() 方法将每个文档转为 JSON 字符串
for (Document doc : documents) {
writer.write(doc.toJson() + System.lineSeparator());
}
}
}
}
System.out.println("Java driver backup completed successfully!");
} catch (IOException e) {
System.err.println("An I/O error occurred during backup: " + e.getMessage());
e.printStackTrace();
} catch (Exception e) {
System.err.println("An unexpected error occurred: " + e.getMessage());
e.printStackTrace();
}
}
}
两种方法的对比
| 特性 | 方法一: 调用 mongodump |
方法二: 使用 Java 驱动 API |
|---|---|---|
| 性能 | 非常高。mongodump 是原生工具,经过高度优化,直接操作底层存储引擎。 |
非常低,需要通过网络逐条获取数据,序列化,再写入文件,CPU 和 I/O 开销大。 |
| 可靠性 | 高,官方工具,稳定可靠,支持快照等高级功能。 | 一般,依赖 Java 程序的稳定性,网络中断可能导致备份不完整。 |
| 依赖性 | 需要服务器安装 MongoDB 客户端工具。 | 只需 Java 驱动 JAR 包,无需安装 MongoDB 服务器。 |
| 灵活性 | 较低,只能使用 mongodump 提供的参数。 |
非常高,可以在 Java 代码中添加任意逻辑,如过滤数据、转换格式、压缩等。 |
| 适用场景 | 生产环境自动化备份、定时任务、大规模数据备份。 | 小型数据导出、程序内数据快照、与业务逻辑结合的备份需求。 |
总结与建议
- 对于绝大多数备份场景,请优先选择方法一(调用
mongodump),它是行业标准,性能和可靠性都得到了充分验证,你可以将这个 Java 程序打包成一个可执行的 JAR,然后配合操作系统的定时任务(如 Linux 的cron或 Windows 的任务计划程序)来实现自动化备份。 - 只有当你的备份需求非常特殊,例如需要在备份过程中进行复杂的数据处理、或者你的运行环境无法安装
mongodump时,才考虑使用方法二。
希望这个详细的解释和代码示例能帮助你完成 Java 中的 MongoDB 备份任务!

