java备份mysql数据库表

备份使用的方法:
public class SqlBackupUtil {

    private static final Logger log = LoggerFactory.getLogger(SqlBackupUtil.class);
    /**
     * 备份数据库db
     */
    public static void dbBackUp(String ip, String uname, String pwd, String dbName) {
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd-HH-mm-sss");
        String backName = dateFormat.format(date) + ".sql";
        String pathSql = "";
        //输出流文件
        File fileSql;
        boolean inDocker = false;
        try {
            //判断系统
            String osName = System.getProperties().getProperty("os.name");
            if (osName.equals("Linux")) {
                pathSql = SalishConfig.getBackupPath() + "/" + dbName + "/" + backName;
                Path path = Paths.get("/proc/1/cgroup");
                if (Files.exists(path)) {
                    String content = new String(Files.readAllBytes(path));
                    inDocker = content.contains("docker");
                }
            } else {
                pathSql = SalishConfig.getWinProfile() + "\\" + dbName + "\\" + backName;
            }

            //输出流文件
            fileSql = new File(pathSql);
            //创建备份sql文件
            if (!fileSql.exists()) {
                if (!fileSql.getParentFile().exists()) {
                    fileSql.getParentFile().mkdirs();
                }
                fileSql.createNewFile();
            }

            //mysqldump -hlocalhost -uroot -p123456 db > /home/back.sql  整个库进行备份sql文件
            //mysqldump -hlocalhost -uroot -p123456 数据库名  数据表名 > /home/back.sql  单张表备份sql文件
            StringBuffer sb = new StringBuffer();
            if (inDocker) {
                sb.append("docker exec mysql sh -c ");
                sb.append("\'mysqldump");
                sb.append(" -h" + ip);
                sb.append(" " + dbName);
                sb.append(" -u" + uname);
                sb.append(" -p" + pwd + " 2>/dev/null\'");
                sb.append(" -r ");//java中必须使用"-r"替代">"
                sb.append(pathSql);
            } else {
                sb.append("mysqldump");
                sb.append(" -h " + ip);
                sb.append(" -u " + uname);
                sb.append(" -p " + pwd);
                sb.append(" " + dbName + " ");
                sb.append(" -r ");//java中必须使用"-r"替代">"
                sb.append(pathSql);
            }
            log.error(sb.toString());
            Process process = null;
            //判断系统
            if (osName.equals("Linux")) {
                BufferedReader bufferedReader = null;
                PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(fileSql), "utf8"));

                if (inDocker) {
                    process = new ProcessBuilder("/bin/sh", "-c", sb.toString()).start();
                } else {
                    process = Runtime.getRuntime().exec(sb.toString());
                }
                InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
                bufferedReader = new BufferedReader(inputStreamReader);
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    printWriter.println(line);
                }
                printWriter.flush();
                log.info("-==[ 备份结束! ]==-");
            } else {
                System.out.println("cmd命令为:" + "cmd /c " + sb.toString());
                process = Runtime.getRuntime().exec("cmd /c " + sb.toString());//执行语句
            }
            process.waitFor();//等待上述命令执行完毕后打印下面log

            //输出错误信息
            InputStream is = process.getErrorStream();
            InputStreamReader isr = new InputStreamReader(is, "gbk");//读取
            System.out.println(isr.getEncoding());
            BufferedReader bufr = new BufferedReader(isr);//缓冲
            String line = null;
            while ((line = bufr.readLine()) != null) {
                System.out.println("error:" + line);
            }
            isr.close();
            log.info("数据库备份结束,备份结果:{}", process.exitValue() == 0 ? "success" : "fail");
        } catch (Exception e) {
            log.error("数据库备份失败:{}", e.getMessage());
        }
    }

}
	//备份数据库所用的方法
    public SqlBackupServiceImpl(Scheduler scheduler) {
        this.scheduler = scheduler;
    }
    //初始化备份任务
    public void init() throws SchedulerException, TaskException
    {
        List<SqlBackup> jobList = this.baseMapper.selectList(new QueryWrapper<>());
        for (SqlBackup job : jobList)
        {
            ScheduleUtils.createScheduleJoGeneral(scheduler, toJob(job), "sqlTask");
        }
    }
		//更新任务
    public void updateSchedulerJob(SysJob job, String jobGroup ,String key) throws SchedulerException, TaskException
    {
        String jobId = key + job.getJobId();
        // 判断是否存在
        JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
        if (scheduler.checkExists(jobKey))
        {
            // 防止创建时存在数据问题 先移除,然后在执行创建操作
            scheduler.deleteJob(jobKey);
        }
        ScheduleUtils.createScheduleJoGeneral(scheduler, job, "sqlTask");
    }
		//立即运行任务
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void run(SqlBackup backup) throws SchedulerException
    {
        String jobId = "sqlTask" + backup.getId();
        SqlBackup sqlBackup = this.getById(backup.getId());
        // 参数
        JobDataMap dataMap = new JobDataMap();
        dataMap.put(ScheduleConstants.TASK_PROPERTIES, toJob(sqlBackup));
        scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, "SQL"), dataMap);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值