Oracle--数据的导入与导出(exp/imp命令详解3)

来源:互联网 发布:柳州退休金验证软件 编辑:程序博客网 时间:2024/06/09 20:00

Oracle--数据的导入与导出(exp/imp命令详解3)

 

作者:网络        日期:2010-01-25        类别:Oracle


Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。

oracle Exp命令详解

1 将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中
4y&y6z-g F U-c+l689487   exp
system/manager@TESTfile=d:daochu.dmp full=y

2 将数据库中system用户与sys用户的表导出
/A6m q v5E ~ _ u689487   exp
system/manager@TESTfile=d:daochu.dmp wner=(system,sys)

3 将数据库中的表inner_notify、notify_staff_relat导出
M |%q E*Mz689487 Exp
aichannel/aichannel@TESTDB2file= d:datanewsmgnt.dmp tables = (inner_notify, notify_staff_relat )

4 将数据库中的表table1中的字段filed1以"00"打头的数据导出
s"M*X!} a;C;} Y689487   exp
system/manager@TESTfile=d:daochu.dmp tables=(table1) query=" where filed1 like '00%'"

上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。
L I'R B j$X Q689487也可以在上面命令后面 加上 compress=y 来实现。

oracle IMP 命令详解

Oracle的导入实用程序(Import utility)允许从数据库提取数据,并且将数据写入操作系统文件。imp使用的基本格式:imp[username[/password[@service]]],以下例举imp常用用法。

1 将D:daochu.dmp 中的数据导入 TEST数据库中。ITPUB个人空间3S X#S /7P!S o*I U
   imp
system/manager@TESTfile=d:daochu.dmp
8V#Y V1G5c O)y |0G689487   imp
aichannel/aichannel@HUSTfull=y file=d:datanewsmgnt.dmp ignore=y
:I V @ { z2b&U689487   上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。ITPUB个人空间)a f!K!} Z [ } f*D o s+n$t
   在后面加上 ignore=y 就可以了。

2 将d:daochu.dmp中的表table1 导入ITPUB个人空间.d+g-t O O / x P X
imp
system/manager@TESTfile=d:daochu.dmp tables=(table1)

基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。

1. 获取帮助ITPUB个人空间 vq |.l$d U
imp help=y

2. 导入一个完整数据库
u%b b1t:m3f0s689487 imp system/manager file=bible_db log=dible_db full=y ignore=y

3. 导入一个或一组指定用户所属的全部表、索引和其他对象
Y j9^ [ B$Y689487 imp system/manager file=seapark log=seapark fromuser=seapark impITPUB个人空间;E1j(m n+u
system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)

4. 将一个用户所属的数据导入另一个用户ITPUB个人空间/"_ t V c8r4S!H p
imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copyITPUB个人空间 O"Y T/P*_5X1H
imp system/manager file=tank log=tank fromuser=(seapark,amy)ITPUB个人空间/c [ ? c$P @ z W:w5d7k ^
touser=(seapark1, amy1)

5. 导入一个表ITPUB个人空间0f'V!h(G L
imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)
W d X Q s-Z6894876. 从多个文件导入ITPUB个人空间 k D Q'X `8Z
imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)
^6a T6Z y `@0j689487log=paycheck, filesize=1G full=y

7. 使用参数文件
e c;n | A*Q689487 imp system/manager parfile=bible_tables.par
5r,e f K e689487bible_tables.par参数文件:
m G @ I l M k `9I689487 #Import the sample tables used for the Oracle8i Database Administrator's
&z dq C3B I Q+R%/ Q4|689487Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import

8. 增量导入
Q v-K!I ~"s y8f689487 imp system./manager inctype= RECTORE FULL=Y FILE=A

Oracle8i/9i EXP/IMP使用经验

一、8i EXP常用选项
L#T x g ^/h d B r6894871、FULL,这个用于导出整个数据库,在ROWS=N一起使用时,可以导出整个数据库的结构。例如:ITPUB个人空间9a1G;P I d q%S Q
exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y

2、BUFFER和FEEDBACK,在导出比较多的数据时,我会考虑设置这两个参数。例如:
C#w o9V U C5v4G h$d+D689487exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT

3、FILL和LOG,这两个参数分别指定备份的DMP名称和LOG名称,包括文件名和目录,例子见上面。
7A4h&Y P f | ~ C#d#u D${689487需要说明的是,EXP可以直接备份到磁带中,即使用FILE=/dev/rmt0(磁带设备名),但是一般我们都不这么做,原因有二:一、这样做的速度会慢很多,二、现在一般都是使用磁带库的,不建议直接对磁带进行操作。至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使用。ITPUB个人空间 xx"` h M,K:_
如果你真想使用EXP直接到磁带,你可以参考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”(文档号:30428.1),该文中有详细解释。

4、COMPRESS参数将在导出的同时合并碎块,尽量把数据压缩到initial的EXTENT里,默认是N,一般建议使用。DIRECT参数将告诉EXP直接读取数据,而不像传统的EXP那样,使用SELECT来读取表中的数据,这样就减少了SQL语句处理过程。一般也建议使用。不过有些情况下DIRECT参数是无法使用的。

