oracle数据导入导出之exp imp

来源:互联网 发布:知乎日报在哪 手机 编辑:程序博客网 时间:2024/06/08 07:26

3.1 数据导出:

 1 将数据库SampleDB完全导出,用户名system 密码manager 导出到E:/SampleDB.dmp中

   exp system/manager@TestDB file=E:/sampleDB.dmp full=y

 2 将数据库中system用户与sys用户的表导出

   exp system/manager@TestDB file=E:/sampleDB.dmp  owner=(system,sys)

 3 将数据库中的表 TableA,TableB 导出

    exp system/manager@TestDB  file=E:/sampleDB.dmp  tables=(TableA,TableB)

 4 将数据库中的表tableA中的字段filed1 值为 "王五" 的数据导出

   exp system/manager@TestDB  file=E:/sampleDB.dmp  tables=(tableA)  query=' where filed1='王五'
 
   如果想对dmp文件进行压缩,可以在上面命令后面 加上 compress=y 来实现。

3.2 数据的导入

 1 将备份数据库文件中的数据导入指定的数据库SampleDB 中,如果 SampleDB 已存在该表,则不再导入;

   imp system/manager@TEST  file=E:/sampleDB.dmp  full=y  ignore=y
 

 2 将d:/daochu.dmp中的表table1 导入

 imp system/manager@TEST  file=E:/sampleDB.dmp  tables=(table1)

3. 导入一个完整数据库

 imp system/manager file=bible_db log=dible_db full=y ignore=y

4. 导入一个或一组指定用户所属的全部表、索引和其他对象

 imp system/manager file=seapark log=seapark fromuser=seapark imp
 system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)

5. 将一个用户所属的数据导入另一个用户

 imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy
 imp system/manager file=tank log=tank fromuser=(seapark,amy)
 touser=(seapark1, amy1)

6. 导入一个表

 imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)

7. 从多个文件导入

 imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)
log=paycheck, filesize=1G full=y

8. 使用参数文件

 imp system/manager parfile=bible_tables.par
bible_tables.par参数文件:
 #Import the sample tables used for the Oracle8i Database Administrator's
Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import
参数文件示例见附录


9. 增量导入

 imp system./manager inctype= RECTORE FULL=Y  FILE=A

 
不少情况下要先将表彻底删除,然后导入。


四.参数说明

4.1、8i EXP常用选项
 1、FULL,这个用于导出整个数据库,在ROWS=N一起使用时,可以导出整个数据库的结构。例如:
 exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
 2、BUFFER和FEEDBACK,在导出比较多的数据时,我会考虑设置这两个参数。例如:
 exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
 3、FILL和LOG,这两个参数分别指定备份的DMP名称和LOG名称,包括文件名和目录,例子见上面。
 需要说明的是,EXP可以直接备份到磁带中,即使用FILE=/dev/rmt0(磁带设备名),但是一般我们都不这么做,原因有二:一、这样做的速度会慢很多,二、现在一般都是使用磁带库的,不建议直接对磁带进行操作。至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使用。
 如果你真想使用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?
 这是一个很现实的问题,有时候我们需要使用SYSDBA来执行EXP/IMP,如进行传输表空间的EXP/IMP,以及在9i下用SYS用户来执行EXP/IMP时,都需要使用SYSDBA才可。我们可以使用下面方式连入EXP/IMP:
 exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n
 6、QUERY参数后面跟的是where条件,值得注意的是,整个where子句需要使用""括起来,where子句的写法和SELECT中相同,如果是UNIX平台所有"和'都需要使用/u26469屏蔽它们的特殊含义:
 exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop"
 如果是windows平台,则使用下面的格式:
      exp c/c@ncn file=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'"""
