Java项目生成oracle数据库dump文件(三)

        Oracle数据库的备份和恢复可以通过exp/imp命令来实现,exp、imp命令需要安装Oracle客户端才能使用,生成的dump文件是数据库的二进制文件。exp命令的使可以自行百度,我们在该项目的使用如下:

exp admin/pwd@//127.0.0.1:1526/d0csmmcy tables=NODE file=./dump_file/NODE_dump_20180516143042406.dump log=./dump_log/NODE_dump_20180516143042406.log

        导出的具体代码:

package com.code.dump;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DumpFile3 {
	/** 数据库连接参数 */
	static final String DB_HOST = "127.0.0.1:1526";
	static final String DB_SID = "orcl";
	static final String DB_USER = "admin";
	static final String DB_PWD = "pwd";
	static final String TABLE_NAME = "NODE";
	/** dump文件保存路径 */
	static final String DUMP_FILE_PATH = "./dump_file";
	/** dump日志保存路径 */
	static final String DUMP_LOG_PATH = "./dump_log";
	static Connection connection = null;

	public static void main(String[] args) {
		try {
			long start = System.currentTimeMillis();
			dumpByOracleExp();
			System.out.println("---------------------------\n"+"all cost time is " + (System.currentTimeMillis() - start) + " ms"+"\n-----------------------------\n");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (connection != null) {
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**通过Oracle的exp命令导出*/
	private static void dumpByOracleExp() throws Exception{
		// 创建文件存储目录
		File directory = new File(DUMP_FILE_PATH);
		if (!directory.exists()) {
			directory.mkdirs();
		}
		directory = new File(DUMP_LOG_PATH);
		if (!directory.exists()) {
			directory.mkdirs();
		}
		String dumpFilePath = DUMP_FILE_PATH + "/" + TABLE_NAME + "_dump_" + getTimeStamp() + ".dump";
		//dump操作的日志目录
		String dumpLogPath = DUMP_LOG_PATH + "/" + TABLE_NAME + "_dump_" + getTimeStamp() + ".log";
		
		String command = "exp " +  DB_USER + "/" + DB_PWD + "@//" + DB_HOST + "/" + DB_SID + " tables="+TABLE_NAME +" file="+dumpFilePath+" log="+dumpLogPath;
		System.out.println("---------------------------\n" + command + "\n-----------------------------\n");
		Process process = Runtime.getRuntime().exec(command);
		process.waitFor();
		printCmdOutMsg(process.getInputStream());
		printCmdOutMsg(process.getErrorStream());
	}
	
	static String getTimeStamp() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		return sdf.format(new Date());
	}
	
	static void printCmdOutMsg(final InputStream is){
		new Thread(new Runnable() {
			@Override
			public void run() {
				try{
					System.out.println("-----------------------------------------");
					BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("gbk")));
					String out = reader.readLine();
					while (out != null) {
						System.out.println(out);
						out = reader.readLine();
					}
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}).start();
	}

}

        程序的输出:

---------------------------
exp admin/pwd@//127.0.0.1:1526/orcl tables=NODE file=./dump_file/NODE_dump_20180516143042406.dump log=./dump_log/NODE_dump_20180516143042406.log
-----------------------------

-----------------------------------------
---------------------------
all cost time is 104986 ms
-----------------------------

-----------------------------------------

Export: Release 11.2.0.1.0 - Production on 星期三 5月 16 14:30:42 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Tes
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
服务器使用 AL32UTF8 字符集 (可能的字符集转换)

即将导出指定的表通过常规路径...
. . 正在导出表                            NODE导出了       23099 行
EXP-00091: 正在导出有问题的统计信息。
EXP-00091: 正在导出有问题的统计信息。
EXP-00091: 正在导出有问题的统计信息。
EXP-00091: 正在导出有问题的统计信息。
EXP-00091: 正在导出有问题的统计信息。
EXP-00091: 正在导出有问题的统计信息。
EXP-00091: 正在导出有问题的统计信息。
EXP-00091: 正在导出有问题的统计信息。
EXP-00091: 正在导出有问题的统计信息。
导出成功终止, 但出现警告。

        代码的实现逻辑就是通过Runtime.getRuntime().exec调用exp命令。另外,需要注意的是,执行exp命令的用户需要赋予exp_full_database权限。

        下面我们来比较一下三种方法的优缺点:



 

猜你喜欢

转载自blog.csdn.net/u014730001/article/details/80336591