Java备份Oracle数据库

Java线程、Process、ProcessBuilder

2010 年 6 月 20 日

文章内容描述了使用Java执行外部Oracle导出命令备份数据库功能的示例,依据此例子进行修改制造一些bug,然后将会对Java外部命令这块会有一个更加清晰的认知(个人观点仅供参考,不许拍砖,哈)


小细节
·试着把innerTh.start()这段给注释掉,然后再把用户名或密码写错。
·有些程序是不会在命令行有输出的,比如最直接的plsqldev.exe、MindManager.exe
·试着把将要执行的命令改成我们本地相关.exe程序,如上面所例或干脆TM.exe试试。

回页首

代码示例:

  1. package org.ybygjy.basic.oracle;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.nio.ByteBuffer;
  7. import java.nio.channels.Channels;
  8. import java.nio.channels.FileChannel;
  9. import java.nio.channels.ReadableByteChannel;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import java.util.Map;
  13. /**
  14. * java外部系统命令模式备份数据库
  15. * @author WangYanCheng
  16. * @version 2010-6-19
  17. */
  18. public class BackupOracleDatabase {
  19. /**
  20. * 封装执行入口
  21. */
  22. public void doWork() {
  23. InnerClass innerInst =
  24. new InnerClass("DB_USER", "DB_PASS", "127.0.0.1:1521/ORCL", "E:/dbback/BACK201006.DMP");
  25. Thread thInst = new Thread(innerInst);
  26. thInst.start();
  27. }
  28. /**
  29. * 用于分担执行命令
  30. * @author WangYanCheng
  31. * @version 2010-6-19
  32. */
  33. class InnerClass implements Runnable {
  34. /** 用户名 */
  35. private String userName;
  36. /** 密码 */
  37. private String userPass;
  38. /** 服务地址 */
  39. private String serverAddr;
  40. /** 输出文件路径 */
  41. private String outFilePath;
  42. /**
  43. * constructor
  44. * @param userName userName
  45. * @param userPass userPass
  46. * @param serverAddr 服务地址必须带<strong>端口</strong>/<strong>SID</strong>
  47. * @param outFilePath outPath
  48. */
  49. public InnerClass(String userName, String userPass, String serverAddr, String outFilePath) {
  50. this.userName = userName;
  51. this.userPass = userPass;
  52. this.serverAddr = serverAddr;
  53. this.outFilePath = outFilePath;
  54. }
  55. /**
  56. * 提供执行的命令串
  57. * @return commStr 命令串
  58. */
  59. private List doBuildCommand() {
  60. List rtnList = new ArrayList();
  61. rtnList.add("EXP");
  62. rtnList.add("@USER@/@PASSWORD@@@SERVER@".replaceAll("@USER@", this.userName)
  63. .replaceAll("@PASSWORD@", this.userPass).replaceAll("@SERVER@", this.serverAddr));
  64. rtnList.add("FILE=/"@FILE@/"".replaceAll("@FILE@", this.outFilePath));
  65. rtnList.add("TABLES=(SY_TABLE_DEF)");
  66. return rtnList;
  67. }
  68. /**
  69. * 构建ProcessBuilder实例
  70. * @param workDir 当前进程工作目录
  71. * @return pbInst ProcessBuilder实例
  72. * @see ProcessBuilder
  73. */
  74. private ProcessBuilder buildProcessBuilder(File workDir) {
  75. new ProcessBuilder();
  76. List commandArray = (doBuildCommand());
  77. ProcessBuilder pbInst = new ProcessBuilder(commandArray);
  78. pbInst.command(commandArray);
  79. Map envMap = pbInst.environment();
  80. envMap.clear();
  81. envMap.putAll(System.getenv());
  82. pbInst.directory(workDir);
  83. pbInst.redirectErrorStream(true);
  84. return pbInst;
  85. }
  86. /**
  87. * 线程执行入口
  88. */
  89. public void run() {
  90. File tmpOutFile = new File(this.outFilePath);
  91. File outDir = tmpOutFile.getParentFile();
  92. ProcessBuilder pbInst = buildProcessBuilder(outDir);
  93. try {
  94. Process proInst = pbInst.start();
  95. final InputStream ins = proInst.getInputStream();
  96. File outFile = new File(outDir, "exp.log");
  97. outFile.createNewFile();
  98. final FileChannel focInst = new FileOutputStream(outFile).getChannel();
  99. Thread innerTh = new Thread() {
  100. ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
  101. public void run() {
  102. ReadableByteChannel rbcObj = Channels.newChannel(ins);
  103. try {
  104. while (rbcObj.read(byteBuffer) != -1) {
  105. byteBuffer.flip();
  106. focInst.write(byteBuffer);
  107. byteBuffer.clear();
  108. }
  109. } catch (IOException ioe) {
  110. ioe.printStackTrace();
  111. }
  112. }
  113. };
  114. // innerTh.setDaemon(true);
  115. innerTh.start();
  116. } catch (IOException ioe) {
  117. ioe.printStackTrace();
  118. }
  119. }
  120. }
  121. /**
  122. * 测试入口
  123. * @param args 参数列表
  124. */
  125. public static void main(String[] args) {
  126. new BackupOracleDatabase().doWork();
  127. }
  128. }

