Oracle导出程序Exp的使用
Oracle的导出实用程序(Export utility)允许从数据库提取数据,并且将数据写入操作系统文件。exp使用的基本格式:exp[username[/password[@service]]],以下例举exp常用用法。
1. 获取帮助
exp help=y
2. 导出一个完整数据库
exp system/manager file=bible_db log=dible_db full=y
3. 导出数据库定义而不导出数据
exp system/manager file=bible_db log=dible_db full=y rows=n
4. 导出一个或一组指定用户所属的全部表、索引和其他对象
exp system/manager file=seapark log=seapark owner=seapark exp system/manager file=seapark log=seapark owner=(seapark,amy,amyc,harold)
注意:在导出用户时,尽管已经得到了这个用户的所有对象,但是还是不能得到这些对象引用的任何同义词。解决方法是用以下的SQL*Plus命令创建一个脚本文件,运行这
个脚本文件可以获得一个重建seapark所属对象的全部公共同义词的可执行脚本,然后在目标数据库上运行该脚本就可重建同义词了。
SET LINESIZE 132 SET PAGESIZE 0 SET TRIMSPOOL ON SPOOL c:\\seapark.syn SELECT
'Create
public
synonym
'||synonym_name
||'
for
'||table_owner||'.'||table_name||';' FROM dba_synonyms WHERE table_owner = 'SEAPARK' AND owner = 'PUBLIC'; SPOOL OFF
5. 导出一个或多个指定表
exp seapark/seapark file=tank log=tank tables=tank exp system/manager file=tank log=tank tables=seapark.tank exp system/manager file=tank log=tank tables=(seapark.tank,amy.artist)
6. 估计导出文件的大小
全部表总字节数:
SELECT sum(bytes)
FROM dba_segments
WHERE segment_type = 'TABLE';
seapark用户所属表的总字节数:
SELECT sum(bytes)
FROM dba_segments
WHERE owner = 'SEAPARK'
AND segment_type = 'TABLE';
seapark用户下的aquatic_animal表的字节数:
SELECT sum(bytes)
FROM dba_segments
WHERE owner = 'SEAPARK'
AND segment_type = 'TABLE'
AND segment_name = 'AQUATIC_ANIMAL';
7. 导出表数据的子集(oracle8i以上)
NT系统:
exp system/manager query='Where tables=amy.salad_type file=fruit log=fruit
salad_type=''FRUIT'''
UNIX系统:
exp system/manager query=\\\"Where salad_type=\\'FRUIT\\'\\\"
tables=amy.salad_type file=fruit log=fruit
8. 用多个文件分割一个导出文件
exp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4) log=paycheck, filesize=1G tables=hr.paycheck
9. 使用参数文件
exp system/manager parfile=bible_tables.par
bible_tables.par参数文件:
#Export the sample tables used for the Oracle8i Database Administrator's Bible.
file=bible_tables
log=bible_tables
tables=(
amy.artist
amy.books
seapark.checkup seapark.items )
10. 增量导出
• \"完全\"增量导出(complete),即备份整个数据库
exp system/manager inctype=complete file=990702.dmp
• \"增量型\"增量导出(incremental),即备份上一次备份后改变的数据
exp system/manager inctype=incremental file=990702.dmp
• \"累计型\"增量导出(cumulative),即备份上一次\"完全\"导出之后改变的数据
exp system/manager inctype=cumulative file=990702.dmp
附:常用参数说明
参数 说明
file
指定导出文件名。默认值是file=expdat.dmp。默认的文件扩展名是.dmp
filesize
允许使用多个文件分布式导出数据。默认值为filesize=0,表示所有的数据被写入一个文件。可以选filesize=1024(1K,1M,1G)
full
full=y时,表示整个数据库将被导出。默认值为full=n
help
控制帮助屏幕的显示。它的参数是help=y;没有help=n选项
inctype
指定增量导出选项
1. complete:完全
2. incremental:增量 (导出上次任何导出后改变的所有数据库对象)
3. cumulative:累计 (导出上次cumulative,complete导出后改变的所有数据库对象)
indexes
指定索引是否被导出。默认值为indexes=y。如果不希望索引被导出,用indexes=n
log
指定收集导出信息(包括任何错误信息)的逻辑文件名。默认的文件扩展名是.log
owner
允许为指定用户或一列用户导出数据和对象
parfile
允许从一个文件读取导出参数
query
指定从一个或更多的表中导出行的一个子集。它的参数值在where语句中,并且被应用于select语句,在这里export不导出每一个表
rows
控制表数据是否被导出。默认值为rows=y,表示数据被导出。rows=n表示只想导出表定义,而不想导出表的数据
tables
允许导入一个指定的表或一列表
++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++
例子
连接 普通连接conn username/password@dbname
控制lisenter的工具:listener control
lsnrctl命令进入listener操作
stop命令 停止
start 启动
导出数据库 exp help-y帮助
exp username/pass@dbname tables=\"tablename\" File=c:\\name.DMP
通过参数文件导出
exp PARFILE=C:\\NAME.TXT -----------userid=username/pass
file=c:\\exp.dmp
tables=\"tablename\"
exp username/pass file=c:\\expdmp tables=\"tablename\" query='id like ''4%'''
....................................................query='id =0010'
把用户下的表导出
exp username/pass owner='username' file=c:\\exp.dmp
如何将EXP出来的数据IMP到不同表空间
前几天部门经理在IMP数据时想将数据导入到不同于原系统的表空间去,却发现怎么也不成功,数据还是导入到原来的表空间。
我看了一下,他在新系统上创建的这个用户授予了CONNECT,RESOURCE,DBA等角色,而且这个用户有UNLIMITED TABLESPACE这个系统权限。
总的来说,Oracle并没有提供什么参数让你将数据导入到指定的表空间中,数据默认还是导入到它原来所在的表空间。你可以用IMP 的SHOW参数可以看到其创建脚本中会指定TABLESPACE参数,而这个值是原系统该对象所在的表空间,跟你用户默认的表空间是没有关系的,如下:
\"CREATE TABLE \"EMPLOYEES\" (\"EMPLOYEE_ID\" NUMBER(6, 0), \"FIRST_NAME\" VARCHAR2\"
\"(20), \"LAST_NAME\" VARCHAR2(25) NOT NULL ENABLE, \"EMAIL\"
VARCHAR2(25) NOT NU\"
\"LL ENABLE, \"PHONE_NUMBER\" VARCHAR2(20), \"HIRE_DATE\" DATE NOT NULL ENABLE, \"\"
\"JOB_ID\" VARCHAR2(10) NOT NULL ENABLE, \"SALARY\" NUMBER(8, 2), \"COMMISSION_PC\"
\"T\" NUMBER(2, 2), \"MANAGER_ID\" NUMBER(6, 0), \"DEPARTMENT_ID\" NUMBER(4, 0)) \"
\"PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELIS\"
\"TS 1 FREELIST GROUPS 1) TABLESPACE \"EXAMPLE\" LOGGING NOCOMPRESS\"
. . 正在跳过表 \"EMPLOYEES\"
\"CREATE TABLE \"JOBS\" (\"JOB_ID\" VARCHAR2(10), \"JOB_TITLE\" VARCHAR2(35) NOT NU\"
\"LL ENABLE, \"MIN_SALARY\" NUMBER(6, 0), \"MAX_SALARY\" NUMBER(6, 0)) PCTFREE 1\"
\"0 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREE\"
\"LIST GROUPS 1) TABLESPACE \"EXAMPLE\" LOGGING NOCOMPRESS\"
. . 正在跳过表 \"JOBS\"
看其中的红色部分,如果在原系统中你创建EMPLOYEES指定的表空间是EXAMPLE,而此时该用户的默认表空间是USERS,那么EXP的DMP文件里是EXAMPLE,而不是USERS,当然如果你建表时没特意指定表空间,那么默认的就会是用户的默认表空间。
所以对于这个问题的解决方法是:
1. 如果目标系统中不存在跟原系统一样的表空间,这个一样,是指存储你要导入的数据的表空间
如:你要导入的数据在原系统中是存放在USERS表空间的,而在目标系统并不存在这个表空间,那么你在导入数据时数据就会导入到目标系统中该用户的默认表空间
2. 如果存在一样的表空间,则在目标系统中:
a) REVOKE UNLIMITED TABLESPACE FROM 该USER
b) 取消该用户在原系统导出数据所在表空间的配额:
SQL>ALTER USER XXX QUOTA 0 ON OLD_TABLESPACE
c) 将你要存储导入数据的表空间设为该用户默认的表空间
d) 添加该用户在其默认表空间中的配额:
SQL>ALTER USER XXX QUOTA UNLIMITED ON NEW_TABLESPACE
3. 其他方法:
a) 可以用IMP的SHOW=Y将创建脚本SPOOL出来,然后修改其创建脚本中的TABLESPACE,将其修改成你所需要的表空间。
b) 用第三方工具,比如TOAD,产生其创建脚本,然后修改TABLESPACE值,然后导入的时候加IGNORE=Y进行导入。
c) 可以先导入数据,然后用TOAD的Rebuild Multi Objects,进行数据转移。
因篇幅问题不能全部显示,请点此查看更多更全内容