java 代码通过调用mysqldump命令备份mysql数据库
java 代码通过调用mysqldump命令备份mysql数据库 数据库备份是开发工作中经常要做的事情,好处是mysql提供了一个非常好的命令 mysqldump,直接调用它就可以将数据以sql文件的形式备份出来。但是直接写命令非常不方便,遇到定时备份或者指定备份那么就需要代码调用。下面是一个使用java代码调用该命令的小示例:/*** 备份调用工具方法** @param c
·
java 代码通过调用mysqldump命令备份mysql数据库
数据库备份是开发工作中经常要做的事情,好处是mysql提供了一个非常好的命令 mysqldump,直接调用它就可以将数据以sql文件的形式备份出来。但是直接写命令非常不方便,遇到定时备份或者指定备份那么就需要代码调用。下面是一个使用java代码调用该命令的小示例:
/**
* 备份调用工具方法
*
* @param connectParam 包含数据库连接信息的对象
* @param backupAll 是否全部备份
* @param startTime 待备份日志的时间区间结束点
* @param endTime 待备份日志的时间区间结束点
* @return 备份操作结果
*/
public CommonResult backupLoginfo(ConnectParam connectParam, boolean backupAll,
String startTime, String endTime) {
CommonResult result = new CommonResult();
String strFilter;
String strFilePath = strLogExcelPath;
if (backupAll) {
strFilter = "\"1=1\"";
// 其实此处.sql和.dump效果是一样的
strFilePath += String.format("loginfo-%s.dump", System.currentTimeMillis());
} else {
if (null == startTime || startTime.isEmpty() || null == endTime || endTime.isEmpty()) {
result.message = "起止时间不能为空";
result.result = false;
return result;
} else {
strFilter = String.format("\"OPERTIME BETWEEN '%s' AND '%s'\"", startTime, endTime);
// 文件名中要剔除非法字符
strFilePath += String.format("loginfo(%s_%s).dump", startTime, endTime)
.replaceAll(":", "");
}
}
try {
int nBackUpResult = backUpDataTable(connectParam.ip,
connectParam.userName,
connectParam.password,
String.format(" %s lnd_loginfo", connectParam.databaseName),
strFilter,
strFilePath);
// 0 表示线程正常终止
if (0 == nBackUpResult) {
result.result = true;
return result;
}
} catch (IOException ie) {
logger.error(ie.getMessage());
} catch (InterruptedException ire) {
logger.error(ire.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
}
result.result = false;
result.message = "备份异常";
return result;
}
public static int backUpDataTable(String clientIp, String userName, String userPsw,
String tableInfo, String strFilter, String strFilePath)
throws IOException, InterruptedException {
// 判断路径是否存在
File file = new File(strFilePath).getParentFile();
if (!file.exists()) {
file.mkdirs();
}
// 拼接命令行的命令
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("mysqldump -t --opt -h").append(clientIp)
// 用户名、密码、表名
.append(" --user=").append(userName).append(" --password=").append(userPsw).append(tableInfo)
// 条件语句
.append(" --where=").append(strFilter)
.append(" --lock-all-tables=true")
// 导出路径
.append(" --result-file=").append(strFilePath).append(" --default-character-set=utf8");
// 调用外部执行exe文件的javaAPI
logger.info("执行mysql指令:" + stringBuilder.toString());
Process process = Runtime.getRuntime().exec(stringBuilder.toString());
return process.waitFor();
}
其中backupLoginfo()方法是备份数据的调用方法,传入的参数是连接mysql的信息,类如下,可以备份某个数据库的表的全部数据或者选择一部分数据。这里通过参数backupAll来确定,当backupAll=true的时候,那么输入备份的时间。
/**
* 用于映射lnd.oper.datasource.DataSourceParam,传递数据库连接参数
*/
public class ConnectParam {
public String ip;
public String databaseName;
public String userName;
public String password;
}
更多推荐
已为社区贡献1条内容
所有评论(0)