java后端使用mysqldump备份数据库

java后端使用mysqldump命令备份数据库

Posted by John Doe on 2020-08-24
Words 589 and Reading Time 2 Minutes
Viewed Times

背景

在接老师开发商业性质的项目的时候,接受了一个前端操作向后端发送请求进行数据库备份文件生成于下载的任务,花费了自己蛮多心血特此记录一下。

任务要求

在指定页面以form表单(采用layui框架)显示出相关企业单位的备份信息(备份时间、备份文件名,文件名显示备份完成时间、备份相关内容、备份次数),同时提供操作栏进行备份下载于删除操作

核心完成方法

java拼接mysqldump运行指令,并执行,由于数据库冗余较少涉及多次命令拼接与执行耗费较多时间(mysqldump指令在我的查找各种博客和官方文档暂未看到像sql查询语句的in、not in、or关键词字段进行条件判断只得在—where上下功夫)
注意:mysqldump数据库备份可导致锁表,对一个正在运行的数据库进行备份请慎重!! 如果一定要 在服务运行期间备份,请添加 —skip-opt

1
mysqldump --skip-opt -h hostip -u root --password=password DatabaseName >xxxx.sql

废话少说下面是示例代码:
path: 备份文件的生成路径地址
dateString:转换为yyyyMMddHHmm格式的date字符串
ent_id: 主键id(String)
userTableName: 所有需要备份的表名字符串(“,”分隔的字符串)
user: 备份相关数据库的用户名
password: 备份相关数据库的密码
hostIP: 数据库IP地址
exportDatabaseName: 备份的数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public void exportSql(String path, String dateString, String ent_id,String userTableName,String user, String password, String hostIP, String exportDatabaseName) {
String folderName_1 = "ZYK_" + ent_id + "_BackupENT_" + dateString + ".sql";
File saveFile = new File(path);
// 如果目录不存在
if (!saveFile.exists()) {
// 创建文件夹
saveFile.mkdirs();
}
if(!path.endsWith(File.separator)){
path = path + File.separator;
}
//备份有ent_id字段列的表
PrintWriter printWriter = null;
BufferedReader bufferedReader = null;
try {
printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(path + folderName_1), "utf8"));
Process process = Runtime.getRuntime().exec(" mysqldump -h" + hostIP + " -u" + user + " -p" + password + " --set-charset=UTF8 " + exportDatabaseName +" --tables "+entTableName+" "+"--where=\"ent_id='"+ ent_id + "'\"");
InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
printWriter.println(line);
}
printWriter.flush();
if (process.waitFor() != 0) {
throw new CustomException("线程未正常中止");
}
} catch (Exception e) {
e.printStackTrace();
throw new CustomException("备份sql操作失败");
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (printWriter != null) {
printWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


This is copyright.

...

...

00:00
00:00