FULL:导出整个数据库,只有拥有exp_full_database角色的用户或者特权用户如sys,system等才能进行全库导出。 示例如下
exp "'/ as sysdba'" full=y
BUFFER:制定数据缓冲区大小,主要用于提高exp/imp速度,该单位为字节,不能写成buffer=1m的形式,应写成字节为单位的参数,如buffer=1048576
exp hr/hr file=t_b.dmp buffer= 1048576 tables=T
OWNER:需要导出的用户,示例如下
exp "'/ as sysdba'" wner=\(hr,scott\) file=hr_scott.dmp
上例中由于是在linux平台进行测试的,需要对 owner=\(hr,scott\)使用\进行转义
FILE:输出文件
TABLES:需要导出的表
COMPRESS:导入到一个区 (Y) 。主要目的是为了消除存储碎片,以保证某张表的所有记录都存储在连续的空间里。 但是负面效应很明显, 如果该参数值为y,则会将高水位线以下的所有extent导入到一个区中, 因此在导入时很 有可能出现,明明表中数据很少,但是却花了很多时间在建立的extent上。 且自oracle9i开始,使用了本地管理的表空间,存储碎片的问题应该比低版本好多了,笔者个人建议将compress设为n。
INCTYPE:增量导出类型,已废除
INDEXES:导出索引 (Y)
RECORD:跟踪增量导出 (Y) ,已废除
TRIGGERS:导出触发器 (Y)
LOG:屏幕输出的日志文件
STATISTICS:在导出文件中保留对象的统计信息,默认值ESTIMATE,还可以为compute或者none。如果导出时出现
EXP-00091: Exporting questionable statistics
可以考虑将 STATISTICS设置为NONE
ROWS:确定表中的数据行是否导出,默认为Y,导出
传统模式导出和直接路径导出的原理
传 统模式导出相当于使用select语句从表中取出数据,数据从磁盘上先读到buffer cache中,记录被转移到一个评估检测的缓冲区中,数据经过语法检测后没有问题,将数据传给PGA,最后写入导出的文件中。如果使用Direct Path模式导出,数据直接从磁盘上读取到导出的PGA中:记录直接被转换导出会话的私有buffer中。这也就是意味着SQL语句处理层被忽略掉了,因 为数据已经是符合导出的格式了,不需要其他的转换处理了。数据直接被传送给导出的客户端,最后写入导出文件。
传统模式导出和直接路径导出的差异
Direct Path导出模式速度上明显快于Conventional Path导出模式,因为Direct Path导出模式忽略了SQL语句处理这一层。
当使用Direct Path导出模式的时候,可以增大参数RECORDLENGTH的值来提高导出的性能。导出的性能主要取决以下的因素:DB_BLOCK_SIZE、导出 表上列的类型、导出文件的I/O层(主要是指导出文件尽量要和数据库的数据文件在不同的磁盘上,避免I/O上的竞争)。一般来说,参数 RECORDLENGTH设置为操作系统I/O的block size或者是DB_BLOCK_SIZE的整数倍,例如65535。
使用哪种模式导出数据都不会影响导入数据,也就是说导入数据的时间是一样的。
imp的参数和exp的大致相同
ignore:Oracle在恢复数据的过程中,当导入某个表时,该表已经存在,就要根据ignore参数的设置来决定如何操作。若 ignore=y,Oracle不执行CREATE TABLE语句,直接将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,唯一索引等,则出错的记录不会插入,但合法的记录会添加到表中。若 ignore=n,Oracle不执行CREATE TABLE语句,同时也不会将数据插入到表中,而是忽略该表的错误,继续导入下一个表。 -
注意:如果表中的字段并没有唯一性约束,那么在使用ignore=y的情况下很有可能插入重复数据。
indexes:在恢复数据的过程中,若indexes=n,则表上的索引不会被恢复,但是对 LOB 索引, OID索引和 主键索引等系统自动生成的索引将无条件恢复。
indexfile:不进行导入操作而是将创建对象的文本保存到文件中,可以通过编辑使用该文本文件创建数据库对象。
fromuser,touser:这两个参数可以组合使用,也可以分开使用。他们可以实现将源用户的对象数据,导入到目标用户schema底下的功能。这里要注意,导入时的用户需要有imp_full_database角色,示例如下
导入一个或一组指定用户所属的全部对象
$imp system/manager file=full_all.dmp log=seapark fromuser=hr
$imp system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)
将一个或一组指定用户所属的全部对象导入到另一个用户下
$imp hr/hr fromuser=hr touser=czm file=hr_all.dmp
$imp system/manager file=tank log=tank fromuser=(seapark,amy) touser=(seapark1, amy1)
commit:默认值为 COMMIT=N,及在没插入玩一个对象后提交。 当COMMIT=Y时候是根据你BUFFER的大小决定每次提交的数量。对于包含了LONG、RAW、 DATE等类型的表,不论BUFFER设置多大,都是每插入一行进行提交。设置commit=y可以防止减少回滚段的压力,但由于频繁提交,会带来性能 上的影响,推荐使用COMMIT=N。
以下为详细的导入导出实例:
一、数据导出:
1、 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
2、 将数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:\daochu.dmp wner=(system,sys)
3、 将数据库中的表table1 、table2导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
4、 将数据库中的表table1中的字段filed1以"00"打头的数据导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
二、数据的导入
1、将D:\daochu.dmp 中的数据导入 TEST数据库中。
imp system/manager@TEST file=d:\daochu.dmp
上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。
在后面加上 ignore=y 就可以了。
2 将d:\daochu.dmp中的表table1 导入
imp system/manager@TEST file=d:\daochu.dmp tables=(table1)
防止错误可以将表全部删除再导入
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29014732/viewspace-772363/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29014732/viewspace-772363/