Java备份Oracle数据库的更多相关文章

  1. java备份Oracle数据库表

    <html><head><title>数据备份</title><meta name="decorator" content=& ...

  2. Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份

    说明: Oracle数据库服务器操作系统:CentOSIP:192.168.0.198端口:1521SID:orclOracle数据库版本:Oracle11gR2 具体操作: 1.root用户登录服务 ...

  3. 备份Oracle数据库的脚本

    @echo off goto bakoracle :bakoracle echo. echo ★☆★  自动备份Oracle数据库   ★☆★ echo. set backpath=E:\Oracle ...

  4. Java读取oracle数据库中blob字段数据文件保存到本地文件(转载)

    转自:https://www.cnblogs.com/forever2698/p/4747349.html package com.bo.test; import java.io.FileOutput ...

  5. Oracle备份恢复之rman备份oracle数据库

    备份需求和rman备份 oracle数据库的备份相关问答: 1)备份时数据库处于何种状态? 备份时数据库处于OPEN状态,这样数据库可以正常工作. 2)备份的数据备份在什么地方? 备份在本地磁盘. 3 ...

  6. oracle入门(5)——java连接oracle数据库

    [本文介绍] 前面几篇说了那么多,最终还没讲到如何用java连接数据库,本文实用一点,讲讲如何连接数据库. [java连接oracle数据库] 1.导入jdbc驱动:看到这里,就忙着上网找驱动?不,安 ...

  7. Java连接Oracle数据库的三种连接方式

    背景: 这两天在学习Oracle数据库,这里就总结下自己上课所学的知识,同时记录下来,方便整理当天所学下的知识,也同时方便日后自己查询. SQL语句的话,这里我就不多讲了,感觉和其他的数据库(MySQ ...

  8. Linux下自动备份Oracle数据库并删除指定天数前的备份

    说明: Oracle数据库服务器 操作系统:CentOS IP:192.168.0.198 端口:1521 SID:orcl Oracle数据库版本:Oracle11gR2 具体操作: 1.root用 ...

  9. Windows Server系统定时任务备份ORACLE数据库

    Windows Server系统定时任务备份ORACLE数据库 一.编辑备份脚本 RMAN备份数据库 1.在备份脚本目录下,创建bat文件db_rman.bat set ORACLE_SID=orcl ...

随机推荐

  1. 2.1WebApi的路由

    这篇文章描述 ASP.NET Web API如何将 HTTP 请求通过路由去访问控制器. 如果你熟悉 ASP.NET MVC,Web API 路由是非常类似于 MVC 路由.主要的区别是 Web AP ...

  2. SpringMVC Controller介绍

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  3. Java poi读取,写入Excel,处理row和cell可能为空的情况

    首先需要导入包 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.NP ...

  4. tomcat不安全因素

    tomcat的提供了一个非常方便的manager系统,可以远程上传war项目,运行项目,但是这也是一个非常危险的地方,我曾经开发过一块B/S架构的小系统,提供了本地文件扫描,文件浏览,扫描等功能,并且 ...

  5. Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  6. 使用Java判断字符串中的中文字符数量

    Java判断一个字符串str中中文的个数,经过总结,有以下几种方法(全部经过验证),可根据其原理判断在何种情况下使用哪个方法: 1. char[] c = str.toCharArray(); for ...

  7. FixFFmpeg 修改官方编译的ffmpeg能在 XP 上运行的工具

    把 fixff.cmd 和 FixFFmpeg.exe 拷贝到 ffmpeg 所在的目录 运行 fixff.cmd 自动修复; fixffmpeg-20160924.7z

  8. Python之路,Day3 - Python基础3

    一.文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  9. Android studio 显示代码行号 设置

    首先我们打开我们的Android Studio.   这时会弹出setting页面,我们选择show line numbers然后点击确定按钮.   此时我们就可以看到代码左侧显示出行号了   我们可 ...

  10. 多线程下NSOperation、NSBlockOperation、NSInvocationOperation、NSOperationQueue的使用

    本篇文章主要介绍下多线程下NSOperation.NSBlockOperation.NSInvocationOperation.NSOperationQueue的使用,列举几个简单的例子. 默认情况下 ...