import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.File;
/**
* @author cs 20190924
*/
@Configuration
@Component
@EnableScheduling
public class BackUpConfig {
private static Logger logger = LoggerFactory.getLogger(BackUpConfig.class);
private static final String BACK_UP_ALL_TABLES = "1alltables";
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${backup.source.savePath}")
private String savePath;
@Value("${backup.source.filename}")
private String filename;
@Value("${backup.source.databaseName}")
private String databaseName;
@Value("${backup.source.mysqldump}")
private String mysqldump;
@Value("${backup.source.hostIP}")
private String hostIP;
/**
* cron表达式:Seconds Minutes Hours DayofMonth Month DayofWeek [Year]
* 每天凌晨4点自动执行数据库备份操作
*/
@Scheduled(cron = "0 0 4 1/1 * ? ")
public void backUpDatabase(){
exportDatabaseTool(mysqldump,hostIP,username,password, savePath,filename,databaseName,BACK_UP_ALL_TABLES);
}
/**
* Java代码实现MySQL数据库导出
*
* @author GaoHuanjie
* @param hostIP MySQL数据库所在服务器地址IP
* @param userName 进入数据库所需要的用户名
* @param password 进入数据库所需要的密码
* @param savePath 数据库导出文件保存路径
* @param fileName 数据库导出文件文件名
* @param databaseName 要导出的数据库名
* @return 返回true表示导出成功,否则返回false。
*/
public static boolean exportDatabaseTool(String mysqldump,String hostIP, String userName, String password, String savePath, String fileName,
String databaseName,String tableName) {
File saveFile = new File(savePath);
if (!saveFile.exists()) {// 如果目录不存在
saveFile.mkdirs();// 创建文件夹
}
if (!savePath.endsWith(File.separator)) {
savePath = savePath + File.separator;
}
String sql = mysqldump+" -h"+hostIP+" -u"+userName+" -p"+password+" "+databaseName+" "+(tableName.equals(BACK_UP_ALL_TABLES)?"":tableName)+" > "+savePath+fileName;
logger.debug(sql);
try {
String[] commands = { "/bin/sh", "-c",sql};
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(commands);
logger.debug("process.waitFor:"+process.waitFor());
if (process.waitFor() == 0) {// 0 表示线程正常终止。
logger.debug("数据库备份成功^_^");
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 数据导入到数据库
* @param mysqldump
* @param hostIP
* @param userName
* @param password
* @param savePath
* @param fileName
* @param tableName
* @param databaseName
* @return
*/
public static boolean recover(String mysqldump, String hostIP, String userName, String password, String savePath, String fileName, String tableName,
String databaseName) {
if (exportDatabaseTool(mysqldump,hostIP,userName,password,savePath,fileName,databaseName,tableName)){
String sql = "mysql -h"+hostIP+" -u"+userName+" -p"+password+" -t "+databaseName+" < "+savePath+"/"+fileName;
logger.debug(sql);
String[] commands = {"/bin/sh", "-c", sql};
Process process = null;
try {
Runtime runtime = Runtime.getRuntime();
process = runtime.exec(commands);
logger.debug("process.waitFor:"+process.waitFor());
if (process.waitFor() == 0) {// 0 表示线程正常终止。
logger.debug("数据已从 " +savePath+fileName + " 导入到数据库中");
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
}