springboot 数据库备份

springboot 数据库备份

备份成功的前提,需要配置mysql环境变量,然后重启电脑

  1. 实体类
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;
}
  1. 数据库备份 实现类
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(database_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("网络异常,数据库备份失败");
        }
    }
}
  1. 控制类
/**
     * 数据库用户名
     */
    @Value("${spring.datasource.druid.username}")
    private String userName;

    /**
     * 数据库密码
     */
    @Value("${spring.datasource.druid.password}")
    private String password;

    /**
     * 数据库ip
     */
    @Value("${spring.datasource.ip}")
    private String ip;

    /**
     * 数据库端口号
     */
    @Value("${spring.datasource.port}")
    private String port;

    /**
     * 数据库名称
     */
    @Value("${spring.datasource.dbname}")
    private String dbname;

    /**
     * Windows数据库备份地址
     */
    @Value("${spring.datasource.win-path}")
    private String windowsPath;

    /**
     * Linux数据库备份地址
     */
    @Value("${spring.datasource.linux-path}")
    private String linuxPath;

	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;
    }
  1. 工具类Constant
/**
     * 文件后缀
     */
    public static final String FILE_SUFFIX = ".sql";
	
	/**
     * 判断操作系统类型、Linux|Windows
     */
    public static boolean isSystem(String osName) {
        Boolean flag = null;
        if (osName.startsWith("windows")) {
            flag = true;
        } else if (osName.startsWith("linux")) {
            flag = false;
        }
        return flag;
    }
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值