Oracle 数据库自动备份方案

1、新建 backup.bat脚本

 1 @echo off 
 2 echo ================================================ 
 3 echo  Windows环境下Oracle数据库的自动备份脚本
 4 echo  1. 使用当前日期命名备份文件。
 5 echo ================================================
 6 ::以“YYYYMMDD”格式取出当前时间。
 7 set BACKUPDATE=%date:~0,4%%date:~5,2%%date:~8,2%
 8 ::设置用户名、密码和要备份的数据库。
 9 set USER=用户名
10 set PASSWORD=密码
11 set DATABASE=数据库实例名
12 ::创建备份目录。
13 if not exist "E:\backup\backuptempdir"         mkdir E:\backup\backuptempdir
14 
15 set DATADIR=E:\backup\backuptempdir
16 expdp '%USER%/%PASSWORD%@%DATABASE% as sysdba' directory=dump_dir dumpfile=data_%BACKUPDATE%.dmp full=y;
17 exit

创建 windows任务计划:

3、编写拷贝程序

  1 import java.io.*;
  2 import java.util.*;
  3 import java.net.URL;
  4 import java.text.SimpleDateFormat;
  5 
  6 public class BackupFile{
  7 
  8     //1、获取当前路径
  9     //2、读取当前路径下的属性文件,获取源文件夹和目标文件夹所在目录
 10     //3、拷贝源文件夹下的所有内容至目标文件夹
 11     //4、清空源文件夹
 12     //5、保留30天以内的数据库备份
 13     public static void main(String args[]){
 14 
 15         //获取当前路径
 16         String path = getCurrentPath();
 17         File file = new File(path + "/dirIndex.properties" );
 18 
 19         if(!file.exists()){
 20             System.out.println("配置文件不存在!");
 21             System.exit(1);
 22         }
 23         
 24         //读取当前路径下的属性文件,获取源文件夹和目标文件夹所在目录
 25         Map<String,String> dirConfig = getCopyPath();
 26         
 27         String source = dirConfig.get("sourceDir");
 28         String dest = dirConfig.get("destinationDir");
 29 
 30         File sourceDir = new File(source);//源文件夹
 31         File destinationDir = new File(dest);//目标文件夹
 32         
 33         if(!sourceDir.exists()){
 34             System.out.println("源文件夹不存在!");
 35             System.exit(1);
 36         }
 37 
 38         if(!destinationDir.exists()){
 39             System.out.println("目标文件夹不存在!");
 40             //清空源文件夹
 41             deleteSourceFileChildren(source);
 42             System.exit(1);
 43         }
 44 
 45         //拷贝源文件夹下的所有文件至目标文件夹
 46         copyFiles(source,dest);
 47 
 48         //清空源文件夹
 49         deleteSourceFileChildren(source);
 50 
 51         //保留30天以内的数据库备份
 52         retainData(dest);
 53     }
 54     
 55     /**
 56     * 获取当前路径
 57     */
 58     public static String getCurrentPath(){
 59         String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
 60         return path;
 61     }
 62 
 63     /**
 64     * 读取当前路径下的属性文件,获取源文件夹和目标文件夹所在目录
 65     */
 66     public static Map<String,String> getCopyPath(){
 67         Map<String, String> propMap = new HashMap<String, String>();
 68 
 69         ClassLoader loader = Thread.currentThread().getContextClassLoader();
 70         URL url = loader.getResource("dirIndex.properties");
 71         InputStream in = null;
 72         try {
 73             in = url.openStream();
 74             Properties props = new Properties();
 75             props.load(in);
 76             // 加载属性列表
 77             Iterator<String> it = props.stringPropertyNames().iterator();
 78             while (it.hasNext()) {
 79                 String key = it.next();
 80                 String value = props.getProperty(key);
 81                 propMap.put(key, value);
 82             }
 83         } catch (IOException ioe) {
 84             ioe.printStackTrace();
 85         }finally{
 86             try {
 87                 in.close();
 88             } catch (IOException e) {
 89                 e.printStackTrace();
 90             }
 91         }
 92         return propMap;
 93     }
 94     
 95     /**
 96     * 拷贝源文件夹下的所有内容至目标文件夹
 97     */
 98     public static void copyFiles(String sourceFile,String destinationFile){
 99         Date date = new Date();
100         SimpleDateFormat sbf = new SimpleDateFormat("yyyyMMdd");
101         String fileName = sbf.format(date);
102         System.out.println(fileName);
103         String destFileStr = destinationFile + "/" + fileName;
104         File destFile = new File(destFileStr);
105         if(destFile.exists()){
106             deleteDir(destFile);//如果存在,删除该目录
107         }
108         
109         try{
110             destFile.mkdirs();
111             
112             File inputFile = new File(sourceFile);
113 
114             File[] files = inputFile.listFiles();
115             FileInputStream input = null;
116             FileOutputStream output = null;
117 
118             long start = System.currentTimeMillis();
119 
120             copyFile(sourceFile,destFileStr);//拷贝所有内容至目标文件夹
121 
122             long end = System.currentTimeMillis();
123             System.out.println("共耗时:" + (end - start) + "ms." );
124             
125         }catch(Exception e){
126             e.printStackTrace();
127         }
128         
129     }
130 
131     //清空源文件夹
132     public static void deleteSourceFileChildren(String sourceFilePath){
133         File file = new File(sourceFilePath);
134         if(file.exists()){
135             deleteDir(file);
136             file.mkdirs();
137         }
138     }
139 
140     //保留30天以内的数据库备份
141     public static void retainData(String dataPath){
142         File file = new File(dataPath);
143         File[] children = file.listFiles();
144         
145         try{
146             Date date = new Date();
147             SimpleDateFormat sbf = new SimpleDateFormat("yyyyMMdd");
148             String dateStr = sbf.format(date);
149             String dirNames[] = new String[children.length];
150             for(int i=0; i<dirNames.length; i++){
151                 File child = children[i];
152                 if(child.isDirectory()){
153                     dirNames[i] = child.getName();
154                 }
155             }
156             System.out.println("文件夹长度:" + dirNames.length);
157             //如果备份数量小于30,则不删除
158             if(dirNames.length <= 30){
159                 System.out.println("备份文件小于等于30份,不做删除。");
160             }else{
161             //如果备份数量大于30,则删除剩余的几个
162                 List<Integer> dirNum = new ArrayList<Integer>();
163                 for( String dirName : dirNames){
164                     if(dirName.matches("[0-9]{8}")){
165                         dirNum.add(Integer.parseInt(dirName));
166                     }
167                 }
168                 Integer[] dirArr = new Integer[1];
169                 dirArr = dirNum.toArray(dirArr);
170                 Arrays.sort(dirArr);
171                 dirArr = Arrays.copyOfRange(dirArr,0,dirArr.length - 30);
172                 for(int i=0; i<dirArr.length; i++){
173                     deleteDir(new File(dataPath + "/" + dirArr[i] + "" ) );
174                 }
175             }
176         }catch(Exception e){
177             e.printStackTrace();
178         }
179         
180     }
181 
182     /**
183     *    拷贝文件夹下所有内容(文件夹和文件)到另一个文件夹
184     */
185     public static boolean copyFile(String sourceStr,String destStr){
186         File[] children = new File(sourceStr).listFiles();
187         FileInputStream input = null;
188         FileOutputStream output = null;
189         try{
190             for(int i=0; i<children.length; i++){
191                 if(children[i].isDirectory()){
192                     String newFilePath = destStr + "/" + children[i].getName();
193                     File newFile = new File(newFilePath);
194                     newFile.mkdir();
195                     copyFile( (sourceStr + "/" + children[i].getName()),newFilePath);
196                 }else{
197                     input = new FileInputStream(sourceStr + "/" + children[i].getName() );
198                     output = new FileOutputStream(destStr + "/" + children[i].getName() );
199                     byte[] data = new byte[1024 * 512];
200                     int len;
201                     while( (len = input.read(data)) != -1 ){
202                         output.write(data,0,len);
203                     }
204                     input.close();
205                     output.close();
206                 }
207             }
208         }catch(Exception e){
209             e.printStackTrace();
210             return false;
211         }
212         return true;
213     }
214 
215     /**
216     * 删除目录及目录下所有内容
217     */
218     public static boolean deleteDir(File file){
219         if(file.isDirectory()){
220             String[] children = file.list();
221             for(int i=0; i<children.length; i++){
222                 boolean isSuccess = deleteDir(new File(file,children[i]));
223                 if(!isSuccess){
224                     return isSuccess;
225                 }
226             }
227         }
228         return file.delete();
229     }
230 
231 }
View Code

属性配置文件 dirIndex.properties:

1 #源目录
2 sourceDir=E:/backup/backuptempdir
3 #目标目录
4 destinationDir=H:/
View Code

编译 BackupFile.java 后形成 BackupFile.class 文件

4、编写拷贝脚本 copy.bat

1 cd C:\DBBACKUP\BACKUPPRO
2 java BackupFile
View Code

5、设定windows任务计划

注意:很多目录和磁盘事先要有,如果没有,新建或者更改就行了。

posted @ 2017-04-06 10:39  流年如水烟雨随风  阅读(11931)  评论(0编辑  收藏  举报