、Export/Import的用处Oracle Export/Import工具用于在数据库之间传递数据。Export从数据库中导出数据到dump文件中Import从dump文件中到入数据导数据库中下面是一般使用他们的情况(1)、两个数据库之间传送数据同一个版本的oracle Server之间不同版本的oracle Server之间同种OS之间不同种OS之间(2)、用于数据库的备份和恢复(3)、从一个SCHEMA传送到另一个SCHEMA(4)、从一个TABLESPACE传送到另一个TABLESPACE
2、DUMP文件EXPORT到出的是二进制格式的文件,不可以手工编辑,否则会损坏数据。该文件在ORACLE支持的任何平台上都是一样的格式,可以在各平台上通用。DUMP文件在IMPORT时采用向上兼容方式,就是说ORALCE7的DUMP文件可以导入到ORACLE8中,但是版本相差很大的版本之间可能有问题。3、EXPORT/IMPORT过程EXPORT导出的DUMP文件包含两种基本类型的数据- DDL (Data Dictionary Language)
- Data
DUMP文件包含所有重新创建Data Dictionary的DDL语句,基本上是可以读的格式。但是应该注意的是,千万不要用文本编辑器编辑之,oracle说不支持这样做的。下面列出的是DUMP文件中包括的ORACLE对象,分为TABLE/USER/FULL方式,有些对象只是在FULL方式下才有(比如public synonyms, users, roles, rollback segm
ents等)Table mode User Mode Full Database Mode
---------------------- ---------------------- ----------------------
---
Table definitions Table definitions Table definitions
Table data Table data Table data
Owner‘s table grants Owner‘s grants Grants
Owner‘s table indexes Owner‘s indexes Indexes
Table constraints Table constraints Table constraints
Table triggers Table triggers All triggers
Clusters Clusters
Database links Database links
Job queues Job queues
Refresh groups Refresh groups
Sequences Sequences
Snapshots Snapshots
Snapshot logs Snapshot logs
Stored procedures Stored procedures
Private synonyms All synonyms
Views Views
Profiles
Replication catalog
Resource cost
Roles
Rollback segments
System audit options
System privileges
Tablespace definitions
Tablespace quotas
User definitions
4、IMPORT时的对象倒入顺序在倒入数据时,ORACLE有一个特定的顺序,可能随数据库版本不同而有所变化,但是现在是这样的。1. Tablespaces 14. Snapshot Logs
2. Profiles 15. Job Queues
3. Users 16. Refresh Groups
4. Roles 17. Cluster Definitions
5. System Privilege Grants 18. Tables (also grants,commen
ts,
6. Role Grants indexes, constraints, audi
ting)
7. Default Roles 19. Referential Integrity
8. Tablespace Quotas 20. POSTTABLES actions
9. Resource Costs 21. Synonyms
10. Rollback Segments 22. Views
11. Database Links 23. Stored Procedures
12. Sequences 24. Triggers, Defaults and Aud
iting
13. Snapshots按这个顺序主要是解决对象之间依赖关系可能产生的问题。TRIGGER最后导入,所以在INSERT数据到数据库时不会激发TRIGGER。在导入后可能会有一些状态是INVALID的PROC
EDURE,主要是IMPORT时会影响一些数据库对象,而IMPORT并不重新编译PROCEDURE,从而造成这种情况,可以重新编译之,就能解决这个问题。5、兼容性问题IMPORT工具可以处理EXPORT 5.1.22之后的版本导出的DUMP文件,所以你用ORACL
E7的IMPORT处理ORACLE6的DUMP文件,依次类推,但是ORACLE如果版本相差很大有可能不能处理。具体的问题可以参照相应的文档,比如有关参数设置等(COMPATIBLE参数)6、EXPORT需要的VIEW
EXPORT需要的VIEW是由CATEXP.SQL创建,这些内部VIEW用于EXPORT组织DUMP文件中数据格式。大部分VIEW用于收集创建DDL语句的,其他的主要供ORACLE开发人员用。这些VIEW在不同ORACLE版本之间有可能不同,每个版本可能都有新的特性加入。所以在新的版本里面执行旧的dump文件会有错误,一般可以执行CATEXP.SQL解决这些问题,解决向后兼容问题的一般步骤如下:导出数据库的版本比目标数据库老的情况:-在需要导入的目标数据库中执行旧的CATEXP.SQL
-使用旧的EXPORT导出DUMP文件-使用旧的IMPORT导入到数据库中-在数据库中执行新的CATEXP.SQL,以恢复该版本的EXPORT VIEW导出数据库的版本比目标数据库新的情况:-在需要导入的目标数据库中执行新的CATEXP.SQL
-使用新的EXPORT导出DUMP文件-使用新的IMPORT导入到数据库中-在数据库中执行旧的CATEXP.SQL,以恢复该版本的EXPORT VIEW
7、碎片整理EXPORT/IMPORT一个很重要的应用方面就是整理碎片。因为如果时初次IMPPORT,就会重新CREATE TABLE再导入数据,所以整张表都是连续存放的。另外缺省情况下EXPORT会在生成DUMP文件是“压缩(COMPRESS)”TABLE,但是这种压缩在很多情况下被误解。事实上,COMPRESS是改变STORAGE参数INITIAL的值。比如:CREATE TABLE .... STORAGE( INITIAL 10K NEXT 10K..)现在数据已经扩展到100个EXTENT,如果采用COMPRESS=Y来EXPORT数据,则产生的语句时STORAGE( INITIAL 1000K NEXT 10K)我们可以看到NEXT值并没有改变,而INITIAL是所有EXTENT的总和。所以会出现如下情况,表A有4个100M的EXTENT,执行DELETE FROM A,然后再用COMPRESS=Y导出数据,产生的CREATE TABLE语句将有400M的INITIAL EXTENT。即使这是TABLE中已经没有数据!!这是的DUMP文件即使很小,但是在IMPORT时就会产生一个巨大的TABLE.另外,也可能会超过DATAFILE的大小。比如,有4个50M的数据文件,其中表A有15个10M的EXTENT,如果采用COMPRESS=Y的方式导出数据,将会有INITIAL=150M,那么在重新导入时,不能分配一个150M的EXTENT,因为单个EXTENT不能跨多个文件。8、在USER和TABLESPACE之间传送数据一般情况下EXPORT的数据要恢复到它原来的地方去。如果SCOTT用户的表以TABLE或USER方式EXPORT数据,在IMPORT时,如果SCOTT用户不存在,则会报错!以FULL方式导出的数据带有CREATE USER的信息,所以会自己创建USER来存放数据。当然可以在IMPORT时使用FROMUSER和TOUSER参数来确定要导入的USER,但是要保证TOUSER一定已经存在啦。9、EXPORT/IMPORT对SQUENCE的影响在两种情况下,EXPORT/IMPORT会对SEQUENCE。(1)如果在EXPORT时,用户正在取SEQUENCE的值,可能造成SEQUENCE的不一致。(2)另外如果SEQUENCE使用CACHE,在EXPORT时,那些在CACHE中的值就会被忽略的,只是从数据字典里面取当前值EXPORT。如果在进行FULL方式的EXPORT/IMPORT时,恰好在用sequence更新表中某列数据,而且不是上面两种情况,则导出的是更新前的数据。如果采用常规路径方式,每一行数据都是用INSERT语句,一致性检查和INSERT T
RIGGER如果采用DIRECT方式,某些约束和trigger可能不触发,如果在trigger中使用sequence.nextval,将会对sequence有影响。参数解:E:\>exp help=y通过输入EXP命令和用户名/口令,您可以在用户/口令之后的命令:实例: EXP SCOTT/TIGER或者,您也可以通过输入跟有各种参数的EXP命令来控制“导出”的运行方式。要指定参数,您可以使用关键字:格式: EXP KEYWORD=value或KEYWORD=(value1,value2,...,valueN)实例: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)或TABLES=(T1: P1,T1: P2),如果T1是分区表USERID必须是命令行中的第一个参数。关键字说明(默认)---------------------------------------------------
USERID用户名/口令FULL导出整个文件(N)
BUFFER数据缓冲区的大小OWNER所有者用户名列表FILE输出文件(EXPDAT.DMP)
TABLES表名列表COMPRESS导入一个范围(Y)
RECORDLENGTH IO记录的长度GRANTS导出权限(Y)
INCTYPE增量导出类型INDEXES导出索引(Y)
RECORD跟踪增量导出(Y)
ROWS导出数据行(Y)
PARFILE参数文件名CONSTRAINTS导出限制(Y)
CONSISTENT交叉表一致性LOG屏幕输出的日志文件STATISTICS分析对象(ESTIMATE)
DIRECT直接路径(N)
TRIGGERS导出触发器(Y)
FEEDBACK显示每x行(0)的进度FILESIZE各转储文件的最大尺寸QUERY选定导出表子集的子句下列关键字仅用于可传输的表空间TRANSPORT_TABLESPACE导出可传输的表空间元数据(N)
TABLESPACES将传输的表空间列表E:\>imp help=y可以通过输入IMP命令和您的用户名/口令跟有您的用户名/口令的命令:实例: IMP SCOTT/TIGER或者,可以通过输入IMP命令和各种自变量来控制“导入”按照不同参数。要指定参数,您可以使用关键字:格式: IMP KEYWORD=value或KEYWORD=(value1,value2,...,vlaueN)实例: IMP SCOTT/TIGER IGNORE=Y TABLES=(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)
RECORDLENGTH IO记录的长度GRANTS导入权限(Y)
INCTYPE增量导入类型INDEXES导入索引(Y)
COMMIT提交数组插入(N)
ROWS导入数据行(Y)
PARFILE参数文件名LOG屏幕输出的日志文件CONSTRAINTS导入限制(Y)
DESTROY覆盖表空间数据文件(N)
INDEXFILE将表/索引信息写入指定的文件SKIP_UNUSABLE_INDEXES跳过不可用索引的维护(N)
ANALYZE执行转储文件中的ANALYZE语句(Y)
FEEDBACK显示每x行(0)的进度TOID_NOVALIDATE跳过指定类型id的校验FILESIZE各转储文件的最大尺寸RECALCULATE_STATISTICS重新计算统计值(N)下列关键字仅用于可传输的表空间TRANSPORT_TABLESPACE导入可传输的表空间元数据(N)
TABLESPACES将要传输到数据库的表空间DATAFILES将要传输到数据库的数据文件TTS_OWNERS拥有可传输表空间集中数据的用户
---------------------------------------------------------------------------
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。
执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行,
DOS中可以执行时由于 在oracle 8i 中 安装目录ora81BIN被设置为全局路径,
该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。
oracle用java编写,SQLPLUS.EXE、EXP.EXE、IMP.EXE这两个文件有可能是被包装后的类文件。
SQLPLUS.EXE调用EXP.EXE、IMP.EXE所包裹的类,完成导入导出功能。
下面介绍的是导入导出的实例。
数据导出:
1 将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中
exp system/manager@TEST file=d:daochu.dmp full=y
2 将数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:daochu.dmp owner=(system,sys)
3 将数据库中的表inner_notify、notify_staff_relat导出
exp aichannel/aichannel@TESTDB2 file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)
4 将数据库中的表table1中的字段filed1以"00"打头的数据导出
exp system/manager@TEST file=d:daochu.dmp tables=(table1) query=" where filed1 like ‘00%‘"
上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。
也可以在上面命令后面 加上 compress=y 来实现。
数据的导入
1 将D:daochu.dmp 中的数据导入 TEST数据库中。
imp system/manager@TEST file=d:daochu.dmp
imp aichannel/aichannel@HUST full=y file=d:datanewsmgnt.dmp ignore=y
上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。
在后面加上 ignore=y 就可以了。
2 将d:daochu.dmp中的表table1 导入
imp system/manager@TEST file=d:daochu.dmp tables=(table1)
基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。
注意:
操作者要有足够的权限,权限不够它会提示。
数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。
附录一:
给用户增加导入数据权限的操作
第一,启动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
执行示例:
F:WorkOracle_Databackup>imp userid=test/test full=y file=inner_notify.dmp
屏幕显示
Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006
(c) Copyright 2000 Oracle Corporation. All rights reserved.
连接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
经由常规路径导出由EXPORT:V08.01.07创建的文件
已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入
导出服务器使用UTF8 NCHAR 字符集 (可能的ncharset转换)
. 正在将AICHANNEL的对象导入到 AICHANNEL
. . 正在导入表 "INNER_NOTIFY" 4行被导入
准备启用约束条件...
成功终止导入,但出现警告。
附录二:
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
以下我自己补充:
1.在导入导出命令中加上feedback=1000可以让过程显示一个不断增多的“...”,以改变以往的闪烁的光标