07Oracle IMP详解.docx

上传人:b****5 文档编号:29911465 上传时间:2023-08-03 格式:DOCX 页数:30 大小:28.76KB
下载 相关 举报
07Oracle IMP详解.docx_第1页
第1页 / 共30页
07Oracle IMP详解.docx_第2页
第2页 / 共30页
07Oracle IMP详解.docx_第3页
第3页 / 共30页
07Oracle IMP详解.docx_第4页
第4页 / 共30页
07Oracle IMP详解.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

07Oracle IMP详解.docx

《07Oracle IMP详解.docx》由会员分享,可在线阅读,更多相关《07Oracle IMP详解.docx(30页珍藏版)》请在冰豆网上搜索。

07Oracle IMP详解.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1