4.2、8i IMP常用选项
 1、FROMUSER和TOUSER,使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。
 2、IGNORE、GRANTS和INDEXES,其中IGNORE参数将忽略表的存在,继续导入,这个对于需要调整表的存储参数时很有用,我们可以先根据实际情况用合理的存储参数建好表,然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引,如果想使用新的存储参数重建索引,或者为了加快到入速度,我们可以考虑将INDEXES设为N,而GRANTS一般都是Y。
 另外一个EXP/IMP都有的参数是PARFILE,它是用来定义EXP/IMP的参数文件,也就是说,上面的参数都可以写在一个参数文件中,但我们一般很少使用。
4.4、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可以通过下面的方法来解决:
 1、在高版本数据库上运行底版本的catexp.sql;
 2、使用低版本的EXP来导出高版本的数据;
 3、使用低版本的IMP将数据库导入到底版本数据库中;
 4、在高版本数据库上重新运行高版本的catexp.sql脚本。
 但在9i中,上面的方法并不能解决问题。如果直接使用底版本EXP/IMP会出现如下错误:
 EXP-00008: ORACLE error %lu encountered
 ORA-00904: invalid column name
 这已经是一个公布的BUG,需要等到Oracle10.0才能解决,BUG号为2261,你可以到METALINK上去查看有关此BUG的详细信息。
 BUG归BUG,我们的工作还是要做,在没有Oracle的支持之前,我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。
 CREATE OR REPLACE view exu81rls 
 (objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy) 
 AS select u.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) 
 from user$ u, obj$ o, rls$ r 
 where u.user# = o.owner# 
 and r.obj# = o.obj# 
 and (uid = 0 or 
 uid = o.owner# or 
 exists ( select * from session_roles where role='SELECT_CATALOG_ROLE') 
 ) 
 / 
 grant select on sys.exu81rls to public; 
 / 

六、其他问题

 本文只讨论了Oracle8i和9i中的EXP/IMP的一些情况,对于之前的版本,在8.0.X中,除了QUERY参数不能用外,其它差别不大。针对没有QUERY的情况,我们可以先在数据库中使用查询条件建立临时中间表,然后使用EXP导出这个中间表即可。至于Oracle7因为目前使用的人较少,gototop不打算在此做详细解释了,如果读者朋友有需求,你可以参考Metalink文档:“Overview of Export and Import in Oracle7”(文档号:61949.1)。关于EXP/IMP的详细参数信息你可以通过EXP/IMP HELP=Y来获得。
 另外关于传输表空间的更多信息可以参考下面的Metelink文档,本文不再详述。
 [NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use. 
 [NOTE:100698.1] Perform tablespace point-in-time recovery using Transportable Tablespace. 
 在进行并行EXP/IMP的时候,如果IMP过程建索引的话不建议同时运行5个以上的IMP,如果你想加快速度,可以在IMP的时候不建索引,这样只要内存允许,可以多跑几个,然后是SQL脚本创建需要的索引。 


注意:
 操作者要有足够的权限,权限不够它会提示。
 数据库是否可以连上, 可以用tnsping TestDB  来获得数据库 TestDB 能否连上。

附录一:
 给用户增加导入数据权限的操作
 第一, 启动sql*puls
 第二,以system/manager登陆
 第三,create user 用户名 IDENTIFIED BY 密码 (如果已经创建过用户,这步可以省略)
 第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
   DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
      DBA,CONNECT,RESOURCE,CREATE SESSION  TO 用户名字
 第五, 运行-cmd-进入dmp文件所在的目录,
      imp userid=system/manager full=y file=*.dmp
      或者 imp userid=system/manager full=y file=filename.dmp

  附录二:
 Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.
  先建立import9.par,
  然后,使用时命令如下:imp parfile=/filepath/import9.par
  例 import9.par 内容如下:
        FROMUSER=TGPMS       
        TOUSER=TGPMS2     (注:把表的拥有者由FROMUSER改为TOUSER,FROMUSER和TOUSER的用户可以不同)          
        ROWS=Y
        INDEXES=Y
        GRANTS=Y
        CONSTRAINTS=Y
        BUFFER=409600
        file==/backup/ctgpc_20030623.dmp
        log==/backup/import_20030623.log


0 0
原创粉丝点击