我正在尝试在某些特定要求下实现Oracle数据库用户数据的备份/导出和恢复/导入。我已经想到了一个解决方案,但如果它是正确的方法,我会很高兴收到反馈。
在客户端,正在运行一个 Java 应用程序,该应用程序可以通过 jdbc 访问远程 oracle 数据库。也可以sql*plus
在客户端通过 ProcessBuilder 运行。客户应该需要最低限度的权利。在服务器上,正在运行 Oracle 数据库 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等)将用户每个表的数据提取到平面文件(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 的格式有一些问题,并问自己是否有替代方法。此外,我认为客户端/服务器的字符集也会有一些问题。
如果我理解正确的话,数据泵导出/导入工具需要一个数据库链接,因此需要一个在客户端上运行的 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;