Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说springboot 数据库备份[亲测有效],希望能够帮助你!!!。
public class MysqlBackups implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
/** * mysql ip端口 */
private String mysqlIp;
/** * 数据库端口号 */
private String mysqlPort;
/** * 备份命令 */
private String mysqlCmd;
/** * 恢复命令 */
private String mysqlBackCmd;
/** * 数据库名称 */
private String databaseName;
/** * 备份文件名称 */
private String backupsName;
/** * 备份路径 */
private String backupsPath;
/** * 操作次数 */
private Integer operation;
/** * 备份时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date backupTime;
/** * 恢复时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date recoveryTime;
/** * 备注 */
private String remark;
}
public interface IMysqlBackupsService extends IService<MysqlBackups> {
/** * 数据库备份 * @param filePath 备份地址 * @param userName 数据库名称 * @param password 数据库密码 * @param ip 数据库ip * @param port 数据库端口号 * @param database_name 数据库名称 * @param remark * @return */
R mysqlBackups(String filePath, String ip, String port, String database_name, String userName, String password, String remark);
}
@Service
public class MysqlBackupsServiceImpl extends ServiceImpl<MysqlBackupsMapper, MysqlBackups> implements IMysqlBackupsService {
/** * 数据库备份 * @param filePath 备份地址 * @param userName 数据库名称 * @param password 数据库密码 * @param ip * @param port * @param database_name * @param remark * @return */
@Transactional
@Override
public R mysqlBackups(String filePath, String userName, String password, String ip, String port, String database_name, String remark) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
// 数据库文件名称
StringBuilder mysqlFileName = new StringBuilder()
.append(Constant.DATA_BASE_NAME)
.append("_")
.append(sdf.format(new Date()))
.append(Constant.FILE_SUFFIX);
// 备份命令
StringBuilder cmd = new StringBuilder()
.append("mysqldump ")
.append("--no-tablespaces ")
.append("-h")
.append(ip)
.append(" -u")
.append(userName)
.append(" -p")
.append(password)
// 排除MySQL备份表
.append(" --ignore-table ")
.append(database_name)
.append(".mysql_backups ")
.append(database_name)
.append(" > ")
.append(filePath)
.append(mysqlFileName);
// 判断文件是否保存成功
if (!new File(filePath).exists()) {
new File(filePath).mkdirs();
}
// 获取操作系统名称
String osName = System.getProperty("os.name").toLowerCase();
String[] command = new String[0];
if (Constant.isSystem(osName)) {
// Windows
command = new String[]{
"cmd", "/c", String.valueOf(cmd)};
} else {
// Linux
command = new String[]{
"/bin/sh", "-c", String.valueOf(cmd)};
}
MysqlBackups mysqlBackups = new MysqlBackups();
// 备份信息存放到数据库
mysqlBackups.setMysqlIp(ip);
mysqlBackups.setMysqlPort(port);
mysqlBackups.setBackupsName(String.valueOf(mysqlFileName));
mysqlBackups.setDatabaseName(database_name);
mysqlBackups.setMysqlCmd(String.valueOf(cmd));
mysqlBackups.setBackupsPath(filePath);
mysqlBackups.setBackupTime(new Date());
mysqlBackups.setOperation(0);
mysqlBackups.setRemark(remark);
this.save(mysqlBackups);
try {
// 获取Runtime实例
Runtime.getRuntime().exec(command);
return R.ok("Mysql 数据库备份成功,备份文件名:{}"+ mysqlFileName);
} catch (Exception e) {
e.printStackTrace();
return R.error("网络异常,数据库备份失败");
}
}
}
public R mysqlBackups(@RequestBody MysqlBackups backups) {
String path = null;
// 获取操作系统名称
String osName = System.getProperty("os.name").toLowerCase();
if (Constant.isSystem(osName)) {
// Windows
path = this.windowsPath;
} else {
// Linux
path = this.linuxPath;
}
// 数据库用户名
String userName = this.userName;
// 数据库密码
String password = this.password;
// 数据库ip
String ip = this.ip;
// 数据库端口号
String port = this.port;
// 数据库名称
String dbname = this.dbname;
R r = mysqlBackupsService.mysqlBackups(path, userName, password, ip, port, dbname , backups.getRemark());
return r;
}