• 数据库自动备份参考代码


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

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

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

    方案:

    ①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;
        }
  • 相关阅读:
    java -inally转
    11.Android-Xml读写
    10.Android-SharedPreferences使用
    9.Android-读写SD卡案例
    8.Android-简单的登录案例编写
    7.Android-压力测试、单元测试、日志猫使用
    python 向mysql中存储图片以及读取图片
    Android Studio 4.0+ 中新的 UI 层次结构调试工具
    微信小程序又放大招,代码包的大小限制由1M扩到2M
    硅谷禁书全集(5册)- 带完整封面目录,全面优化版
  • 原文地址:https://www.cnblogs.com/Kingram/p/9933674.html
Copyright © 2020-2023  润新知