system/manager as sysdba
conn system/manager@orcl;
drop tablespace HBDB_0928 including contents and datafiles;
create tablespace HBDB_0928 datafile 'D:/oracle/product/10.1.0/oradata/orcl/HBDB_0928.DBF' size 200M autoextend on next 100M;
imp rt/rt@orcl file='D:/OMA20120927/hbzxfz20120927.dmp' full=y tablespaces=HBDB_0928;
Oracle的导入实用程序(Import utility)允许从数据库提取数据,并且将数据写入操作系统文件。imp使用的基本格式:imp[username[/password[@service]]],以下例举imp常用用法。
1. 获取帮助
imp help=y
2. 导入一个完整数据库
imp system/manager file=bible_db log=dible_db full=y ignore=y
3. 导入一个或一组指定用户所属的全部表、索引和其他对象
imp system/manager file=seapark log=seapark fromuser=seapark
imp system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)
4. 将一个用户所属的数据导入另一个用户
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)
5. 导入一个表
imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)
6. 从多个文件导入
imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4) log=paycheck, filesize=1G full=y
7. 使用参数文件
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
8. 增量导入(9i中已经取消)
imp system./manager inctype= RECTORE FULL=Y FILE=A
Oracle imp/exp帮助说明
C:Documents and Settingsadministrator>exp help=y
Export: Release 9.2.0.1.0 - Production on 星期三 7月 28 17:04:43 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
通过输入 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)
DIRECT 直接路径 (N) TRIGGERS 导出触发器 (Y)
LOG 屏幕输出的日志文件 STATISTICS 分析对象 (ESTIMATE)
ROWS 导出数据行 (Y) PARFILE 参数文件名
CONSISTENT 交叉表的一致性 (N) CONSTRAINTS 导出的约束条件 (Y)
OBJECT_CONSISTENT 只在对象导出期间设置为读的事务处理 (N)
FEEDBACK 每 x 行的显示进度 (0)
FILESIZE 每个转储文件的最大大小
FLASHBACK_SCN 用于将会话快照设置回以前状态的 SCN
FLASHBACK_TIME 用于获取最接近指定时间的 SCN 的时间
QUERY 用于导出表的子集的 select 子句
RESUMABLE 遇到与空格相关的错误时挂起 (N)
RESUMABLE_NAME 用于标识可恢复语句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待时间
TTS_FULL_CHECK 对 TTS 执行完整的或部分相关性检查
TABLESPACES 要导出的表空间列表
TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
TEMPLATE 调用 iAS 模式导出的模板名
在没有警告的情况下成功终止导出。
==================================================
C:Documents and Settingsadministrator>imp help=y
Import: Release 9.2.0.1.0 - Production on 星期三 7月 28 17:06:54 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
可以通过输入 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)
FEEDBACK 每 x 行显示进度 (0)
TOID_NOVALIDATE 跳过指定类型 ID 的验证
FILESIZE 每个转储文件的最大大小
STATISTICS 始终导入预计算的统计信息
RESUMABLE 在遇到有关空间的错误时挂起 (N)
RESUMABLE_NAME 用来标识可恢复语句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待时间
COMPILE 编译过程, 程序包和函数 (Y)
STREAMS_CONFIGURATION 导入 Streams 的一般元数据 (Y)
STREAMS_INSTANITATION 导入 Streams 的实例化元数据 (N)
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
TABLESPACES 将要传输到数据库的表空间
DATAFILES 将要传输到数据库的数据文件
TTS_OWNERS 拥有可传输表空间集中数据的用户
成功终止导入,但出现警告。
Oracle8i/9i EXP/IMP使用经验
一、8i EXP常用选项
1、FULL,这个用于导出整个数据库,在ROWS=N一起使用时,可以导出整个数据库的结构。例如:
exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
2、BUFFER和FEEDBACK,在导出比较多的数据时,我会考虑设置这两个参数。例如:
exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
3、FILL和LOG,这两个参数分别指定备份的DMP名称和LOG名称,包括文件名和目录,例子见上面。
需要说明的是,EXP可以直接备份到磁带中,即使用FILE=/dev/rmt0(磁带设备名),但是一般我们都不这么做,原因有二:一、这样做的速度会慢很多,二、现在一般都是使用磁带库的,不建议直接对磁带进行操作。至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使用。
如果你真想使用EXP直接到磁带,你可以参考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”(文档号:30428.1),该文中有详细解释。
4、COMPRESS参数将在导出的同时合并碎块,尽量把数据压缩到initial的EXTENT里,默认是N,一般建议使用。DIRECT参数将告诉EXP直接读取数据,而不像传统的EXP那样,使用SELECT来读取表中的数据,这样就减少了SQL语句处理过程。一般也建议使用。不过有些情况下DIRECT参数是无法使用的。
5、如何使用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
6、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平台,则使用下面的格式:
expc/c@ncnfile=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'"""
二、8i IMP常用选项
1、FROMUSER和TOUSER,使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。
2、IGNORE、GRANTS和INDEXES,其中IGNORE参数将忽略表的存在,继续导入,这个对于需要调整表的存储参数时很有用,我们可以先根据实际情况用合理的存储参数建好表,然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引,如果想使用新的存储参数重建索引,或者为了加快到入速度,我们可以考虑将INDEXES设为N,而GRANTS一般都是Y。
另外一个EXP/IMP都有的参数是PARFILE,它是用来定义EXP/IMP的参数文件,也就是说,上面的参数都可以写在一个参数文件中,但我们一般很少使用。
三、Oracle9i EXP功能描述
Oracle9i EXP在原有的基础上新增了部分新的参数,按功能主要分为以下几个部分:
1、OBJECT_CONSISTENT - 用于设置EXP对象为只读以保持对象的一致性。默认是N。
2、FLASHBACK_SCN和FLASHBACK_TIME - 用于支持FLASHBACK功能而新增。
3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用于支持RESUMABLE空间分配而新增。
4、TTS_FULL_CHECK - 用于在传输表空间时使用依赖性检查。
5、TEMPLATE - 用于支持iAS。
6、TABLESPACES - 设置表空间导出模式。个人觉得对于一般用户而言,这个才是新增参数中最实用的一个,可以让用户在原来的FULL、OWNER、TABLES的基础上多了一种选择,使得EXP更加灵活。
四、不同版本的EXP/IMP问题?
一般来说,从低版本导入到高版本问题不大,麻烦的是将高版本的数据导入到低版本中,在Oracle9i之前,不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决:
1、在高版本数据库上运行底版本的catexp.sql;
2、使用低版本的EXP来导出高版本的数据;
3、使用低版本的IMP将数据库导入到底版本数据库中;
4、在高版本数据库上重新运行高版本的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;
/
五、其他问题
本文只讨论了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.
六.对于有跨schema的index,imp时可能会报“Segmentation fault”错误。
例如schema A中建有基于schema B表的索引,在导入A时会报上述错误,此时通过indexes=n来屏蔽导入索引以防止错误,事后可以用以下语句查出这样的索引,最好将索引放在和基表在同一个schema。
SQL>select index_name,owner,table_name,table_owner
from dba_indexes
where owner!=table_owner;
七.导入到不同于原表空间的表空间
原来的数据在USERS表空间里面,我想把它IMP进APP表空间,我已经修改了目的用户的默认表空间,为什么结果还是IMP到USERS表空间中了呢?
Solution:Oracle并没有提供什么参数来指定要导入哪个表空间,数据默认将导入到原本导出时数据所在的表空间中,但是我们可以通过以下的方法来实现导入到不同的表空间。
1.在IMP时候使用INDEXFILE参数
当给此参数指定了某一文件名,IMP的时候所有的index将不会直接导入到表空间中,而是在指定的文件中生成创建index的脚本。
然后用文本编辑器打开此文件,直接编辑脚本中的storage参数,修改为想要导入的表空间名称。
然后重新执行IMP,使用INDEXS=n参数将除Index之外的Objects导入。
最后进入SQL*PLUS,直接运行刚才编辑的脚本,生成索引。
该方法适用于将index以及constraints导入指定的表空间。
2.改变目的用户的默认表空间
这就是上面说的经常有人提问的方法。但是上述的问题之所以没有成功,是因为缺少了下面的几步。
首先,收回目的用户的"UNLIMITED TABLESPACE"权限:
revoke unlimited tablespace from username;
其次,取消目的用户在原数据导出表空间中的配额,这样才能迫使IMP把数据导入到用户的默认表空间中去。
然后,将希望导入的表空间设为目的用户的默认表空间,并添加配额。
最后,执行IMP。
3.使用TOAD
TOAD是强大的Oracle数据库管理软件,是Quest出品的第三方软件,我们可以使用其中的Rebuild Multi Objects工具来实现将多个Object转移到指定的表空间。
于是我们可以不管三七二十一,先IMP,然后再用TOAD作事后的修改。
关于TOAD的使用,此处不作详细解释。
八.导入工具imp可能出现的问题
(1) 数据库对象已经存在
一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等;
数据库对象已经存在, 按缺省的imp参数, 则会导入失败
如果用了参数ignore=y, 会把exp文件内的数据内容导入
如果表有唯一关键字的约束条件, 不合条件将不被导入
如果表没有唯一关键字的约束条件, 将引起记录重复
(2) 数据库对象有主外键约束
不符合主外键约束时, 数据会导入失败
解决办法: 先导入主表, 再导入依存表
disable目标导入对象的主外键约束, 导入数据后, 再enable它们
(3) 权限不够
如果要把A用户的数据导入B用户下, A用户需要有imp_full_database权限
(4) 导入大表( 大于80M ) 时, 存储分配失败
默认的EXP时, compress = Y, 也就是把所有的数据压缩在一个数据块上.
导入时, 如果不存在连续一个大数据块, 则会导入失败.
导出80M以上的大表时, 记得compress= N, 则不会引起这种错误.
(5) imp和exp使用的字符集不同
如果字符集不同, 导入会失败, 可以改变unix环境变量或者NT注册表里 NLS_LANG相关信息.导入完成后再改回来.
(6) imp和exp版本不能往上兼容
imp可以成功导入低版本exp生成的文件, 不能导入高版本exp生成的文件
根据情况我们可以用低版本的oracle客户端的exp导出数据库,然后进行导入操作。
(7)ROLLBACK段不够
Export/Import使用过程中, 如果数据量很大会出现'ROLLBACK段不够'的错误. 这时要建一个足够大的ROLLBACK段, 使它ONLINE而其他ROLLBACK段OFFLINE. 这样, Export/Import使用这个大ROLLBACK段, 从而避免上述现象.
(8)EXPORT/IMPORT对SQUENCE的影响
在两种情况下,EXPORT/IMPORT会对SEQUENCE。
a. 如果在EXPORT时,用户正在取SEQUENCE的值,可能造成SEQUENCE的不一致。
b. 另外如果SEQUENCE使用CACHE,在EXPORT时,那些在CACHE中的值就会被忽略的,只是从数据字典里面取当前值EXPORT。如果在进行FULL方式的EXPORT/IMPORT时,恰好在用sequence更新表中某列数据, 而且不是上面两种
情况,则导出的是更新前的数据。如果采用常规路径方式,每一行数据都是用INSERT语句,一致性检查和INSERT TRIGGER 如果采用DIRECT方式,某些约束和trigger可能不触发,如果在trigger中使用sequence.nextval,将会对sequence有影响。
九.ORACLE获取DDL的几种常用的方法
大体的分为三种方法:
1.可以通过toad、plsql develop等第三方工具进行导出DLL操作,用这种办法的好处在于操作简单方便,但需要安装,下面简单介绍一下用这两个工具获得DLL语句的操作。
2.直接通过EXP/IMP工具
Oracle提供的最原始最实用的导入导出工具,我们大体上可以分为三种办法实现导出DDL。
a. 通过imp指定indexfile参数,但这种办法不爽在于有每行前会有REM
语法大体如下:
exp userid=... tables=emp rows=n file=emp.dmp
imp userid=... file=emp.dmp indexfile=emp.sql
b. 通过imp指定show=y,同时指定log参数,格式上也不是很爽,在格式上很美观的还是通过工具导出的比较美观
语法大体如下:
exp userid=... tables=emp rows=n file= emp.dmp
imp userid=... file= emp.dmp show=y log=emp.sql
c. 利用unix下有strings命令,语法大体如下,这种方法比较野蛮:
exp userid=... tables=tab1 rows=n file=tab1.dmp
strings emp.dmp >emp.sql
emp.sql中就有DLL语句了
3.通过9i的DBMS_METADATA包得到DLL语句
基本上用到的语法如下:
a. 获取单个的建表和建索引的语法
set heading off;
set echo off;
Set pages 999;
set long 90000;
spool DEPT.sql
select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') from dual;
select dbms_metadata.get_ddl('INDEX','DEPT_IDX','SCOTT') from dual;
spool off;
b.获取一个SCHEMA下的所有建表和建索引的语法,以scott为例:
set pagesize 0
set long 90000
set feedback off
set echo off
spool scott_schema.sql
connect scott/tiger;
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
FROM USER_TABLES u;
SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name)
FROM USER_INDEXES u;
spool off;
c. 获取某个SCHEMA的建全部存储过程的语法
connect brucelau /brucelau;
spool procedures.sql
select
DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name)
from
user_objects u
where
object_type = 'PROCEDURE';
spool off;
另:dbms_metadata.get_ddl('TABLE','TAB1','USER1')
三个参数中,第一个指定导出DDL定义的对象类型(此例中为表类型),第二个是对象名(此例中即表名),第三个是对象所在的用户名。
十.优化exp和imp的性能
exp /imp 可配置一些参数,以改进Export和Import的性能。至于性能具体能提升多
高,则取决于要导出或导入的数据,以及数据量的大小。
导出性能:用以下通用参数改进Export的性能:
DIRECT:对一个Export,将DIRECT参数设为DIRECT=Y,将数据直接转移到Export客户端。这样的转移绕过SQL命令处理层(估值缓冲区),从而避免了无谓的数据转换。
RECORDLENGTH:增大RECORDLENGTH参数值,来改进性能。为该参数推荐的值是DB_BLOCK_SIZE的一个整数倍,或者是文件系统I/O块大小的一个整数倍。更改这个参数的值会影响写入磁盘前积累的数据量。该参数的最大值为64千字节(64 KB)。
导入性能:用以下通用参数改进Import的性能:
BUFFER:BUFFER参数指定了缓冲区的大小,数据行将通过这个缓冲区进行转移,由此便决定了由Import导入的每个阵列插入中的行数。如配合COMMIT=Y参数指定BUFFER参数,则Import会在每一个阵列插入之后进行提交,而不是在载入完整的表之后再默认地提交。一个较大的BUFFER参数值有助于改善性能。但假如BUFFER值过高,会造成OS分页和换行,反而影响性能。
INDEXES。INDEXES参数指定是否导入用户生成的索引。如指定INDEXES=N,则将提高Import的性能,因为在一个无索引的表中导入数据要快得多。注意,如果首先用INDEXFILE=返回Import,来在请求的Import模式下提取索引创建命令,再将其写入指定的文件,那么以后仍可重建索引。
使用INDEXFILE选项时,不会导入数据对象。可对输出文件()进行编辑,并将其作为一个SQL脚本使用,以便在Import之后创建索引。
另外还可以通过调整一下参数提高exp和imp的性能
? 修改sqlnet.ora在里面增加trace_level_client=off
? 执行dbmspool.sql然后SQL>begin
SQL> dbms_shared_pool.sizes(300);
SQL> end;
SQL> /
? sql>ALTER SYSTEM FLUSH SHARED_POOL
? sql>alter system set LOG_CHECKPOINT_INTERVAL = redologfilesizebytes/512bytes=1000
也可以修改log_checkpoint_timeout=24000
? sql>alter system set fast_start_mttr_target =24000
? sql>alter system set pga_aggregate_target=100M
没有下commit=y所以只有通过
A.select undtsn,undoblks from v$undostat;的变化来看资料又没有进去了
B. 在imp时通过设定 FEEDBACK=N笔资料来显示Imp的进度
重整的时候如果要drop 掉table重建的话,一定要注意该table上有没有FK等
在EXP /IMP的时候为了加速需要将index=n参数加进exp/imp执行脚本,这样的话在做完imp后需要recreate index 其实资料量大的话recreate也很花时间,故可以通过在create index 的脚本里面加入parallel 5;来提速
另I/O可以在Windows 的效能的地方看到
十一.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,comments,
6. Role Grants indexes, constraints, auditing)
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 Auditing
13. Snapshots
按这个顺序主要是解决对象之间依赖关系可能产生的问题。TRIGGER最后导入,所以在INSERT数据到数据库时不会激发TRIGGER。在导入后可能会有一些状态是INVALID的PROCEDURE,主要是IMPORT时会影响一些数据库对象,而IMPORT并不重新编译PROCEDURE,从而造成这种情况,可以重新编译之,就能解决这个问题。
十二. Imp/exp的模糊导入导出
前段时间在网上看到一篇关于imp/exp模糊导入导出的文章,甚感兴趣,今天中午做了一个测试,感觉Oracle实在是博大,有很多东西不用的话,对我们来说永远是一个陌生的地带。揭去面纱,也就那么回事!
说明:使用通配符导出的最大优点,就是当你的库中有很多表,但你又不想全导,只导其中一部分的时候,你可以尽可能的少写部分代码,提供工作效率!
我一般喜欢以示例的方式展现或表达一些东西,这样大家可能了解/掌握的更快以下!毕竟很多东西我们大部分同志知其然就可以了!嘿嘿。^|^
备注:该项特性在9i以后新增
测试过程如下:
SQL> conn study/study
已连接。
SQL>
SQL> create table toms_test_1 (no int);
表已创建。
SQL> create table toms_test_2 (no int);
表已创建。
SQL> create table toms_test_3 (no int);
表已创建。
SQL> insert into toms_test_1 values(1);
已创建 1 行。
SQL> insert into toms_test_2 values(2);
已创建 1 行。
SQL> insert into toms_test_3 values(3);
已创建 1 行。
SQL> commit;
提交完成。
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:Documents and Settings>e:
E:>exp study/study tables=(study.toms_test%) file=toms_test.dmp rows=y
Export: Release 9.2.0.1.0 - Production on 星期三 6月 7 12:42:32 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径 ...
. . 正在导出表 TOMS_TEST_1 1 行被导出
. . 正在导出表 TOMS_TEST_2 1 行被导出
. . 正在导出表 TOMS_TEST_3 1 行被导出
在没有警告的情况下成功终止导出。
SQL>
SQL> drop table toms_test_1;
表已丢弃。
SQL> drop table toms_test_2;
表已丢弃。
SQL> drop table toms_test_3;
表已丢弃。
SQL>
SQL> select table_name from tabs where table_name like 'TOMS_TEST%';
未选定行
SQL>
E:>imp study/study file=toms_test.dmp fromuser=study touser=study
Import: Release 9.2.0.1.0 - Production on 星期三 6月 7 12:44:01 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. . 正在导入表 "TOMS_TEST_1" 1行被导入
. . 正在导入表 "TOMS_TEST_2" 1行被导入
. . 正在导入表 "TOMS_TEST_3" 1行被导入
成功终止导入,但出现警告。
E:>
SQL> select table_name from tabs where table_name like 'TOMS_TEST%';
TABLE_NAME
------------------------------
TOMS_TEST_1
TOMS_TEST_2
TOMS_TEST_3
SQL> select * from toms_test_1;
NO
----------
1
SQL> select * from toms_test_2;
NO
----------
2
SQL> select * from toms_test_3;
NO
----------
3
SQL>
SQL> select table_name from tabs where table_name like '%TEST%';
TABLE_NAME
------------------------------
TOMS_TEST_1
TOMS_TEST_2
TOMS_TEST_3
SQL>
E:>exp study/study tables=(study.%test%) file=test.dmp rows=y
Export: Release 9.2.0.1.0 - Production on 星期三 6月 7 12:51:56 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径 ...
. . 正在导出表 TOMS_TEST_1 1 行被导出
. . 正在导出表 TOMS_TEST_2 1 行被导出
. . 正在导出表 TOMS_TEST_3 1 行被导出
在没有警告的情况下成功终止导出。
E:>
SQL> drop table toms_test_1;
表已丢弃。
SQL> drop table toms_test_2;
表已丢弃。
SQL> drop table toms_test_3;
表已丢弃。
SQL>
E:>imp study/study file=test.dmp fromuser=study touser=study
Import: Release 9.2.0.1.0 - Production on 星期三 6月 7 12:53:11 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. . 正在导入表 "TOMS_TEST_1" 1行被导入
. . 正在导入表 "TOMS_TEST_2" 1行被导入
. . 正在导入表 "TOMS_TEST_3" 1行被导入
成功终止导入,但出现警告。
E:>
SQL> select table_name from tabs where table_name like '%TEST%';
TABLE_NAME
------------------------------
TOMS_TEST_1
TOMS_TEST_2
TOMS_TEST_3
SQL>
E:>exp study/study tables=(%test%) file=test.dmp rows=y
Export: Release 9.2.0.1.0 - Production on 星期三 6月 7 13:08:56 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径 ...
. . 正在导出表 TOMS_TEST_1 1 行被导出
. . 正在导出表 TOMS_TEST_2 1 行被导出
. . 正在导出表 TOMS_TEST_3 1 行被导出
在没有警告的情况下成功终止导出。
E:>
SQL> conn toms/toms
已连接。
SQL> create table stu_1 (no int);
表已创建。
SQL> create table stu_2 (no int);
表已创建。
SQL> insert into stu_1 values(1);
已创建 1 行。
SQL> insert into stu_2 values(2);
已创建 1 行。
SQL> commit;
提交完成。
E:>exp study/study tables=(%test%,toms.stu%) file=test.dmp rows=y
Export: Release 9.2.0.1.0 - Production on 星期三 6月 7 13:11:05 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径 ...
. . 正在导出表 TOMS_TEST_1 1 行被导出
. . 正在导出表 TOMS_TEST_2 1 行被导出
. . 正在导出表 TOMS_TEST_3 1 行被导出
当前的用户已更改为 TOMS
. . 正在导出表 STU_1 1 行被导出
. . 正在导出表 STU_2 1 行被导出
在没有警告的情况下成功终止导出。
SQL> conn study/study
已连接。
SQL> drop table toms_test_1;
表已丢弃。
SQL> drop table toms_test_2;
表已丢弃。
SQL> drop table toms_test_3;
表已丢弃。
SQL> select table_name from tabs where table_name like '%TEST%';
未选定行
SQL> conn toms/toms
已连接。
SQL> drop table stu_1;
表已丢弃。
SQL> drop table stu_2;
表已丢弃。
SQL> select table_name from tabs where table_name like '%STU%';
未选定行
SQL>
E:>imp study/study file=test.dmp fromuser=study touser=study tables=(%test%)
Import: Release 9.2.0.1.0 - Production on 星期三 6月 7 13:15:22 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. . 正在导入表 "TOMS_TEST_1" 1行被导入
. . 正在导入表 "TOMS_TEST_2" 1行被导入
. . 正在导入表 "TOMS_TEST_3" 1行被导入
成功终止导入,但出现警告。
SQL> conn study/study
已连接。
SQL> select table_name from tabs where table_name like '%TEST%';
TABLE_NAME
------------------------------
TOMS_TEST_1
TOMS_TEST_2
TOMS_TEST_3
SQL> select * from toms_test_1;
NO
----------
1
SQL> select * from toms_test_2;
NO
----------
2
SQL> select * from toms_test_3;
NO
----------
3
SQL>
E:>imp study/study fromuser=toms touser=toms file=test.dmp tables=(stu%)
Import: Release 9.2.0.1.0 - Production on 星期三 6月 7 13:23:49 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. 正在将TOMS的对象导入到 TOMS
. . 正在导入表 "STU_1" 1行被导入
. . 正在导入表 "STU_2" 1行被导入
成功终止导入,但出现警告。
E:>
SQL> conn toms/toms
已连接。
SQL> select table_name from tabs where table_name like '%STU%';
TABLE_NAME
------------------------------
STU_1
STU_2
SQL> select * from stu_1;
NO
----------
1
SQL> select * from stu_2;
NO
----------
2
SQL>