使用场景:在Java代码中调用mysqldump命令实现对指定的mysql数据库和指定的表导出为sql文件。
mysqldump 简介
mysqldump 是 MySQL 自带的逻辑备份工具。
它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。
要想使用我们需要找到mysql安装目录下的bin下的mysqldump.exe,因为没有将其添加到环境变量中,所以需要找到其所在的全路径。
1、我们可以直接在bin目录下直接运行cmd,输入如下命令即可进行备份:
mysqldump -h IP地址 -P 端口号 -u用户名 -p密码 数据库名称 数据表 --where="条件" --result-file=备份文件的路径(E:/back/efgg.sql)
2、也可在java代码中实现备份操作,在代码中实现不用我们每次都用cmd命令来执行
yml配置:
backups:
# 数据库地址 IP地址
dbAddress: IP地址
# 端口号
dbPost: 端口号
# 要备份的数据库名称
databaseName: 数据库名称
# 用户名
username: 用户名
# 密码
password: 密码
# mysql安装bin目录 mysqldump存放路径
mySQLPath: D:/.../bin/
# 备份文件存放路径
pathPrefix: E:/backup/
# 文件后缀名
fileSuffix: .sql
新建一个java文件,用于初始化yml设置的参数
/**
* 设置静态参数初始化
*/
@Configuration
public class StaticConfig {
@Value(value = "${backups.pathPrefix}")
private String pathPrefix;
@Value(value = "${backups.username}")
private String username;
@Value(value = "${backups.password}")
private String password;
@Value(value = "${backups.dbAddress}")
private String dbAddress;
@Value(value = "${backups.databaseName}")
private String databaseName;
@Value(value = "${backups.mySQLPath}")
private String mySQLPath;
@Value(value = "${backups.fileSuffix}")
private String fileSuffix;
@Value(value = "${backups.dbPost}")
private String dbPost;
@Bean
public void initStatic() {
ScheduledTask.pathPrefix = pathPrefix;
ScheduledTask.fileSuffix = fileSuffix;
// 拼接命令
String command = mySQLPath+"mysqldump -h "+dbAddress+" -P "+dbPost+" -u"+username+" -p"+password+" --default-character-set=utf8 "+databaseName+" ";
ScheduledTask.setExecutiveCommand(command);
}
}
再新建一个java文件,用于处理数据备份
public class ScheduledTask {
/**
* 备份文件存放路径
*/
public static String pathPrefix;
/**
* 文件后缀名
*/
public static String fileSuffix;
/**
* 执行命令
*/
public static String executiveCommand;
public static void setExecutiveCommand(String command){
executiveCommand = command;
}
/**
* 对数据表进行备份
* @param tableName 要备份的数据表
* @param endDate 备份结束日期
*/
public Boolean backUpTable(String tableName,String endDate) {
try {
StringBuilder command = new StringBuilder();
Runtime rt = Runtime.getRuntime();
Process pro = null;
command.append(executiveCommand);
// 要备份的数据表
command.append(tableName);
command.append(" ");
// 拼接查询条件
String query = "--where=\"DATE_FORMAT(create_time,'%Y-%m-%d') BETWEEN "+"\'2020-01-01\'"+" AND "+"\'"+endDate+"\'"+"\"";
// 拼接查询条件
command.append(query);
command.append(" ");
String time = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date());
String parentPath = pathPrefix + tableName + "/";
// 备份文件存放路径
String fileName = parentPath + time + fileSuffix;
// 防止目录与文件不存在
File parentFile = new File(parentPath);
File subPath = new File(fileName);
// 判断目录是否存在
if (!parentFile.isDirectory()) {
parentFile.mkdirs();
}
// 判断文件是否存在
if (!subPath.exists()) {
// 不存在则创建
subPath.createNewFile();
}
command.append("--result-file=" + fileName);
pro = rt.exec(command.toString());
// 该语句用于标记,如果备份没有完成,则该线程持续等待
pro.waitFor();
System.out.println(tableName+"表备份成功");
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
}
在控制器执行下面的方法
public void databaseBack(){
try{
// 获取结束时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String endDate = sdf.format(new Date());
// 需要备份的数据表
String tableName = "数据表";
ScheduledTask scheduledTask = new ScheduledTask();
// 对数据表进行备份
Boolean success= scheduledTask.backUpTable(tableName,endDate);
if(success){
// 备份成功后要执行的操作,如删除表中数据
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
执行方法即可对数据表进行备份。