如何使用Java代码将含数据库备份的.sql文件导入服务器另一数据库?
如何通过Java代码导入SQL备份文件到目标数据库?
要实现将.sql格式的数据库备份文件导入服务器上的目标数据库,可以通过Java调用系统原生的mysql命令行工具来完成,这种方式直接利用数据库自带的导入能力,处理大备份文件也更高效。
实现代码
import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DumpFileClass { // 初始化日志实例(需引入SLF4J等日志框架依赖) private static final Logger logger = LoggerFactory.getLogger(DumpFileClass.class); public static boolean importDump(String host, String username, String password, String database, String dumpFilePath) { // 拼接mysql导入命令:-p后直接跟密码,不要加空格 String mysqlCommand = "mysql -h " + host + " -u " + username + " -p" + password + " " + database + " < " + dumpFilePath; System.out.println("执行的命令:" + mysqlCommand); try { // 执行系统命令 Process process = Runtime.getRuntime().exec(mysqlCommand); logger.trace("进程实例:{}", process); // 等待命令执行完成,获取退出码 int exitCode = process.waitFor(); logger.trace("命令退出码:{}", exitCode); System.out.println("命令执行退出码:" + exitCode); // 退出码为0表示执行成功 return exitCode == 0; } catch (IOException | InterruptedException e) { e.printStackTrace(); return false; } } }
关键说明
- 命令拼接规则:
mysql命令中-p和密码之间不能有空格,否则会被识别为交互式输入密码;<符号用于将.sql文件内容作为命令输入流。 - 进程执行与结果判断:通过
Runtime.getRuntime().exec()启动系统进程,waitFor()会阻塞当前线程直到命令执行完成,退出码0代表执行成功,非0则表示出错。 - 异常处理:捕获命令执行时的IO异常(如命令不存在、文件无法读取)和线程中断异常,出现异常时返回
false表示导入失败。
注意事项
- 安全风险:命令行直接传递密码会被系统进程列表(如
ps命令)捕获,生产环境建议改用--defaults-extra-file=/path/to/my.cnf指定包含用户名密码的配置文件,避免明文暴露。 - 路径与权限:确保
dumpFilePath是Java进程可访问的绝对路径,且运行Java进程的用户拥有读取该文件、执行mysql命令以及目标数据库的写入权限。 - 日志依赖:代码中使用SLF4J日志框架,需在项目中引入对应依赖(如
slf4j-api和具体实现如logback-classic),若不需要日志可删除相关logger代码。
内容的提问来源于stack exchange,提问作者Mayur
相关产品推荐
相关产品推荐

