07Oracle IMP详解.docx
《07Oracle IMP详解.docx》由会员分享,可在线阅读,更多相关《07Oracle IMP详解.docx(30页珍藏版)》请在冰豆网上搜索。
07OracleIMP详解
oracle中imp命令详解
Oracle的导入实用程序(Importutility)允许从数据库提取数据,并且将数据写入操作系统文
件。
imp使用的基本格式:
imp[username[/password[@service]]],以下例举imp常用用
法。
1.获取帮助
imphelp=y
2.导入一个完整数据库
impsystem/managerfile=bible_dblog=dible_dbfull=yignore=y
3.导入一个或一组指定用户所属的全部表、索引和其他对象
impsystem/managerfile=seaparklog=seaparkfromuser=seapark
impsystem/managerfile=seaparklog=seaparkfromuser=(seapark,amy,amyc,harold)
4.将一个用户所属的数据导入另一个用户
impsystem/managerfile=tanklog=tankfromuser=seaparktouser=seapark_copy
impsystem/managerfile=tanklog=tankfromuser=(seapark,amy)touser=(seapark1,amy1)
5.导入一个表
impsystem/managerfile=tanklog=tankfromuser=seaparkTABLES=(a,b)
6.从多个文件导入
impsystem/managerfile=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)log=paycheck,filesize=1Gfull=y
7.使用参数文件
impsystem/managerparfile=bible_tables.par
bible_tables.par参数文件:
#ImportthesampletablesusedfortheOracle8iDatabaseAdministrator's
#Bible.
fromuser=seaparktouser=seapark_copyfile=seaparklog=seapark_import
8.增量导入(9i中已经取消)
impsystem./managerinctype=RECTOREFULL=YFILE=A
Oracleimp/exp帮助说明
C:
DocumentsandSettingsadministrator>exphelp=y
Export:
Release9.2.0.1.0-Productionon星期三7月2817:
04:
432004
Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.
通过输入EXP命令和用户名/口令,您可以
后接用户名/口令的命令:
例程:
EXPSCOTT/TIGER
或者,您也可以通过输入跟有各种参数的EXP命令来控制“导出”
按照不同参数。
要指定参数,您可以使用关键字:
格式:
EXPKEYWORD=value或KEYWORD=(value1,value2,...,valueN)
例程:
EXPSCOTT/TIGERGRANTS=YTABLES=(EMP,DEPT,MGR)
或TABLES=(T1:
P1,T1:
P2),如果T1是分区表
USERID必须是命令行中的第一个参数。
关键字说明(默认)关键字说明(默认)
--------------------------------------------------------------------------
USERID用户名/口令FULL导出整个文件(N)
BUFFER数据缓冲区大小OWNER所有者用户名列表
FILE输出文件(EXPDAT.DMP)TABLES表名称列表
COMPRESS导入到一个区(Y)RECORDLENGTHIO记录的长度
GRANTS导出权限(Y)INCTYPE增量导出类型
INDEXES导出索引(Y)RECORD跟踪增量导出(Y)
DIRECT直接路径(N)TRIGGERS导出触发器(Y)
LOG屏幕输出的日志文件STATISTICS分析对象(ESTIMATE)
ROWS导出数据行(Y)PARFILE参数文件名
CONSISTENT交叉表的一致性(N)CONSTRAINTS导出的约束条件(Y)
OBJECT_CONSISTENT只在对象导出期间设置为读的事务处理(N)
FEEDBACK每x行的显示进度(0)
FILESIZE每个转储文件的最大大小
FLASHBACK_SCN用于将会话快照设置回以前状态的SCN
FLASHBACK_TIME用于获取最接近指定时间的SCN的时间
QUERY用于导出表的子集的select子句
RESUMABLE遇到与空格相关的错误时挂起(N)
RESUMABLE_NAME用于标识可恢复语句的文本字符串
RESUMABLE_TIMEOUTRESUMABLE的等待时间
TTS_FULL_CHECK对TTS执行完整的或部分相关性检查
TABLESPACES要导出的表空间列表
TRANSPORT_TABLESPACE导出可传输的表空间元数据(N)
TEMPLATE调用iAS模式导出的模板名
在没有警告的情况下成功终止导出。
==================================================
C:
DocumentsandSettingsadministrator>imphelp=y
Import:
Release9.2.0.1.0-Productionon星期三7月2817:
06:
542004
Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.
可以通过输入IMP命令和您的用户名/口令
后接用户名/口令的命令:
例程:
IMPSCOTT/TIGER
或者,可以通过输入IMP命令和各种参数来控制“导入”
按照不同参数。
要指定参数,您可以使用关键字:
格式:
IMPKEYWORD=value或KEYWORD=(value1,value2,...,vlaueN)
例程:
IMPSCOTT/TIGERIGNORE=YTABLES=(EMP,DEPT)FULL=N
或TABLES=(T1:
P1,T1:
P2),如果T1是分区表
USERID必须是命令行中的第一个参数。
关键字说明(默认)关键字说明(默认)
--------------------------------------------------------------------------
USERID用户名/口令FULL导入整个文件(N)
BUFFER数据缓冲区大小FROMUSER所有人用户名列表
FILE输入文件(EXPDAT.DMP)TOUSER用户名列表
SHOW只列出文件内容(N)TABLES表名列表
IGNORE忽略创建错误(N)RECORDLENGTHIO记录的长度
GRANTS导入权限(Y)INCTYPE增量导入类型
INDEXES导入索引(Y)COMMIT提交数组插入(N)
ROWS导入数据行(Y)PARFILE参数文件名
LOG屏幕输出的日志文件CONSTRAINTS导入限制(Y)
DESTROY覆盖表空间数据文件(N)
INDEXFILE将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES跳过不可用索引的维护(N)
FEEDBACK每x行显示进度(0)
TOID_NOVALIDATE跳过指定类型ID的验证
FILESIZE每个转储文件的最大大小
STATISTICS始终导入预计算的统计信息
RESUMABLE在遇到有关空间的错误时挂起(N)
RESUMABLE_NAME用来标识可恢复语句的文本字符串
RESUMABLE_TIMEOUTRESUMABLE的等待时间
COMPILE编译过程,程序包和函数(Y)
STREAMS_CONFIGURATION导入Streams的一般元数据(Y)
STREAMS_INSTANITATION导入Streams的实例化元数据(N)
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE导入可传输的表空间元数据(N)
TABLESPACES将要传输到数据库的表空间
DATAFILES将要传输到数据库的数据文件
TTS_OWNERS拥有可传输表空间集中数据的用户
成功终止导入,但出现警告。
Oracle8i/9iEXP/IMP使用经验
一、8iEXP常用选项
1、FULL,这个用于导出整个数据库,在ROWS=N一起使用时,可以导出整个数据库的结构。
例如:
expsysfile=./db_str.dmplog=./db_str.logfull=yrows=ncompress=ydirect=y
2、BUFFER和FEEDBACK,在导出比较多的数据时,我会考虑设置这两个参数。
例如:
expnewfile=yw97_2003.dmplog=yw97_2003_3.logfeedback=10000buffer=100000000
tables=WO4,OK_YT
3、FILL和LOG,这两个参数分别指定备份的DMP名称和LOG名称,包括文件名和目录,例子
见上面。
需要说明的是,EXP可以直接备份到磁带中,即使用FILE=/dev/rmt0(磁带设备名),但是一
般我们都不这么做,原因有二:
一、这样做的速度会慢很多,二、现在一般都是使用磁带库
的,不建议直接对磁带进行操作。
至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使
用。
如果你真想使用EXP直接到磁带,你可以参考Metalink文章“EXPORTINGTOTAPEONUNIX
SYSTEMS”(文档号:
30428.1),该文中有详细解释。
4、COMPRESS参数将在导出的同时合并碎块,尽量把数据压缩到initial的EXTENT里,默认
是N,一般建议使用。
DIRECT参数将告诉EXP直接读取数据,而不像传统的EXP那样,使用
SELECT来读取表中的数据,这样就减少了SQL语句处理过程。
一般也建议使用。
不过有些情
况下DIRECT参数是无法使用的。
5、如何使用SYSDBA执行EXP/IMP?
这是一个很现实的问题,有时候我们需要使用SYSDBA来执行EXP/IMP,如进行传输表空间的
EXP/IMP,以及在9i下用SYS用户来执行EXP/IMP时,都需要使用SYSDBA才可。
我们可以使
用下面方式连入EXP/IMP:
exp"'sys/sysassysdba'"file=1.dmptables=gototop.trows=n
6、QUERY参数后面跟的是where条件,值得注意的是,整个where子句需要使用""括起来,
where子句的写法和SELECT中相同,如果是UNIX平台所有"和'都需要使用u26469屏蔽它们
的特殊含义:
expgototop/gototopfile=1.dmplog=1.logtables=cyx.tquery="wherec1=20and
c2=gototop"
如果是windows平台,则使用下面的格式:
exp c/c@ncn file=c.dmplog=c.logtables=tquery="""whereid=1andname='gototop'"""
二、8iIMP常用选项
1、FROMUSER和TOUSER,使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。
2、IGNORE、GRANTS和INDEXES,其中IGNORE参数将忽略表的存在,继续导入,这个对于需
要调整表的存储参数时很有用,我们可以先根据实际情况用合理的存储参数建好表,然后直
接导入数据。
而GRANTS和INDEXES则表示是否导入授权和索引,如果想使用新的存储参数重
建索引,或者为了加快到入速度,我们可以考虑将INDEXES设为N,而GRANTS一般都是Y。
另外一个EXP/IMP都有的参数是PARFILE,它是用来定义EXP/IMP的参数文件,也就是说,上
面的参数都可以写在一个参数文件中,但我们一般很少使用。
三、Oracle9iEXP功能描述
Oracle9iEXP在原有的基础上新增了部分新的参数,按功能主要分为以下几个部分:
1、OBJECT_CONSISTENT-用于设置EXP对象为只读以保持对象的一致性。
默认是N。
2、FLASHBACK_SCN和FLASHBACK_TIME-用于支持FLASHBACK功能而新增。
3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT-用于支持RESUMABLE空间分配而新
增。
4、TTS_FULL_CHECK-用于在传输表空间时使用依赖性检查。
5、TEMPLATE-用于支持iAS。
6、TABLESPACES-设置表空间导出模式。
个人觉得对于一般用户而言,这个才是新增参数中
最实用的一个,可以让用户在原来的FULL、OWNER、TABLES的基础上多了一种选择,使得EXP
更加灵活。
四、不同版本的EXP/IMP问题?
一般来说,从低版本导入到高版本问题不大,麻烦的是将高版本的数据导入到低版本中,
在Oracle9i之前,不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决:
1、在高版本数据库上运行底版本的catexp.sql;
2、使用低版本的EXP来导出高版本的数据;
3、使用低版本的IMP将数据库导入到底版本数据库中;
4、在高版本数据库上重新运行高版本的catexp.sql脚本。
但在9i中,上面的方法并不能解决问题。
如果直接使用底版本EXP/IMP会出现如下错误:
EXP-00008:
ORACLEerror%luencountered
ORA-00904:
invalidcolumnname
这已经是一个公布的BUG,需要等到Oracle10.0才能解决,BUG号为2261,你可以到METALINK
上去查看有关此BUG的详细信息。
BUG归BUG,我们的工作还是要做,在没有Oracle的支持之前,我们就自己解决。
在Oracle9i
中执行下面的SQL重建exu81rls视图即可。
CREATEORREPLACEviewexu81rls
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)
ASselectu.name,o.name,r.pname,r.pfschma,r.ppname,r.pfname,
decode(bitand(r.stmt_type,1),0,'','SELECT,')
||decode(bitand(r.stmt_type,2),0,'','INSERT,')
||decode(bitand(r.stmt_type,4),0,'','UPDATE,')
||decode(bitand(r.stmt_type,8),0,'','DELETE,'),
r.check_opt,r.enable_flag,
DECODE(BITAND(r.stmt_type,16),0,0,1)
fromuser$u,obj$o,rls$r
whereu.user#=o.owner#
andr.obj#=o.obj#
and(uid=0or
uid=o.owner#or
exists(select*fromsession_roleswhererole='SELECT_CATALOG_ROLE')
)
/
grantselectonsys.exu81rlstopublic;
/
五、其他问题
本文只讨论了Oracle8i和9i中的EXP/IMP的一些情况,对于之前的版本,在8.0.X中,
除了QUERY参数不能用外,其它差别不大。
针对没有QUERY的情况,我们可以先在数据库
中使用查询条件建立临时中间表,然后使用EXP导出这个中间表即可。
至于Oracle7因为
目前使用的人较少,gototop不打算在此做详细解释了,如果读者朋友有需求,你可以参考
Metalink文档:
“OverviewofExportandImportinOracle7”(文档号:
61949.1)。
关于EXP/IMP的详细参数信息你可以通过EXP/IMPHELP=Y来获得。
另外关于传输表空间的更多信息可以参考下面的Metelink文档,本文不再详述。
[NOTE:
77523.1]TransportableTablespaces--AnExampletosetupanduse.
[NOTE:
100698.1]Performtablespacepoint-in-timerecoveryusingTransportable
Tablespace.
六.对于有跨schema的index,imp时可能会报
“Segmentationfault”错误。
例如schemaA中建有基于schemaB表的索引,在导入A时会报上述错误,此时通过
indexes=n来屏蔽导入索引以防止错误,事后可以用以下语句查出这样的索引,最好将
索引放在和基表在同一个schema。
SQL>selectindex_name,owner,table_name,table_owner
fromdba_indexes
whereowner!
=table_owner;
七.导入到不同于原表空间的表空间
原来的数据在USERS表空间里面,我想把它IMP进APP表空间,我已经修改了目的
用户的默认表空间,为什么结果还是IMP到USERS表空间中了呢?
Solution:
Oracle并没有提供什么参数来指定要导入哪个表空间,数据默认将导入到原
本导出时数据所在的表空间中,但是我们可以通过以下的方法来实现导入到不同的表空
间。
1.在IMP时候使用INDEXFILE参数
当给此参数指定了某一文件名,IMP的时候所有的index将不会直接导入到表空间中,
而是在指定的文件中生成创建index的脚本。
然后用文本编辑器打开此文件,直接编辑脚本中的storage参数,修改为想要导入的表
空间名称。
然后重新执行IMP,使用INDEXS=n参数将除Index之外的Objects导入。
最后进入SQL*PLUS,直接运行刚才编辑的脚本,生成索引。
该方法适用于将index以及constraints导入指定的表空间。
2.改变目的用户的默认表空间
这就是上面说的经常有人提问的方法。
但是上述的问题之所以没有成功,是因为缺少了
下面的几步。
首先,收回目的用户的"UNLIMITEDTABLESPACE"权限:
revokeunlimitedtablespacefromusername;
其次,取消目的用户在原数据导出表空间中的配额,这样才能迫使IMP把数据导入到
用户的默认表空间中去。
然后,将希望导入的表空间设为目的用户的默认表空间,并添加配额。
最后,执行IMP。
3.使用TOAD
TOAD是强大的Oracle数据库管理软件,是Quest出品的第三方软件,我们可以使用其
中的RebuildMultiObjects工具来实现将多个Object转移到指定的表空间。
于是我们可以不管三七二十一,先IMP,然后再用TOAD作事后的修改。
关于TOAD的使用,此处不作详细解释。
八.导入工具imp可能出现的问题
(1)数据库对象已经存在
一般情况,导入数据前应该彻底删除目标数据下的表,序列,函数/过程,触发器等;
数据库对象已经存在,按缺省的imp参数,则会导入失败
如果用了参数ignore=y,会把exp文件内的数据内容导入
如果表有唯一关键字的约束条件,不合条件将不被导入
如果表没有唯一关键字的约束条件,将引起记录重复
(2)数据库对象有主外键约束
不符合主外键约束时,数据会导入失败
解决办法:
先导入主表,再导入依存表
disable目标导入对象的主外键约束,导入数据后,再enable它们
(3)权限不够
如果要把A用户的数据导入B用户下,A用户需要有imp_full_database权限
(4)导入大表(大于80M)时,存储分配失败
默认的EXP时,compress=Y,也就是把所有的数据压缩在一个数据块上.
导入时,如果不存在连续一个大数据块,则会导入失败.
导出80M以上的大表时,记得compress=N,则不会引起这种错误.
(5)imp和exp使用的字符集不同
如果字符集不同,导入会失败,可以改变unix环境变量或者NT注册表里
NLS_LANG相关信息.导入完成后再改回来.
(6)imp和exp版本不能往上兼容
imp可以成功导入低版本exp生成的文件,不能导入高版本exp生成的文件
根据情况我们可以用低版本的oracle客户端的exp导出数据库,然后进行导入操作。
(7)ROLLBACK段不够
Export/Import使用过程中,如果数据量很大会出现'ROLLBACK段不够'的错误.
这时要建一个足够大的ROLLBACK段,使它ONLINE而其他ROLLBACK段
OFFLINE.这样,Export/Import使用这个大ROLLBACK段,从而避免上述现象.
(8)EXPORT/IMPORT对SQUENCE的影响
在两种情况下,EXPORT/IMPORT会对SEQUENCE。
a.如果在EXPORT时,用户正在取SEQUENCE的值,可能造成SEQUENCE的不
一致。
b.另外如果SEQUENCE使用CACHE,在EXPORT时,那些在CACHE中的值就
会被忽略的,只是从数据字典里面取当前值EXPORT。
如果在进行FULL方式的
EXPORT/IMPORT时,恰好在用sequence更新表中某列数据,而且不是上面两种
情况,则导出的是更新前的数据。
如果采用常规路径方式,每一行数据都是用
INSERT语句,一致性检查和INSERTTRIGGER如果采用DIRECT方式,某些约
束和trigge