springboot 数据库备份[亲测有效]

数据库 (58) 2023-08-05 09:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说springboot 数据库备份[亲测有效],希望能够帮助你!!!。

springboot 数据库备份

  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(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("网络异常,数据库备份失败");
        }
    }
}
  1. 控制类
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;
    }

发表回复