使用java从oracle远程数据库导出/导入用户数据

时间:2013-07-22 15:16:57

标签: java oracle import remote-access database-backups

我正在尝试在某些特定要求下实现oracle数据库用户的备份/导出和恢复/导入数据。我已经有了一个解决方案,但如果这是正确的方式,我会对反馈感到满意。

在客户端上,运行一个Java应用程序,可以通过jdbc访问远程oracle数据库。也可以通过客户端的ProcessBuilder运行sql*plus。客户应该至少需要权利。在服务器上,运行的是Oracle Database 10(或更高版本)。

目标是 a)仅导出该应用程序/用户的数据(及以后)
b)将数据导入另一个远程数据库
没有文件访问远程数据库服务器(没有ssh,ftp,企业管理器;只能通过jdbc,sql * plus或其他客户端工具),并且数据库实例不应该在服务器上创建数据,因为客户端无法删除文件。不打算将数据直接复制/复制到另一个没有中间文件的数据库。

我的方法

导出

i)通过sql * plus:

创建表定义文件(tableName.sql)
spool tableName.sql
select dbms_metadata.get_ddl('TABLE','tableName','dbUser') from dual;
spool off;

ii)通过sqlplus和相应的变量(linesize等)将用户的每个表的数据提取到flatfiles(tableName.txt):

spool tableName.txt;
select * from tableName;
spool off;

导入

i)运行生成的sql脚本来创建表

ii)运行sql * Loader以导入表数据:

sqlldr dbUser/dbPW control=loadTable.control

其中loadTable.control是:

load data
infile 'tableName.txt'
into table tableName
fields terminated by ',' optionally enclosed by '"'
TRAILING NULLCOLS
( ... )

目前我在tableName.txt和 格式化方面存在一些问题,问自己是否有其他方法 。另外我认为我的客户端/服务器的字符集也会有一些问题。

如果我理解正确,数据泵导出/导入工具需要DATABASE LINK,因此需要在客户端上运行oracle实例。

我认为RMAN需要太多的权利,并专注于备份整个数据库。

一些背景信息

我已经为MySQL数据库实现了相同的过程。我按如下方式实施了出口:
i)通过SHOW CREATE TABLE为每个表格创建表定义文件(tableName.sql) ii)通过

将每个表的数据提取到文件(tableName.txt)
mysql --host=dbHost --port=dbPort --user=dbUser --password=dbPassword --default-character-set=DEFAULT_CHARACTER_SET --quick --database=dbName --execute='Select * from table' > tableName.txt

对于导入,我运行生成的sql脚本来创建表,然后执行

LOAD DATA LOCAL INFILE 'tablename.txt' REPLACE INTO TABLE tableName;

0 个答案:

没有答案