1.背景
今天需要对mysql进行定时备份,并且根据备份记录恢复数据,这篇文章主要记录备份过程。
2.核心
mysql备份命令:mysqldump -h{host} -u{user} -p{password} {dbName} > {backupDir}
mysql恢复命令:mysql -h{host} -u{user} -p{password} {dbName} < {backupDir}
java执行命令工具类:采用第三方java工具类Hutool的命令行工具-RuntimeUtil类
3.注意点
1.通过java执行mysql备份命令时,如果是将所有的参数拼接为一条命令时,即直接执行mysqldump -h{host} -u{user} -p{password} {dbName} > {backupDir},需要将 > 替换为 -r
2.执行mysql备份命令时,如果是将所有的参数拼接为一条命令时,即直接执行mysql -h{host} -u{user} -p{password} {dbName} < {backupDir},需要在命令前先执行 /bin/sh 和 -c
//判断操作系统请参考:http://blog.chinaunix.net/uid-29491520-id-4471694.html
public static List<String> initCommands() {
List<String> commands = CollectionUtil.newArrayList();
if (OperatingSystemEnum.getOperatingSystem() == Linux) {
commands.add("/bin/sh");
commands.add("-c");
}
if (OperatingSystemEnum.getOperatingSystem() == Windows) {
commands.add("cmd /c");
}
return commands;
}
3.RuntimeUtil执行完命令后,调用waitFor()方法可以判断脚本是否执行成功,返回0执行成功,非0则执行失败。如果执行的是脚本文件,该返回值应该是最后一条命令执行结果的返回值(不确定,实际测试总结的粗浅想法,有朋友知道可以告诉下我)。通过getResult()方法可以获得脚本执行中的输出。简单理解为,waitFor()返回非0时,getResult()返回的是错误信息。
4.RuntimeUtil的getResult()和 getErrorResult()不能同时调用。
4.代码记录
4.1java执行脚本
List<String> commands = OperatingSystemEnum.initCommands();
commands.add(script);
Process process = RuntimeUtil.exec(commands.toArray(new String[commands.size()]));
exitValue = process.waitFor();
if (exitValue != GlobalConst.NoForInt) {//GlobalConst.NoForInt就是0
errorResult = RuntimeUtil.getResult(process);
}