一.说明sql
oracle 的exp/imp命令用于实现对数据库的导出/导入操做;
exp命令用于把数据从远程数据库server导出至本地,生成dmp文件;
imp命令用于把本地的数据库dmp文件从本地导入到远程的Oracle数据库中。数据库
二.语法windows
可以经过在命令行输入 imp help=y 获取imp的语法信息:
=============================================================================
C:/Documents and Settings/auduser>imp help=y数组
Import: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:21:57 2008session
(c) Copyright 2001 Oracle Corporation. All rights reserved.oracle
可以经过输入 IMP 命令和您的username/口令
后接username/口令的命令:函数
例程: IMP SCOTT/TIGERui
或者, 可以经过输入 IMP 命令和各类參数来控制“导入”
依照不一样參数。要指定參数,您可以使用keyword:spa
格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)
例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
或 TABLES=(T1: P1,T1: P2),假设 T1 是分区表命令行
USERID 必须是命令行中的第一个參数。
keyword 说明(默认) keyword 说明(默认)
--------------------------------------------------------------------------
USERID username/口令 FULL 导入整个文件 (N)
BUFFER 数据缓冲区大小 FROMUSER 所有人username列表
FILE 输入文件 (EXPDAT.DMP) TOUSER username列表
SHOW 仅仅列出文件内容 (N) TABLES 表名列表
IGNORE 忽略建立错误 (N) RECORDLENGTH IO 记录的长度
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_TIMEOUT RESUMABLE 的等待时间
COMPILE 编译过程, 程序包和函数 (Y)
下列keyword仅用于可传输的表空间
TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
TABLESPACES 将要传输到数据库的表空间
DATAFILES 将要传输到数据库的数据文件
TTS_OWNERS 拥有可传输表空间集中数据的用户
==============================================
相同可以经过输入 exp help=y 获取exp的语法信息
Microsoft Windows XP [版本号 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:/Documents and Settings/auduser>exp help=y
Export: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:26:34 2008
(c) Copyright 2001 Oracle Corporation. All rights reserved.
经过输入 EXP 命令和username/口令,您可以
后接username/口令的命令:
例程: EXP SCOTT/TIGER
或者,您也可以经过输入跟有各类參数的 EXP 命令来控制“导出”
依照不一样參数。要指定參数,您可以使用keyword:
格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例程: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
或 TABLES=(T1: P1,T1: P2),假设 T1 是分区表
USERID 必须是命令行中的第一个參数。
keyword 说明(默认) keyword 说明(默认)
--------------------------------------------------------------------------
USERID username/口令 FULL 导出整个文件 (N)
BUFFER 数据缓冲区大小 OWNER 所有者username列表
FILE 输出文件 (EXPDAT.DMP) TABLES 表名称列表
COMPRESS 导入到一个区 (Y) RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y) INCTYPE 增量导出类型
INDEXES 导出索引 (Y) RECORD 跟踪增量导出 (Y)
DIRECT 直接路径 (N) TRIGGERS 导出触发器 (Y)
LOG 屏幕输出的日志文件 STATISTICS 分析对象 (ESTIMATE)
ROWS 导出数据行 (Y) PARFILE 參数文件名称
CONSISTENT 交叉表一致性 CONSTRAINTS 导出约束条件 (Y)
FEEDBACK 每 x 行显示运行进度 (0)
FILESIZE 每个转储文件的最大大小
FLASHBACK_SCN 用于回调会话快照的 SCN
FLASHBACK_TIME 用来得到最接近于指定时间的 SCN 的时间
QUERY 用来导出表的子集的选择子句
RESUMABLE 遇到与空格有关的错误时挂起 (N)
RESUMABLE_NAME 用来标识可恢复语句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待时间
TTS_FULL_CHECK 对 TTS 运行全然或部分相关性检查
TABLESPACES 要导出的表空间列表
TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
TEMPLATE 调用 iAS 模式导出的模板名称
三.使用演示样例
3.1 数据导出:
1 将数据库SampleDB全然导出,usernamesystem passwordmanager 导出到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.一、8i EXP常用选项
一、FULL,这个用于导出整个数据库,在ROWS=N一块儿使用时,可以导出整个数据库的结构。好比:
exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
二、BUFFER和FEEDBACK,在导出比較多的数据时,我会考虑设置这两个參数。好比:
exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
三、FILL和LOG,这两个參数分别指定备份的DMP名称和LOG名称,包含文件名称和文件夹,样例见上面。
需要说明的是,EXP可以直接备份到磁带中,即便用FILE=/dev/rmt0(磁带设备名),但是通常咱们都不这么作,缘由有二:1、这样作的速度会慢很是多,2、现在通常都是使用磁带库的,不建议直接对磁带进行操做。至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使用。
假设你真想使用EXP直接到磁带,你可以參考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”(文档号:30428.1),该文中有详解。
四、COMPRESS參数将在导出的同一时候合并碎块,尽可能把数据压缩到initial的EXTENT里,默认是N,通常建议使用。DIRECT參数将告诉EXP直接读取数据,而不像传统的EXP那样,使用SELECT来读取表中的数据,这样就下降了SQL语句处理过程。通常也建议使用。只是有些状况下DIRECT參数是没法使用的。
五、怎样使用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
六、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.二、8i IMP常用选项
一、FROMUSER和TOUSER,使用它们实现将数据从一个SCHEMA中导入到另一个SCHEMA中。
二、IGNORE、GRANTS和INDEXES,当中IGNORE參数将忽略表的存在,继续导入,这个对于需要调整表的存储參数时很是实用,咱们可以先依据实际状况用合理的存储參数建好表,而后直接导入数据。而GRANTS和INDEXES则表示是否导入受权和索引,假设想使用新的存储參数重建索引,或者为了加快到入速度,咱们可以考虑将INDEXES设为N,而GRANTS通常都是Y。
另一个EXP/IMP都有的參数是PARFILE,它是用来定义EXP/IMP的參数文件,也就是说,上面的參数都可以写在一个參数文件里,但咱们通常很是少使用。
4.四、Oracle9i EXP功能描写叙述
Oracle9i EXP在原有的基础上新增了部分新的參数,按功能主要分为如下几个部分:
一、OBJECT_CONSISTENT - 用于设置EXP对象为仅仅读以保持对象的一致性。默认是N。
二、FLASHBACK_SCN和FLASHBACK_TIME - 用于支持FLASHBACK功能而新增。
三、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用于支持RESUMABLE空间分配而新增。
四、TTS_FULL_CHECK - 用于在传输表空间时使用依赖性检查。
五、TEMPLATE - 用于支持iAS。
六、TABLESPACES - 设置表空间导出模式。我的认为对于通常用户而言,这个才是新增參数中最实用的一个,可以让用户在原来的FULL、OWNER、TABLES的基础上多了一种选择,使得EXP更加灵活。
5、不一样版本号的EXP/IMP问题?
通常来讲,从低版本号导入到高版本号问题不大,麻烦的是将高版本号的数据导入到低版本号中,在Oracle9i以前,不一样版本号Oracle之间的EXP/IMP可以经过如下的方法来解决:
一、在高版本号数据库上执行底版本号的catexp.sql;
二、使用低版本号的EXP来导出高版本号的数据;
三、使用低版本号的IMP将数据库导入究竟版本号数据库中;
四、在高版本号数据库上又一次执行高版本号的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;
/
6、其它问题
本文仅仅讨论了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 username IDENTIFIED BY password (假设已经建立过用户,这步可以省略)
第四,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 username字
第五, 执行-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