数据库自动备份参考代码
前言:这两天在写数据库备份的功能,目前已经实现了,还在调试,这里把我的第一版本的代码贴上来,备份一下。下次遇到做个参考。
需求:实现数据库自动备份,指定时间,每个月备份一次,并且自动删除两个月之前的备份文件。即保留最新的两个月的备份文件。
思路:我的思路是这样的,第一次定时备份文件的时候加上定时器,这个备份文件在两个月之后自己删除。这么写有点不好的就是没存数据库,后续再修改。
方案:
①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; }