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权限。
下面我们来比较一下三种方法的优缺点: