由于使用EXP备份的数据进行恢复时,一般需要重新创建数据库,导入备份的数据,恢复的过程可能会极为漫长;如果是做局部恢复(只对部分用户或部分表的恢复)则要相对简单。
EXP的工具帮助同样可以通过命令行查询得到:
C:>imp -help
Import: Release 10.2.0.1.0 - Production on 星期六 2月 3 17:07:39 2007
Copyright © 1982, 2005, Oracle. All rights reserved.
通过输入 IMP 命令和您的用户名/口令, 导入
操作将提示您输入参数:
例如: IMP SCOTT/TIGER
或者, 可以通过输入 IMP 命令和各种参数来控制导入
的运行方式。要指定参数, 您可以使用关键字:
格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例如: 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)
FEEDBACK 每 x 行显示进度 (0)
TOID_NOVALIDATE 跳过指定类型 ID 的验证
FILESIZE 每个转储文件的最大大小
STATISTICS 始终导入预计算的统计信息
RESUMABLE 在遇到有关空间的错误时挂起 (N)
RESUMABLE_NAME 用来标识可恢复语句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待时间
COMPILE 编译过程, 程序包和函数 (Y)
STREAMS_CONFIGURATION 导入流的一般元数据 (Y)
STREAMS_INSTANTIATION 导入流实例化元数据 (N)
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
TABLESPACES 将要传输到数据库的表空间
DATAFILES 将要传输到数据库的数据文件
TTS_OWNERS 拥有可传输表空间集中数据的用户
成功终止导入, 没有出现警告。
帮助文件已经极为详尽,下面只对特殊情况作一点简要说明。
1.导入数据到不同的表空间
很多朋友在进行数据迁移时,希望把数据导入不同于原系统的表空间,在导入之后却往往发现,数据被导入了原表空间。这是因为如果缺省的原用户具有unlimited tablespace的权限,那么导入时会按照原来的位置导入数据,即导入到原表空间。
以下是一个测试范例,目标是将jive用户的数据倒入到bjbbs用户下,就可以通过fromuser和touser参数来将数据导入到不同用户下:
$ imp bjbbs/passwd file=bj_bbs.dmp fromuser=jive touser=bjbbs grants=n
Import: Release 8.1.7.4.0 - Production on Mon Sep 22 11:49:41 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
……
Export file created by EXPORT:V08.01.07 via conventional path
Warning: the objects were exported by JIVE, not by you
import done in ZHS16GBK character set and ZHS16GBK NCHAR character set
. . importing table "HS_ALBUMINBOX" 12 rows imported
....
. . importing table "JIVEUSERPROP" 4 rows imported
. . importing table "JIVEWATCH" 0 rows imported
. . importing table "PLAN_TABLE" 0 rows imported
. . importing table "TMZOLDUSER" 3 rows imported
. . importing table "TMZOLDUSER2" 3 rows imported
About to enable constraints...
Import terminated successfully without warnings.
但是导入完成后发现,新导入的数据仍然被存储在了jive用户的缺省表空间USER中,并未按设想导入bjbbs用户的缺省表空间:
$ sqlplus bjbbs/passwd
SQL*Plus: Release 8.1.7.0.0 - Production on Mon Sep 22 11:50:03 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
……
SQL> select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
HS_ALBUMINBOX USERS
...
JIVEWATCH USERS
PLAN_TABLE USERS
TMZOLDUSER USERS
TMZOLDUSER2 USERS
45 rows selected.
drop掉用户,重新创建并回收用户unlimited tablespace权限:
SQL> create user bjbbs identified by passwd
2 default tablespace bjbbs
3 temporary tablespace temp
4 /
User created.
SQL> grant connect,resource to bjbbs;
Grant succeeded.
SQL> grant dba to bjbbs;
Grant succeeded.
SQL> revoke unlimited tablespace from bjbbs;
Revoke succeeded.
SQL> alter user bjbbs quota 0 on users;
User altered.
SQL> alter user bjbbs quota unlimited on bjbbs;
User altered.
重新导入数据:
imp bjbbs/passwd file=bj_bbs.dmp fromuser=jive touser=bjbbs grants=n
再来查询,可以发现现在数据被导入到正确的用户表空间中:
SQL> select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
HS_ALBUMINBOX BJBBS
....
JIVETHREAD BJBBS
JIVETHREADPROP BJBBS
JIVEUSER BJBBS
JIVEUSERPERM BJBBS
TMZOLDUSER2 BJBBS
使用indexfile进行导入
在有些特殊的情况下(如创建对象时强制指定非缺省表空间),以上的方法可能还是不能奏效,那么IMP工具还有另外一个参数可以供使用,这个参数就是INDEXFILE,当执行导入时指定参数INDEXFILE后,系统就将创建表和索引等的语句写到一个文件,通过编辑这个文件,就可以修改对象的创建语句,将表空间更改为希望的目标表空间,然后运行这个脚本完成对象创建,之后导入数据时至需要指定INGNORE=Y忽略创建错误,Oracle就可以将数据导入到正确的表空间;如果需要变更用户,则还需要制定FROMUSER和TOUSER参数。
来看一个简单的测试,通过indexfile来执行一次导入(数据并不会被导入):
[oracle@jumper oracle]$ imp eygle/eygle file=test.dmp indexfile=test.idx rows=n
……
Export file created by EXPORT:V09.02.00 via conventional path
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
. . skipping table "TEST"
Import terminated successfully without warnings.
检查indexfile:
[oracle@jumper oracle]$ cat test.idx
REM CREATE TABLE "EYGLE"."TEST" ("OWNER" VARCHAR2(30), "OBJECT_NAME"
REM VARCHAR2(128), "SUBOBJECT_NAME" VARCHAR2(30), "OBJECT_ID" NUMBER,
REM "DATA_OBJECT_ID" NUMBER, "OBJECT_TYPE" VARCHAR2(18), "CREATED" DATE,
REM "LAST_DDL_TIME" DATE, "TIMESTAMP" VARCHAR2(19), "STATUS" VARCHAR2(7),
REM "TEMPORARY" VARCHAR2(1), "GENERATED" VARCHAR2(1), "SECONDARY"
REM VARCHAR2(1)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
REM STORAGE(INITIAL 131072 FREELISTS 1 FREELIST GROUPS 1) TABLESPACE
REM "EYGLE" LOGGING NOCOMPRESS ;
缺省地,所有的数据都被标记为注释(REM),修改TABLESPACE信息并去掉REM注释后该文件就可以被SQL*Plus调用来创建对象了。
在执行导入数据的操作时,为了加快导入速度,可以指定commit=yes参数,在imp同时进行批量提交,避免导入事务过大,消耗过量的回滚段。