Oracle Data Pump 导出和导入数据

2015-07-16 12:07:58 · 作者: · 浏览: 1

阅读导航


  Data pump export/import(hereinafter referred to as Export/Import for ease of reading)是一种将元数据和数据导出到系统文件集/从系统文件集导入数据的服务端工具;导出的文件可以移动到其它服务器上,但只能使用impdp导入;使用前要先建立目录(directory)和授权:


创建后即可查询出目录信息,包括目录名称、所有者、目录位置:


删除已有的目录


向某些用户授权使用目录,可以授权read或write权限,或者两个权限同时授予:


撤销权限


userid 表示数据库连接信息,可以是as sysdba权限,非sysdba权限用户可以省略;
job_name 表示导出任务名,未指定默认格式为: SYS_EXPORT_TABLE _*;
parallel 表示并行数,默认为1;
tables 表示导出的表名,可以指定所有者owner.tab,导出分区表的某个分区owner.tab:part01;
dumpfile 表示导出的dump文件名,格式目录名:dump文件名,注:某些版本可能不兼容报错(ORA-39145),可以把目录独立出来用directory参数指定(directory=pump_dir);
version 表示导入目的地数据库版本,在非同一版本数据库之间导出导入数据这个比较重要;
exclude 表示导入排除的对象,DATABASE_EXPORT_OBJECTS表中记录所有的(数据库级别)排除模式,SCHEMA_EXPORT_OBJECTS表中记录schema级别排除对象模式,TABLE_EXPORT_OBJECTS表中记录table级别排除对象模式;


有时候只想导出特定的数据,比如id=10或id in(10,20,30),这种情况下可以用条件限定导出数据(注意字符转义)


或者通过rownum限定行的方式导出数据(注意字符转义)


有些情况下,为了满足测试要求,我们可能需要整库导出或整个schema下的数据导出,但又不需要所有数据,so 同样可以使用限定行数的方式限定所有表数据行导出数据


有些情况下,导出的数据需要通过网络或通过媒介传输到其它目的地,考虑媒介的大小和网络情况,每次只能限定传输,为了达到这个目的可以将数据导出到多个文件,然后再分批或独立发送;比如评估的数据大小是80M,我想把文件导出为4个文件,每个文件的大小为20M,so 我像这样导出数据:


filesize 表示每个文件的大小,单位为:bytes
dumpfile 表示导出的4个dump文件名,如果实际导出数据大小大于指定的文件数据(dumpfile)乘以每个文件大小(filesize)之合,则导出停止并报错
ORA-39095: Dump file space has been exhausted: Unable to allocate 4096 bytes Job "OPS$SYWU"."SYS_EXPORT_SCHEMA_07" stopped due to fatal error at 17:57:31
有个地方要注意:在导出数据时,数据库会在导数用户下根据job_name名称创建一张表,比如job_name=exporttb_bysize,在导数过程中数据库创建一张名EXPORTTB_BYSIZE的表,该表记录了导数的信息,导数成功完成后自动删除,如果导数未成功,比如空间不足或实际大小大于指定大小,则job停止,该表不会自动删除。
为了说明问题,我将filesize改为每个文件10m模拟错误发生,最后观察状态,然后解决错误;


指定文件大小乘以文件个数小于实际数据量大小,导出报错停止,仅仅是停止;


此时查看数据库,发现一张于job_name名称相同的表EXPORTTB_BYSIZE,表中记录了导数时的信息;查询job的状态为:NOT RUNING;


继续完成导数可以通过添加dump文件或使用系统默认的文件


开始任务后,导数继续执行


在添加dump file(add_file)时,添加的文件最终大小取决于添加了多少dump file,在上例中仅添加了一个file05.dmp,so 剩余的数据量将全部归纳到该文件中;如果未添加文件oracle会自己分配和创建一个dump文件;


  对于导出schema下的数据,建议使用sysdba用户导出,因为随着系统的复杂和环境不一,某些时候依赖的包、对象、存储过程可能是属于另一个用户的,导出时被导出schema未必具有完全的权限,同时还要考虑导入的目的地环境;当然万事没有绝对,完全取决于应用;


  整库导出必须使用sysdba权限;


上面有的参数这里就不重复了,因为dump方式导出数据使用了xml格式,所以导入时很容易实现对象重新定义操作,这里主要说几个经常使用的参数:
remap_schema 表示重新定义schema,将旧的schema定义为新的schema,格式old:new,old:new....;
remap_table 表示重新定义表名,格式oldtbname:newtbname,....;
remap_tablespace 表示重新定义表空间名,??式old:new....;
tables 表示要导入的表名,如果未指定则导入dumpfile里的所有表;
schemas 表示要导入的schema对象,如果未指定并且操作用户有权限则导入dumpfile里的所有schema;
table_exists_action 表示当导入表时如果表已经存在时的操作,参数值可以为:append(追加)、replace(替换数据库中存在的)、truncate(删除已经存在的数据,导入dumpfile里面的数据)、skip(不做任何操作);
tablespaces 表示导入的表空间名;
exclude 表示导入排除的对象,DATABASE_EXPORT_OBJECTS表中记录所有的(数据库级别)排除模式,SCHEMA_EXPORT_OBJECTS表中记录schema级别排除对象模式,TABLE_EXPORT_OBJECTS表中记录table级别排除对象模式;
sqlfile 表示不导入数据仅生成导数ddl语句记录在该文件中;


导入数据时要确认导入的用户是否存在,是否有权限访问表空间、是否具有读写directory的权限;


导入数据时重定义schema和tablespaces,重定义schema建议使用sysdba权限导入数据:


其它还有限定行数的操作,操作类似上面导出操作;