概述

    exp/imp 为一种数据库备份恢复工具也可以作为不同数据库之间传递数据的工具,两个数据库所在的操作系统可以不同,exp 可以将数据库数据导出为二进制文件,imp 可以将导出的数据文件再导入到相同的数据库或不同的数据库。

1.1 exp 使用方法及实例
    数据库导出有四种模式full(全库导出), owner(用户导出), table(表导出), tablespace(表空间导出).
    full( 全库导出): 导出除ORDSYS,MDSYS,CTXSYS,ORDPLUGINS,LBACSYS 这些系统用户之外的所有用户的数据.
     owner( 用户导出): 导出某个或某些用户的所有权限和数据.
     ables( 表导出): 导出某些表(可以是不同用户的)的结构和数据.
     tablespace( 表空间导出):表空间导出数据.
     执行exp 有三种方法:交互式,命令行和参数文件
交互式:直接输入exp 命令用户可以按照exp 提示的信息一步一步操作,比较简单.
命令行:输入命令行exp username/password parameter=value.
参数文件:输入命令行exp username/password parfile=filename exp 所需的参数从参数文件引入.
参数是可以重复的优先级为命令行优于参数文件后面的参数值覆盖于前面的参数值.
下面介绍一些常用的参数没有标明的表示exp/imp 都适用imp 的参数不再单独介绍.
1.1.1 参数介绍
buffer 缓冲区大小如果此值设为0 则一次只导入一条记录对数据量大的导出可以设置较大一般缺省值即可.
file 导出的文件列表可以指定一个或多个文件名缺省扩展名为.dmp 缺省导出文件名为expdat.dmp.
filesize exp 导出文件的最大字节数超出时从文件列表中获取下一个文件名,没有,则提示输入新的文件名.
help 显示export 参数帮助信息
inctype 增量备份的类型:complete(完全),cumulative(累积)和incremental (增量).
只可以在全库导出模式下才可以做完全累积或增量导出累积导出只导出自上次累积导出或完全导出以来已经修改的表增量导出只导出自上次增量累积或完全导出以来已经修改的表完全导出将数据库中全部对象都导出不管是否以及何时被修改.
log:日志文件,一般如果以命令行导入时,将log 设置上比较好可以看,到所有的导入信息,导入信息哪儿出错,导入了那些数据库对象.
show(imp):只是用来显示备份数据文件的内容.
full:为Y 时表示在全库方式下导出缺省为N.
tables:导出的表列表可以指定一个或多个表名.
fromuser(imp):可以将导出文件中的一个用户模式的数据对象导入为另一个用户模式的对象此参数表示导出文件中的用户模式.
touser(imp):此参数表示导入到数据库中时使用的用户模式对象譬如使用全库或者用户模式导出cams 用户的所有对象到一个文件中导入时需要将用户模式名称改为cams1,此时fromuser 为cams,touser 为cams1.
1.1.2 典型用法
1. 交互式-用户导出
交互式导出比较简单,这里只举用户导出一种用法进行说明,全库导出和表导出比较简单不再列出.
[oracle@localhost script]$ exp
Export: Release 8.1.7.4.0 - Production on Fri Feb 6 15:01:07 2004
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Username: cams --此处输入启动导出的用户
Password: --此处输入相应的密码
Connected to: Oracle8i Enterprise Edition Release 8.1.7.4.0 -Production
JServer Release 8.1.7.4.0 - Production
Enter array fetch buffer size: 4096 >--此处需要输入buffer 值交互式导出时大多数参数都有缺省值,如果选用缺省值,直接回车即可.
Export file: expdat.dmp > 20040206.dmp --此处输入导出文件名
(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > --此处输入导出模式,全库导出,用户导出还是表导出,缺省为用户导出.
Export grants (yes/no): yes > --是否导出授权通常选择yes
Export table data (yes/no): yes > --是否导出表中数据如果选择no则只导出表的结构通常选择yes
Compress extents (yes/no): yes > --选择yes
Export done in ZHS16CGB231280 character set and ZHS16CGB231280 NCHAR
character set
About to export specified users ...
User to be exported: (RETURN to quit) > cams --此处输入需要导出的用户,如果需要导出多个用户的数据,exp 会一直提示用户,直至用户输入了..
User to be exported: (RETURN to quit) > .. --此处输入".."
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user CAMS
. exporting object type definitions for user CAMS
About to export CAMS's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export CAMS's tables via Conventional Path ...
. . exporting table TBL_BILLDETAIL_SWITCH 23 rows exported
. . exporting table TBL_BLACKLIST 0 rows exported
. . exporting table TBL_CHARGE_CARD 11 rows exported
. . exporting table TBL_ERROR_CODE 37 rows exported
. . exporting table TBL_EXPORT 2 rows exported
. . exporting table TBL_LOG 3008 rows exported
......
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting snapshots
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully without warnings.
说明:
(1) 在交互式导出或导入时,如果输错值,不再想进行下面的步骤,但不知如何退出此时请用". "
2. 命令行-全库导出
exp userid=cams/cams@cams full=y file=(/tmp/2004020601.dmp,
/tmp/2004020602.dmp, /tmp/2004020603.dmp) filesize=2GB
log=/tmp/20040206.log
该命令导出全库数据,导出到多个文件中,每个文件最大2GB, exp 只生成最少的导出文件,譬如导出的数据不足2GB, exp 只生成/tmp/2004020601.dmp 如果file 列表中的文件太少,不能存放所有的导出数据,exp 会提示用户输入文件名,导出过程记录日志.
说明:
(1) 由于linux 文件系统最大只支持2G 的文件,所以如果数据库数据量大超过2G 时导出将会出错,所以file 参数可以设置多个文件.
3. 命令行用户导出
exp userid=cams/cams@cams owner=cams file=(/tmp/2004020601.dmp,
/tmp/2004020602.dmp, /tmp/2004020603.dmp) filesize=2GB
log=/tmp/20040206.log
该命令导出cams 用户数据导出到多个文件中每个文件最大2GB 导出过程记录日志
4. 命令行表导出
exp userid=cams/cams@cams tables=(tbl_log, tbl_user_log)
file=(/tmp/2004020601.dmp, /tmp/2004020602.dmp) filesize=2GB
log=/tmp/20040206.log
该命令导出cams 用户的两个表的数据,导出到多个文件中,每个文件最大2GB,导出过程记录日志.
5. 命令行-完全导出
exp userid=cams/cams@cams full=y inctype=complete
file=(/tmp/2004020601.dmp, /tmp/2004020602.dmp, /tmp/2004020603.dmp)
filesize=2GB log=/tmp/20040206.log
该命令完全导出全库数据,导出到多个文件中每个文件最大2GB,导出过程记录日志.
说明:
(1) 全库导出时,增量导出类型缺省为(complete)完全,所以例5 和例2导出的结果是完全一样的.
6. 命令行-累积导出
exp userid=cams/cams@cams full=y inctype=cumulative
file=(/tmp/2004020601.dmp, /tmp/2004020602.dmp) filesize=2GB
log=/tmp/20040206.log
该命令累积导出全库数据,导出到多个文件中,每个文件最大2GB,导出过程记录日志.
说明:
(1) 如果选择了增量导出类型,则必需选择full=y,即只能在全库导出模式下进行完全累积或增量导出.
7. 命令行-增量导出
exp userid=cams/cams@cams full=y inctype=incremental
file=(/tmp/2004020601.dmp, /tmp/2004020602.dmp) filesize=2GB
log=/tmp/20040206.log
该命令累积导出全库数据,导出到多个文件中,每个文件最大2GB,导出过程记录日志.
8. 参数文件-用户导出
exp parfile=cams_exp.par

1.2用imp 工具进行数据库备份及恢复
导入模式可以分为full(全文件导入),owner(用户导入),table(表导入).
full(全文件导入):指导入文件中的所有数据,并不是指全库导入,如果文件中只存在一个表的数据全文件,导入就只能导入一个表的数据.
fromuser,touser( 用户导入):指导入文件中该用户的所有数据,如果文件中只存在一个表的数据,用户导入就只能导入一个表的数据.
tables( 表导入):指导入文件中该表的数据.
能够导入何数据很大程度上依赖于导出文件,譬如需要导入某用户的所有数据.导出文件中必须存在该用户的所有数据,即导出时必须为全库导出或用户导出.在CAMS 系统中,如果为了备份整个cams 用户的数据应该在导出时选择全库或者用户导出.
说明:
导入时需要注意需要事先创建需要导入的用户以及该用户的所有权限,所以在执行以下导入的用例之前,都需要先创建cams用户.创建CAMS用户的脚本见附录
1.2.1 典型用法
1. 交互式-用户导入
[oracle@localhost script]$ imp
Import: Release 8.1.7.4.0 - Production on Mon Feb 9 13:59:02 2004
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Username: cams --此处输入启动导入的用户
Password: --此处输入相应的密码
Connected to: Oracle8i Enterprise Edition Release 8.1.7.4.0 -Production
JServer Release 8.1.7.4.0 - Production
Import file: expdat.dmp > /tmp/2004020601.dmp
--此处输入需要导入的文件名,如果导出数据时导出到了多个文件,
则imp 会提示用户需要输入下一个需要导入的文件名.交互式导入时大多数参数都有缺省值.如果选用缺省值,直接回车即可.
Enter insert buffer size (minimum is 8192) 30720>
--此处需要输入buffer值,此处通常选择缺省值,直接回车.
Export file created by EXPORT:V08.01.07 via conventional path
import done in ZHS16CGB231280 character set and ZHS16CGB231280 NCHAR
character set
IMP-00046: using FILESIZE value from export file of 1073741824
List contents of import file only (yes/no): no >
--如果选择yes则imp 会显示出导入文件的数据,并且这些数据这不会被导入数据库中.如果事先不知道导入文件中有哪些数据,可以利用此参数查看文件内容.此处直接回车.
Ignore create error due to object existence (yes/no): no > --是否忽略对象已经存在的错误,如果选择yes 则出现对象已经存在的错误时,不显示错误信息.
Import grants (yes/no): yes > --是否导入授权通常选择yes
Import table data (yes/no): yes > --是否导入表中数据如果选择no,则只导入表的结构通常选择yes
Import entire export file (yes/no): no > --是否导入整个文件如果选择yes,则imp 导入整个文件的数据.如果选择no,则下面会提示需要导入的用户名以及表名
Username: camsii --需要导入的用户名
Enter table(T) or partition(T:P) names. Null list means all tables for
user
Enter table(T) or partition(T:P) name or . if done: . –需要导入的表名或表的分区名如果输入表名则只导入该用户模式下的表的数据如果输入回车或
.
则表示要导出该用户的所有数据此处输入
.
. . importing table "TBL_BILLDETAIL_SWITCH" 0 rows imported
. . importing table "TBL_BLACKLIST" 0 rows imported
. . importing table "TBL_CHARGE_CARD" 0 rows imported
. . importing table "TBL_DISCOUNT_BY_TIME" 0 rows imported
. . importing table "TBL_ERROR_CODE" 377 rows imported


About to enable constraints..
.
Import terminated successfully with warnings.
该命令从文件中导入cams 用户的所有数据如果有多个文件imp 会提示用户输入文件名
2. 交互式-表导入
可以利用全库导出用户导出和表导出的文件进行表导入.此例可以使用exp典型用法的例1,例2,例3,例4,例5,例8导出的文件进行导入
[oracle@localhost script]$ imp
Import: Release 8.1.7.4.0 - Production on Mon Feb 9 15:49:36 2004
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Username: cams
Password:
Connected to: Oracle8i Enterprise Edition Release 8.1.7.4.0 -Production
JServer Release 8.1.7.4.0 - Production
Import file: expdat.dmp > /tmp/2004020601.dmp
Enter insert buffer size (minimum is 8192) 30720>
Export file created by EXPORT:V08.01.07 via conventional path
import done in ZHS16CGB231280 character set and ZHS16CGB231280 NCHAR
character set
IMP-00046: using FILESIZE value from export file of 2147483648
List contents of import file only (yes/no): no >
Ignore create error due to object existence (yes/no): no >
Import grants (yes/no): yes >
Import table data (yes/no): yes >
Import entire export file (yes/no): no >
Username: cams
Enter table(T) or partition(T:P) names. Null list means all tables for
user
Enter table(T) or partition(T:P) name or . if done: tbl_log
Enter table(T) or partition(T:P) name or . if done: tbl_user_log
Enter table(T) or partition(T:P) name or . if done:
--每输入一个表名后回车,imp 会提示用户输入下一个要导入的表名,如果想结束输入表名,需要输入回车或"."
. importing CAMS's objects into CAMS
. . importing table "TBL_LOG" 10 rows imported
. . importing table "TBL_USER_LOG" 0 rows imported
Import terminated successfully with warnings.
该命令从文件中导入cams 用户的两个表的数据如果有多个文件imp 会提示用户输入文件名
3. 命令行-查看文件内容
imp userid=cams/cams@cams full=y show=y file=(tmp/2004020601.dmp,
/tmp/2004020602.dmp, /tmp/2004020603.dmp) log=/tmp/20040206.log
该命令查看了文件中都有哪些数据,如果有多个文件imp,会提示用户输入文件名导入过程记录日志.
4. 命令行-全文件导入
imp userid=cams/cams@cams full=y file=(/tmp/2004020601.dmp,
/tmp/2004020602.dmp, /tmp/2004020603.dmp) log=/tmp/20040206.log
该命令从文件中导入全部数据,如果有多个文件imp,会提示用户输入文件名,导入过程记录日志.
5. 命令行-用户导入
imp userid=cams/cams@cams fromuser=cams touser=cams
file=(/tmp/2004020601.dmp, /tmp/2004020602.dmp, /tmp/2004020603.dmp)
log=/tmp/20040206.log
该命令从文件中导入cams用户的全部数据,导出的文件中必须要有cams,用户的数据表示将导出文件的cams 用户数据导入到数据库的cams 用户中,如果有多个文件imp,会提示用户输入文件名导入过程记录日志.
6. 命令行-表导入
imp userid=cams/cams@cams tables=(tbl_user, tbl_user_log)
file=(/tmp/2004020601.dmp, /tmp/2004020602.dmp, /tmp/2004020603.dmp)
log=/tmp/20040206.log
该命令从文件中导入cams 用户的两个表的全部数据,导出的文件中必须要有cams 用户的这两个表的数据.如果有多个文件imp会提示用户输入文件名,导入过程记录日志
7. 命令行-用户导入-从增量导出文件中导入
imp userid=cams/cams@cams fromuser=cams touser=cams
file=/tmp/2004020601.dmp log=/tmp/20040206.log
该命令从增量导出文件中导入cams 用户新增的数据,导出的文件中必须要有cams 用户的数据,如果有多个文件imp 会提示用户输入文件名,导入过程记录日志.
其实导入命令和是否增量导出文件没有关系,imp 会自动判断该文件是否为增量导出文件
8. 参数文件-用户导入
imp parfile=cams_imp.par
cams_imp.par 文件的内容为:
userid=cams/cams@cams
fromuser=cams
touser=cams
file=(/tmp/2004020601.dmp, /tmp/2004020602.dmp, /tmp/2004020603.dmp)
log=/tmp/20040206.log
该命令使用了参数文件,导入文件中cams 用户的所有数据,导入过程记录日志.
说明:
(1) cams 用户保存了CAMS 系统的重要数据,为了不暴露cams 用户的密码可以将上面的userid 的值写为cams@cams,此时imp 会提示用户输入密码,输入的密码不会显示出来.