由于项目中需要用到在页面添加一个一键数据备份的功能,所以选择使用mysqldump命令的方法,用java的运行时类Java.lang.Runtime来使用后台窗口,记录下整个实现的过程;
1.首先mysqldump命令需要在mysql的bin目录下执行,这里我配置了msyql的环境变量,可以在命令窗口的默认目录下执行;
在环境变量的path栏里面添加mysql下面的bin文件夹路径即可:
2.我们win+R启动命令窗口,键入导出数据库的命令,命令为:
mysqldump -h数据库服务器IP -P数据库使用端口号 -u账户 -p密码 数据库名>保存路径
注意:-p要紧跟你的数据库密码;
我们通过上图可以发现键入命令后报警,但是我们去路径下会发现sql已经导出成功,这个问题应该是在MySQL5.6+版本的时候就有出现,是为了确保数据库的安全性采用的保护机制,因为我们将密码暴露在了命令中,我们可以将相关ip地址、数据库名称以及密码在mysql的配置文件my.ini中进行配置,然后再执行该命令,在mysqldump后添加配置文件路径即可,这里不再进行赘述;
进行到这,我们的命令已经可以成功导出sql了,接下来就需要在java中进行实现;
3.java实现数据库的一键导出备份:
3.1js前台代码
//按钮
<button class="layui-btn layui-btn-sm layui-btn-normal" id="backup">一键备份</button>
//函数事件
$(document).on('click', '#backup',function() {
$.ajax({
url: interface_backup,
type: "post",
datatype: "json",
success: function(data){
if(data.code== "200"){
layer.msg("创建备份成功,请您至本地D盘文件夹下查看!",{icon:1,time: 5000});
}
else{
layer.msg("创建备份失败,请联系管理员!",{icon:2,time:5000});
}
}
})
});
3.2java后台代码
controller代码:
/**
* 数据库备份
*/
@PostMapping(value = "/backup")
@EnableLog(module = "数据库备份", operation = "数据库备份", operationType = OperationType.SELECT)
public ResponseResult backup() {
return this.service.backup();
}
service代码:
public ResponseResult backup() {
ResponseResult result = new ResponseResult();
UserContext crtUser = UserContextHolder.userContext();
String filePath="D:\\";
SimpleDateFormat df = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");//设置日期格式
String time = df.format(new Date());
String dbName="data";//备份的数据库名字为small
try {
Process process = Runtime.getRuntime().exec(
"cmd /c mysqldump -h10.130.15.13 -P3306 -u data -p123456 " + dbName + " > "
+ filePath + "/" + "系统备份"+time
+ ".sql");
result.setCode(1000);
result.setLogMsg(crtUser.getUserName()+"备份了系统数据");
result.setSuccess(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
result.setCode(-1000);
result.setSuccess(false);
}
return result;
}
总结:至此,预想的功能便实现了,实现起来不难,但过程中遇到的问题确实也比较多,需要一步步耐心的解决;数据库的一键导入也与之类似,导出的sql再导入其他高版本或者低版本数据库时会出现格式无法兼容的情况,所以尽量导出与导入的数据库版本控制在相同的情况下。
欢迎参考的朋友在评论区提出其他更好的办法或者对本文中不对的地方进行指正留言。