5、如何使用SYSDBA执行EXP/IMP?
&_*u { b%J M Q689487这是一个很现实的问题,有时候我们需要使用SYSDBA来执行EXP/IMP,如进行传输表空间的EXP/IMP,以及在9i下用SYS用户来执行EXP/IMP时,都需要使用SYSDBA才可。我们可以使用下面方式连入EXP/IMP:ITPUB个人空间 F /2|6p-`9S g
exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n

6、QUERY参数后面跟的是where条件,值得注意的是,整个where子句需要使用""括起来,where子句的写法和SELECT中相同,如果是UNIX平台所有"和'都需要使用u26469屏蔽它们的特殊含义:
%~+m8F u(n8T8T q!Y1T689487exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop"ITPUB个人空间 w!j5u&].w;] ^:? [
如果是windows平台,则使用下面的格式:ITPUB个人空间 i+I h a X"x
exp
c/c@ncnfile=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'"""

二、8i IMP常用选项

1、FROMUSER和TOUSER,使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。

2、IGNORE、GRANTS和INDEXES,其中IGNORE参数将忽略表的存在,继续导入,这个对于需要调整表的存储参数时很有用,我们可以先根据实际情况用合理的存储参数建好表,然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引,如果想使用新的存储参数重建索引,或者为了加快到入速度,我们可以考虑将INDEXES设为N,而GRANTS一般都是Y。
b$Y K4t @ K P5o J689487另外一个EXP/IMP都有的参数是PARFILE,它是用来定义EXP/IMP的参数文件,也就是说,上面的参数都可以写在一个参数文件中,但我们一般很少使用。

三、Oracle9i EXP功能描述

Oracle9i EXP在原有的基础上新增了部分新的参数,按功能主要分为以下几个部分:

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可以通过下面的方法来解决:ITPUB个人空间!a N l F L+s1K
1、在高版本数据库上运行底版本的catexp.sql;ITPUB个人空间9Q;y*j ? x a l
2、使用低版本的EXP来导出高版本的数据;ITPUB个人空间7u.N*w |/_%z#M-o
3、使用低版本的IMP将数据库导入到底版本数据库中;ITPUB个人空间&K/a [)t P&N Z3f
4、在高版本数据库上重新运行高版本的catexp.sql脚本。

但在9i中,上面的方法并不能解决问题。如果直接使用底版本EXP/IMP会出现如下错误:
/S F _#~ D X W6V689487EXP-00008: ORACLE error %lu encounteredITPUB个人空间8V*R Y Z t/Z P M ` |
ORA-00904: invalid column nameITPUB个人空间 k / E#Q"c%s3g/w N u
这已经是一个公布的BUG,需要等到Oracle10.0才能解决,BUG号为2261,你可以到METALINK上去查看有关此BUG的详细信息。ITPUB个人空间 d ~ ~9j { y+T k
BUG归BUG,我们的工作还是要做,在没有Oracle的支持之前,我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。
'n n k1X D689487CREATE OR REPLACE view exu81rls ITPUB个人空间 d Q!G$z [9r h
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy) ITPUB个人空间;B X)n)k-Y'Z w S
AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,
/.C&e3E / X7/ r"X2c3C S689487decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')
u n5n2H'o%K(P i689487|| decode(bitand(r.stmt_type,2), 0,'', 'INSERT,') ITPUB个人空间 ` `!k n ^ L z
|| decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')
'/ e d C { w9c }&w/L689487|| decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),
$G [ y3s ~6Y$z j689487r.check_opt, r.enable_flag, ITPUB个人空间 c9p$X m z%` /*E j
DECODE(BITAND(r.stmt_type, 16), 0, 0, 1) ITPUB个人空间/X#p N @)i v
from user$ u, obj$ o, rls$ r
#H Y"G l,e689487where u.user# = o.owner#
` S p X ^&G-|689487and r.obj# = o.obj# ITPUB个人空间 `"u Rj*L"d;O2J#Q
and (uid = 0 or
N-L$S$O p-e N&[689487uid = o.owner# or
5F A } M w o3S&G } g689487exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')
#y1e @ e8M+L a K689487)
V z1s O's K i/i689487/
x)v ? @-|;q:A x x.r689487grant select on sys.exu81rls to public;
U P z q#B d N689487/

五、其他问题

本文只讨论了Oracle8i和9i中的EXP/IMP的一些情况,对于之前的版本,在8.0.X中,除了QUERY参数不能用外,其它差别不大。针对没有QUERY的情况,我们可以先在数据库中使用查询条件建立临时中间表,然后使用EXP导出这个中间表即可。至于Oracle7因为目前使用的人较少,Rambo不打算在此做详细解释了,如果读者朋友有需求,你可以参考Metalink文档:“Overview of Export and Import in Oracle7”(文档号:61949.1)。关于EXP/IMP的详细参数信息你可以通过EXP/IMP HELP=Y来获得。

另外关于传输表空间的更多信息可以参考下面的Metelink文档,本文不再详述。ITPUB个人空间"K K v2y c E } [+E
[NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use.
&] h [)x+P s689487[NOTE:100698.1] Perform. tablespace point-in-time recovery using Transportable Tablespace.

在进行并行EXP/IMP的时候,如果IMP过程建索引的话不建议同时运行5个以上的IMP,如果你想加快速度

原创粉丝点击