数据库自动备份参考代码

前言:这两天在写数据库备份的功能,目前已经实现了,还在调试,这里把我的第一版本的代码贴上来,备份一下。下次遇到做个参考。

需求:实现数据库自动备份,指定时间,每个月备份一次,并且自动删除两个月之前的备份文件。即保留最新的两个月的备份文件。

思路:我的思路是这样的,第一次定时备份文件的时候加上定时器,这个备份文件在两个月之后自己删除。这么写有点不好的就是没存数据库,后续再修改。

方案:

①db_manage.properties配置数据库bin目录路径,备份文件存储路径,备份周期,删除周期

db_backup_command_url=D:/bin/
db_backup_file_url=D:/XXX_database_backup/
#Make backups every 30 days  
distancetime=2592000000
#Delete file every 60 days 
delete_delay=5184000000

②DBBackupsUtil中的addDBbak()方法实现备份功能.

// 数据库备份
    public static Map<String, String> addDBbak() throws Exception {
        map.clear();
        pro = new Properties();
        try {
            pro.load(DBBackupsUtil.class.getClassLoader().getResourceAsStream("db_manage.properties"));
        } catch (Exception e) {
            e.printStackTrace();
        }

        BufferedWriter mBufWriter = null;

        // 建立一个BackupDb.bat文件
        String prix = "bat";
        String system_name = System.getProperty("os.name");
        if (system_name != null) {
            if (system_name.toLowerCase().startsWith("win")) {
                prix = "bat";
            }
            if (system_name.toLowerCase().startsWith("linux") || system_name.toLowerCase().startsWith("mac")) {
                prix = "sh";
            }
        }
        FileWriter fileWriter = new FileWriter("BackupDb." + prix);
        mBufWriter = new BufferedWriter(fileWriter);

        /*
         * 把数据库备份方法写入BackupDb.bat文件中。 BackupDbUrl 是数据库备份命令。 pg_dump.exe -U postgres -E
         * utf8 test 备份数据库命令。 —U postgres 数据库用户名 -E utf8 设定字符编码格式。test 数据库名 BackupDbName
         * 备份文件所存目录和名称,我是以备份时间命名。
         */
        String BackupDbUrl = pro.getProperty("db_backup_command_url") + "pg_dump -h 192.168.1.1  -U postgres XXX >";// 本地备份代码
        Date NowTimes = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

        String BackupDbName = pro.getProperty("db_backup_file_url") + "XXX_" + sdf.format(NowTimes) + ".backup";
        File file = new File(BackupDbName);
        if (file.exists()) {
            file.delete();
        }
        mBufWriter.write(BackupDbUrl);// 本机数据库
        // mBufWriter.write(BackupDbUrlserver);//服务器数据库
        mBufWriter.write(BackupDbName);
        mBufWriter.newLine();
        mBufWriter.flush();
        mBufWriter.close();
        try {
            Process process = Runtime.getRuntime().exec("BackupDb." + prix); // 执行BackupDb.bat文件进行备份数据库
            int out = process.waitFor();
            map.put("status", String.valueOf(out));
            map.put("data_name", BackupDbName.substring(BackupDbName.lastIndexOf("/") + 1));
            map.put("fileAddress",BackupDbName);
            map.put("create_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(NowTimes));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

③autoBackup()方法实现自动备份功能,加入定时器

// 定时备份
    public static void autoBackup(String backuptime) {

        /**定义定时周期*/
        final long PERIOD_DAY = Long.parseLong(PropertiesUtil.getValue("db_manage.properties", "distancetime"));
        
        String[] time = backuptime.split(":");
        int hours = Integer.parseInt(time[0]);
        int minute = Integer.parseInt(time[1]);
        int second = Integer.parseInt(time[2]);

        // 调用util包中的日历,设置时间
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hours);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        Date date = calendar.getTime(); // 第一次执行定时任务的时间

        /** 如果第一次执行定时任务的时间 小于当前的时间
         *  此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
         */
        if (date.before(new Date())) {
            date = addDay(date, 1);
        }
        // 启动定时器控件
        Timer timer = new Timer();

        TimerTask main_task = new TimerTask() {
            @Override
            public void run() {
                try {
                    System.out.println(new Date() + "  start database backup...");
                    String fileAddress = addDBbak().get("fileAddress");
                    DBBackupsUtil.timeToDelete(fileAddress);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        // 安排指定的任务在指定的时间开始进行重复的固定延迟执行
        timer.schedule(main_task, date, PERIOD_DAY);
    }
public static Date addDay(Date date, int num) {
        Calendar startDT = Calendar.getInstance();
        startDT.setTime(date);
        startDT.add(Calendar.DAY_OF_MONTH, num);
        return startDT.getTime();
    }

④定时删除备份文件(两个月后)

public static void  timeToDelete(final String fireAddress) {
        long delay = Long.parseLong(PropertiesUtil.getValue("db_manage.properties", "delete_delay"));
        Timer timer = new Timer();
        TimerTask del_task = new TimerTask() {
            @Override
            public void run() {
                if(deleteFile(fireAddress)) {
                    System.out.println("delete backupFile success...");
                }
            }
        };
        timer.schedule(del_task, delay);
    }
public static boolean deleteFile(String fireAddress) {
        boolean flag = false;
        File file = new File(fireAddress);
        if(file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

 

posted @ 2018-11-09 10:29  Kingram  阅读(935)  评论(0编辑  收藏  举报