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. javascript数据结构-介绍

    github博客地址 名词解释 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率.数据结构 ...

  2. redis该如何分区-译文(原创)

    写在最前,最近一直在研究redis的使用,包括redis应用场景.性能优化.可行性.这是看到redis官网中一个链接,主要是讲解redis数据分区的,既然是官方推荐的,那我就翻译一下,与大家共享. P ...

  3. json死循环问题

    20.JSON死循环问题: 向前台发送的数据: 出现此类问题主要是由于在所传数据中有包含关系,比如ElementGroup中有Element,Element中又有ElementGroup,此时就会出现 ...

  4. css的用法

    Css(Cascading Style Sheets,层叠样式表)是一种页面美化方法,通过编辑Css的对象属性达到美化页面的效果.Css的操作基本单元为对象,使用CSS的感觉就像是使用C++/C中的函 ...

  5. AngularJS 分页

    前端源码: <div> <h1>列表页33</h1> <table> <thead> <tr><td>CandiID ...

  6. Windows下几款免费C/C++开发工具简介

    我相信作为编程初学者,我们都希望有好用的编程软件.这里"好用"应该至少要满足两点:1.安装简单,2.使用方便.大神移驾,对工具有特殊偏好跳过,从来不用Windows的止步.本文不做 ...

  7. vue 中判断页面滑动方向

  8. UIImage加载本地图片的两种方式

    UIImage加载图片方式一般有两种: (1)imagedNamed初始化:默认加载图片成功后会内存中缓存图片,这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象.如果缓存中没有找到相应的图片 ...

  9. jquery检测浏览器类型

    使用jquery如下代码检测浏览器版本时:出问题,在检测IE浏览器,如果版本是IE11时,会出现 $.browser.msie的返回值是false,$.browser.mozilla的返回值是true ...

  10. 3. UILable 的使用

    1.  坐标系 来自:http://www.cnblogs.com/mcj-coding/p/5100455.html  QQ: 863740091 如果在平面坐标系中我们要确定一个东西的位置和大小需 ...