Java备份Oracle数据库
Java线程、Process、ProcessBuilder
2010 年 6 月 20 日
文章内容描述了使用Java执行外部Oracle导出命令备份数据库功能的示例,依据此例子进行修改制造一些bug,然后将会对Java外部命令这块会有一个更加清晰的认知(个人观点仅供参考,不许拍砖,哈)
小细节
- ·试着把innerTh.start()这段给注释掉,然后再把用户名或密码写错。
- ·有些程序是不会在命令行有输出的,比如最直接的plsqldev.exe、MindManager.exe
- ·试着把将要执行的命令改成我们本地相关.exe程序,如上面所例或干脆TM.exe试试。
代码示例:
- package org.ybygjy.basic.oracle;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.nio.ByteBuffer;
- import java.nio.channels.Channels;
- import java.nio.channels.FileChannel;
- import java.nio.channels.ReadableByteChannel;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- /**
- * java外部系统命令模式备份数据库
- * @author WangYanCheng
- * @version 2010-6-19
- */
- public class BackupOracleDatabase {
- /**
- * 封装执行入口
- */
- public void doWork() {
- InnerClass innerInst =
- new InnerClass("DB_USER", "DB_PASS", "127.0.0.1:1521/ORCL", "E:/dbback/BACK201006.DMP");
- Thread thInst = new Thread(innerInst);
- thInst.start();
- }
- /**
- * 用于分担执行命令
- * @author WangYanCheng
- * @version 2010-6-19
- */
- class InnerClass implements Runnable {
- /** 用户名 */
- private String userName;
- /** 密码 */
- private String userPass;
- /** 服务地址 */
- private String serverAddr;
- /** 输出文件路径 */
- private String outFilePath;
- /**
- * constructor
- * @param userName userName
- * @param userPass userPass
- * @param serverAddr 服务地址必须带<strong>端口</strong>/<strong>SID</strong>
- * @param outFilePath outPath
- */
- public InnerClass(String userName, String userPass, String serverAddr, String outFilePath) {
- this.userName = userName;
- this.userPass = userPass;
- this.serverAddr = serverAddr;
- this.outFilePath = outFilePath;
- }
- /**
- * 提供执行的命令串
- * @return commStr 命令串
- */
- private List doBuildCommand() {
- List rtnList = new ArrayList();
- rtnList.add("EXP");
- rtnList.add("@USER@/@PASSWORD@@@SERVER@".replaceAll("@USER@", this.userName)
- .replaceAll("@PASSWORD@", this.userPass).replaceAll("@SERVER@", this.serverAddr));
- rtnList.add("FILE=/"@FILE@/"".replaceAll("@FILE@", this.outFilePath));
- rtnList.add("TABLES=(SY_TABLE_DEF)");
- return rtnList;
- }
- /**
- * 构建ProcessBuilder实例
- * @param workDir 当前进程工作目录
- * @return pbInst ProcessBuilder实例
- * @see ProcessBuilder
- */
- private ProcessBuilder buildProcessBuilder(File workDir) {
- new ProcessBuilder();
- List commandArray = (doBuildCommand());
- ProcessBuilder pbInst = new ProcessBuilder(commandArray);
- pbInst.command(commandArray);
- Map envMap = pbInst.environment();
- envMap.clear();
- envMap.putAll(System.getenv());
- pbInst.directory(workDir);
- pbInst.redirectErrorStream(true);
- return pbInst;
- }
- /**
- * 线程执行入口
- */
- public void run() {
- File tmpOutFile = new File(this.outFilePath);
- File outDir = tmpOutFile.getParentFile();
- ProcessBuilder pbInst = buildProcessBuilder(outDir);
- try {
- Process proInst = pbInst.start();
- final InputStream ins = proInst.getInputStream();
- File outFile = new File(outDir, "exp.log");
- outFile.createNewFile();
- final FileChannel focInst = new FileOutputStream(outFile).getChannel();
- Thread innerTh = new Thread() {
- ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
- public void run() {
- ReadableByteChannel rbcObj = Channels.newChannel(ins);
- try {
- while (rbcObj.read(byteBuffer) != -1) {
- byteBuffer.flip();
- focInst.write(byteBuffer);
- byteBuffer.clear();
- }
- } catch (IOException ioe) {
- ioe.printStackTrace();
- }
- }
- };
- // innerTh.setDaemon(true);
- innerTh.start();
- } catch (IOException ioe) {
- ioe.printStackTrace();
- }
- }
- }
- /**
- * 测试入口
- * @param args 参数列表
- */
- public static void main(String[] args) {
- new BackupOracleDatabase().doWork();
- }
- }
|
- java备份Oracle数据库表
<html><head><title>数据备份</title><meta name="decorator" content=& ...
- Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份
说明: Oracle数据库服务器操作系统:CentOSIP:192.168.0.198端口:1521SID:orclOracle数据库版本:Oracle11gR2 具体操作: 1.root用户登录服务 ...
- 备份Oracle数据库的脚本
@echo off goto bakoracle :bakoracle echo. echo ★☆★ 自动备份Oracle数据库 ★☆★ echo. set backpath=E:\Oracle ...
- Java读取oracle数据库中blob字段数据文件保存到本地文件(转载)
转自:https://www.cnblogs.com/forever2698/p/4747349.html package com.bo.test; import java.io.FileOutput ...
- Oracle备份恢复之rman备份oracle数据库
备份需求和rman备份 oracle数据库的备份相关问答: 1)备份时数据库处于何种状态? 备份时数据库处于OPEN状态,这样数据库可以正常工作. 2)备份的数据备份在什么地方? 备份在本地磁盘. 3 ...
- oracle入门(5)——java连接oracle数据库
[本文介绍] 前面几篇说了那么多,最终还没讲到如何用java连接数据库,本文实用一点,讲讲如何连接数据库. [java连接oracle数据库] 1.导入jdbc驱动:看到这里,就忙着上网找驱动?不,安 ...
- Java连接Oracle数据库的三种连接方式
背景: 这两天在学习Oracle数据库,这里就总结下自己上课所学的知识,同时记录下来,方便整理当天所学下的知识,也同时方便日后自己查询. SQL语句的话,这里我就不多讲了,感觉和其他的数据库(MySQ ...
- Linux下自动备份Oracle数据库并删除指定天数前的备份
说明: Oracle数据库服务器 操作系统:CentOS IP:192.168.0.198 端口:1521 SID:orcl Oracle数据库版本:Oracle11gR2 具体操作: 1.root用 ...
- Windows Server系统定时任务备份ORACLE数据库
Windows Server系统定时任务备份ORACLE数据库 一.编辑备份脚本 RMAN备份数据库 1.在备份脚本目录下,创建bat文件db_rman.bat set ORACLE_SID=orcl ...
随机推荐
- make menuconfig error 解决方法记录
新建的一个虚拟机,发现make menuconfig 后会出错,查了一下是缺少一些库. 这个错误已经错了两次了,我不希望第三次出现了还想不起来,所以特此记录. # 错误信息: make[2]: *** ...
- effective OC2.0 52阅读笔记(七 系统框架)
47 熟悉系统框架 总结:将代码封装为动态库,并提供接口的头文件,就是框架.平时的三方应用都用静态库(因为iOS应用程序不允许在其中包含动态库),并不是真正的框架,然而也经常视为框架.例如:NSLin ...
- ABAP 合并单元格自建函数
FORM frm_merge_cells USING sor_cell tar_cell. CALL METHOD OF excel 'Range' = range EXPORTING ...
- 51nod1256(乘法逆元)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...
- [BI项目记]-对项目文件进行规划
BI项目中会有很多不同种类的项目,此篇会对这些项目进行一个总结,并且在TFS中进行分类. 根据笔者对BI项目的经验和理解,主要将BI项目中的项目类型进行如下分类: DB脚本 DB脚本是BI项目中重要的 ...
- 算法系列:FFT 002
转载自http://blog.jobbole.com/58246/ 快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.没有正规计算机科学课程背景 ...
- error C2144: 语法错误:“int”的前面应有“;”
百度网上都说是中文输入的问题. 但我的错误是函数声明时后面忘了加 :真是要死......
- IBatis.Net使用总结(二)-- IBatis返回DataTable/DataSet(网上例子的集合)
IBatis返回DataTable,DataSet ibatis.net QueryForDataTable 完整的为ibatis.net 引入datatable支持要改动很多地方,所以描述的是最小化 ...
- Python 元组
#不可变序列-----元组 tuple #元组和列表十分相似,元组和字符串一样都是不可变的. #元组由不同的元素组成,每个元素可以存储不同类型的数据,例如 #字符串.数字和元组 #元组通常代表一行数据 ...
- linux 自编软件运行时权限不足问题
在非根目录下" ./*.out " 文件时出现显示运行的权限不足的问题,经过调查,有人给出方案: 方案1: 在Linux下执行一个文件时候提示“权限不够”的解决办法如下 转到那个文 ...