ORACLE导入导出 之 IMP/EXP

*****************************
* ORACLE导入导出 之 IMP/EXP *
*****************************
oracle数据导入导出imp/exp就相当于oracle数据还原与备份。
exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 
利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。 
执行环境:可以在sqlplus.exe或者dos(命令行)中执行,dos中可以执行时由于在oracle 8i中安装目录\ora81\bin被设置为全局路径,该目录下有exp.exe与imp.exe文件被用来执行导入导出。 
oracle用java编写,sqlplus.exe、exp.exe、imp.exe这两个文件有可能是被包装后的类文件。 sqlplus.exe调用exp.exe、imp.exe所包裹的类,完成导入导出功能。 
exp和imp是客户端工具,可以在客户端使用也可以在服务器端使用
expdp和impdp是服务器端工具,只能在oracle服务器端使用。
imp只使用于exp导出文件,不适用于expdp导出文件,impdp只适用于expdp导出文件,不适用于exp导出文件
oracle10g开始,增加了数据泵导出导入工具expdp&impdp
 
导出export:将数据库部分或全部对象的结构及其数据导出并存储到OS文件中的过程
导入import:将OS文件转换的对象结构及其数据装载到数据库中的过程
导出和导入具有以下作用:
1.可以重建组织表
2.可以在用户之间移动对象
3.可以在数据库之间移动对象
4.可以升级数据库到其他平台
5.可以升级数据库到更高版本
6.可以实现逻辑备份和恢复
*********************************** 数据导出 EXP *****************************************************
在执行Exprot前,需要运行SQL脚本catexp.sql或catalog.sql。这些脚本只运行一次。这些脚本执行下面的任务:
1)创建导出需要的数据字典;
2)创建角色EXP_FULL_DATABASE;
3)给角色EXP_FULL_DATABASE赋予必要的权限;
4)把角色EXP_FULL_DATABASE授予DBA角色;
5)记录已经运行的脚本catexp.sql的版本。
为了执行导出,用户必须有CREATE SESSION的系统权限。为了导出其他用户模式下的表,用户必须授予EXP_FULL_DATABASE权限。
===Export的调用方法===
1)命令行(Command-line Entries):
C:\> exp username/password PARAMETER=vaule PARAMETER=vaule PARAMETER=vaule
2)交互式(Interactive Export Prompts):
C:\> exp username/password
3)参数文件(Parameger Files):
exp username/password PARFILE=filename
其中,PARFILE用于指定参数文件的路径及名字。
格式如下:
PARAMETER=value
PARAMETER=(value)
PARAMETER=(value1,value2,...)
1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin
   exp导出工具将数据库中数据备份压缩成一个二进制系统文件.可以在不同OS间迁移
  
   它有四种模式:
       a. 用户模式(User): 导出用户所有对象以及对象中的数据;
       b. 表模式(Table): 导出用户所有表或者指定的表;
       c. 整个数据库(Full): 导出数据库中所有对象。适用EXP_FULL_DATABASE色色的用户
       d. 表空间(Tablespace):导出表空间,用于可移动表空间。
2. 导出工具exp交互式命令行方式的使用的例子
$exp test/test123@appdb
Enter array fetch buffer size: 4096 > 回车
Export file: expdat.dmp > m.dmp 生成导出的文件名
(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > 3
Export table data (yes/no): yes > 回车
Compress extents (yes/no): yes > 回车
Export done in ZHS16GBK character set and ZHS16GBK NCHAR character set
About to export specified tables via Conventional Path ...
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > cmamenu 要导出的表名
. . exporting table                        CMAMENU       4336 rows exported
Table(T) or Partition(T:P) to be exported: (RETURN to quit) >要导出的表名n
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > 回车
Export terminated successfully without warnings.
3. 导出工具exp非交互式命令行方式的例子
$exp scott/tiger tables=(emp,dept) file=/directory/scott.dmp grants=y
说明:把scott用户里两个表emp,dept导出到文件/directory/scott.dmp
$exp scott/tiger tables=emp query=\"where job=\'salesman\' and sal\<1600\" file=/directory/scott2.dmp
说明:在exp里面加上导出emp的查询条件job='salesman' and sal<1600
   
    (但我个人很少这样用,还是把满足条件的记录生成临时表后,再exp会方便一些)
$exp parfile=username.par file=/directory1/username_1.dmp,/directory1/username_2.dmp
filesize=2000M log=/directory2/username_exp.log
参数文件username.par内容
 userid=username/userpassword
 buffer=8192000
 compress=n
 grants=y
说明:username.par为导出工具exp用的参数文件,里面具体参数可以根据需要去修改
     filesize指定生成的二进制备份文件的最大字节数
    
     (可用来解决某些OS下2G物理文件的限制及加快压缩速度和方便刻历史数据光盘等)

1 将数据库test完全导出,用户名system 密码manager 导出到d:\daochu.dmp中  
  exp system/manager@test file=d:\daochu.dmp full=y 
 
  exp 'sys/Perfect1@test as sysdba' file=d:\daochu.dmp full=y 
2 将数据库中system用户与sys用户的表导出  
  exp system/manager@test file=d:\daochu.dmp wner=(system,sys) 
3 将数据库中的表inner_notify、notify_staff_relat导出   
  exp aichannel/aichannel@testdb2 file= d:\data\newsmgnt.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 来实现。
5、导出表空间
检查表空间是否自我包容,不是自我包容的表空间不能使用EXP/IMP进行移动。
1)检查表空是否自我包容,执行过程TRANSPORT_SET_CHECK必须要有EXECUTE_CATALOG_ROLE权限。
SQL> execute dbms_tts.transport_set_check('product,indtbs',TRUE);
2)查询视图,检查结果会放到视图TRANSPORT_SET_VIOLATIONS中。如果查询结果为0,说明表空间不是自我包容的。
SQL> select * from TRANSPORT_SET_VIOLATIONS
3)执行表空间导出:
  a.把要被导出的表空间设成只读:
  SQL> alter tablespace product read only;
  SQL> alter tablespace indtbs read only;
  b.导出表空间(需要SYSDBA权限):
  C:\> exp 'sys/Perfect1 as sysdba' transport_tablespace=y tablespaces=(product,indtbs) triggers=y constraints=n grants=n file=d:\exptb.dmp
  这里只导了数据字典的信息,并没有导出表中数据,表的数据还是放在数据文件中。
 
4)使源数据库中表空间恢复可读写:
 SQL> alter tablespace product read write;
 SQL> alter tablespace indtbs read write;
 
 在目标数据库导入表空间
 1)创建导入参数文件ipfile.txt
  TRANSPORGT_TABLESPACE=y          ::表示启用可移动表空间
  FILE='d:\exptb.dmp'              ::指定导入文件,这个文件里面只存放数据字典的信息;
  DATAFILE=('d:\temp\product.ora','d:\temp\indtbs.ora')  ::指定数据文件,这些数据文件是从源数据库中复制过来的;
  TABLESPACE=(product,indtbs)      ::指定要被导入的表空间;
  TTS_OWNERS=(test1,test2)         ::指定DUMP文件中数据的属主;
  FROMUSER=(test1,test2)          
  TOUSER=(tar1,tar2)
 2)执行数据的导入:
  C:\> imp 'sys/Perfect1 as sysdba' parfile='d:\ipfile.txt'
  这里只导入字典信息,并不是真正地导入数据,数据放在复制过来的数据文件中。
 
exp example:
导出表:   
  导出表是指用exp工具将一个或多个表的结构和数据存储到OS文件中,导出表是使用tables选项来完成的
  导出表时默认情况下会导出相应的表上的所有索引、触发器、约束。
exp system/manager@demo tables=scott.emp,scott.dept file=tab1.dmp
exp scott/tiger@demo tables=dept,emp file=tab2.dmp
exp scott/tiger@mycon tables=(dept,emp) file=tab1.dmp
导出用户(方案):
  导出方案是指用exp工具将一个或多个方案中的所有对象及数据存储到OS文件中,导出方案是使用owner选项来完成的
exp system/manager@demo wner=scott file=schema1.dmp
exp scott/tiger@demo file=schema2.dmp
exp system/manager@mycon wner=scott file=usr1.dmp
导出数据库:
  导出数据库是指使用工具exp将所有数据库对象及其数据存储到特定的OS文件中,导出数据库是使用full选项来完成。
  导出数据库要求具有exp_full_database或dba角色权限。不会导出sys方案的任何对象。
  只有具备EXP_FULL_DATABASE角色的用户才能进行全部数据库导出操作。
exp system/manager@demo full=y file=full.dmp
1.完全导出
  exp system/Perfect1 full=y BUFFER=2048000 inctype=complete file=d:\bjsx.dmp LOG=d:\bjsx.log
2.增量导出
  exp system/manager@mycon full=y inctype=incremental file=inc1.dmp
3.累积导出
  exp system/manager@mycon full=y inctype=cumulative file=cum1.dmp
===如何导出到多个DUMP文件?===
filesize指定单个文件最大大小。
C:\> exp system/manager full=y direct=y rows=y file=/exp/exp01.dmp,/exp/exp02.dmp,/exp/exp03.dmp filesize=2G
导入
imp   用户名/密码   file=(file1,file2,file3)   filesize=100k  
  filesize必须与导出文件大小相符
如何把数据导出到磁带上?
file指定磁带的设备名。
C:\> exp system/manager file=/dev/rmt0 tables=tar1.k
===利用任务计划、批处理文件和ORACLE的EXP导出功能===
利用任务计划、批处理文件和ORACLE的EXP导出功能,可以根据日期自动生成ORACLE备份文件,大大方便了ORACLE数据备份。:
1,批处理文件backup.bat\.
exp system/manager file=d:\backup\oracle\oracle%date:~0,10%.dmp wner=system log=d:\backup\oracle\oracle%date:~0,10%.log
将生成oracle2006-01-09.dmp文件
exp system/manager file=d:\backup\oracle\oracle%date:~11,3%.dmp wner=system log=d:\backup\oracle\oracle%date:~11,3%.log
将生成oracle星期一.dmp文件,则每周循环保留一个备份文件,共7个备份文件循环
2,添加一个任务计划
利用任务计划向导,根据备份策略设置自动执行任务的时间频率(例如每天零时),执行d:\oracle\backup.bat
3、以后每天将在目录中生成形如“oracle2005-08-31.dmp和oracle2005-08-31.log”的备份和日志文件。
说明:
(1)、%date%的值在不同的系统、语言版本下可能是不一样的,控制面板里面区域选项的设定也会改变%date%的值。请先在命令行中测试 echo %date% 的返回值。%date:~4,10% 是返回日期函数,~后的第一个参数是要截取的起始位置(从0开始),第二个参数是要截取的长度,如没有则是截取到最后,参数可酌情修改。
     在控制面板-区域语言-区域选项-自定义-日期页中的短格式改为:dddd yyyy-M-D则为“星期三 2006-11-22”, 如果改为 yyyy-M-d dddd则为“2006-11-22 星期三”格式。
(2)、如需要准确的时间做为文件名,请用%time%函数,参数同上。
如:C:\Documents and Settings\Administrator>echo %date:~0,10% %time:~0,8%
                                                 2009-12-01 10:09:50
                                                
===使用直接模式direct=y导出数据比传统方式快一倍===
最近发现使用直接导出模式direct=y exp比传统模式导出快很多,而且似乎也不会遇见什么bug.(至今没有遇见过)
oracle提供2种模式导出表数据,传统模式CONVENTIONAL PATH和直接模式DIRECT PATH,有direct指定。
CONVENTIONAL PATH EXPORT 比较 DIRECT PATH EXPORT
差异
1. Conventional path Export.传统导出模式使用SQL SELECT语句抽取表数据。将数据从磁盘中读入到buffer cache缓冲区中,并应用SQL表达式,将纪录返回给导出客户端,然后写到到处文件。
2. Direct path Export.直接导出模式,数据直接从磁盘中读取到导出session的UGA中,跳过了SQL命令处理层。避免了不必要的数据转换, 然后将纪录返回给导出客户端,然后写到到处文件   跳过了SQL命令处理层表示DIRECT导出不支持QUERY选项。
性能
1. Direct Export 比Conventional Export要快很多。在实际应用中,如果直接模式导出需要时间N,传统模式导出则需要2*N到3*N之间。
2. 当Direct Export 的时候设置大的RECORDLENGTH(length of IO record) 参数可以加快导出。最大64k,    
exp userid=system/manager full=y direct=y recordlength=65535 file=exp_full.dmp log=exp_full.log    
imp userid=system/manager full=y recordlength=65535 file=exp_full.dmp log=imp_full.log
3. Direct 模式导出并不影响导入数据的速度;导入数据与传统模式花费时间一样。
限制
1. 导出表空间必须使用传统模式。
2. 含有LOB对象的表不支持直接导出模式。
3. 直接导出不支持QUERY.
4. 直接导出模式使用RECORDLENGTH设置一次可以导出数据的量,传统模式使用buffer设置.
5. 低版本直接导出模式要求导出客户端和数据库字符集设置一致。
直接导出模式bug比传统模式要多,但由于其导出数据在性能上的优势,仍然要多加使用。

===命令详解===
C:\Documents and Settings\Administrator>exp help=y
Export: Release 11.1.0.6.0 - Production on 星期三 12月 16 14:12:12 2009
Copyright (c) 1982, 2007, Oracle.  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                所有者用户名列表         指定一个用户列表,指定用户的数据被导出。如:owner=exp1,wang
FILE                 输出文件 (EXPDAT.DMP)    这里指操作系统的文件目录。
TABLES               表名列表
COMPRESS             导入到一个区 (Y)         指定导入时,是否把数据压缩到一个区(初始区)。
RECORDLENGTH         IO 记录的长度            指定要处理记录的长度,导出和导入时,这个值必须相同,单位是字节。
GRANTS               导出权限 (Y)        
INCTYPE              增量导出类型
INDEXES              导出索引 (Y)       
RECORD               跟踪增量导出 (Y)
DIRECT               直接路径 (N)            
TRIGGERS             导出触发器 (Y)
LOG                  屏幕输出的日志文件   
STATISTICS           分析对象 (ESTIMATE)      STATISTICS=ESTIMATE/COMPUTE/NONE 指定IMPORT时产生的统计类型。 NONE表示不导出统计信息。
ROWS                 导出数据行 (Y)           指定是否导出数据,如果ROWS=Y,表示导出表的数据;如果ROWS=N表示只导出表的结构。
PARFILE              参数文件名
CONSISTENT           交叉表的一致性 (N)       指定是否保持与导出数据在某个时间点的一致性。
CONSTRAINTS          导出的约束条件 (Y)
OBJECT_CONSISTENT    只在对象导出期间设置为只读的事务处理 (N)
FEEDBACK             每 x 行显示进度 (0)                       表示多少行回显一次,用于查看导出进度。
FILESIZE             每个转储文件的最大大小
FLASHBACK_SCN        用于将会话快照设置回以前状态的 SCN        指定FLASHBACK的系统改变号。
FLASHBACK_TIME       用于获取最接近指定时间的 SCN 的时间       指定FLASHBACK的时间。
QUERY                用于导出表的子集的 select 子句            指定查询条件,允许用户导出表的一部分数据。 参数QUERY和DIRECTORY=Y不能同时使用。如果使用参数QUERY,就不能使用直接路径导出。
RESUMABLE            遇到与空格相关的错误时挂起 (N)            指定是否使用可恢复空间功能,启用可恢复空间功能,即在EXPORT时,如果空间不足,EXPORT并不会因此产生错误而退出,而是把EXPORT挂起,如果系统又得到空余空间,EXPORT将继续运行。
RESUMABLE_NAME       用于标识可恢复语句的文本字符串            指定一个字符串,用于标识挂起的语句。
RESUMABLE_TIMEOUT    RESUMABLE 的等待时间                      指定挂起多长时间后,如果空间问题还滑有解决,EXPORT将会退出。
TTS_FULL_CHECK       对 TTS 执行完整或部分相关性检查           指定在导出表空间时,是否执行表空间依赖性检查。
TABLESPACES          要导出的表空间列表
TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)              指定是否使用可移动表空间,参数置Y时,表示使用可移动表空间,这个参数常与TABLESPACS联合使用。
TEMPLATE             调用 iAS 模式导出的模板名
成功终止导出, 没有出现警告。
C:\Documents and Settings\Administrator>
exp命令选项
1、buffer用于指定在提取行数据时的缓冲区尺寸 buffer_size = rows_in_array * maximum_row_size
2、compress用于指定导出导入管理初始区(initial)的方法。默认为Y
3、consistent用于指定是否使用set transaction read only语句确保取得一致时间点的数据,默认为N
4、constraints用于指定是否要导出表的约束,默认为Y
5、direct用于指定是否使用直接导出方式,默认为N。直接导出速度要优于常规导出,但要求客户端和服务器端的字符集必须完全一致
6、feedback用于指定根据到导出行数显示导出进度框。默认为0,若设置为10,那么没导出10行显示一个圆点
7、file用于指定导出文件名
8、filesize用于指定导出文件的最大尺寸,若不指定filesize则所有对象和数据会被存放到一个导出文件中
9、flashback_scn用于指定导出特定scn时刻的表数据。不能和flashback_time同时使用
10、flahsback_time用于指定导出特定时刻的表数据。不能和flashback_scn同时使用
11、full用于指定数据库导出模式,默认为N,当设置为Y时,会导出除sys外所有其他方案的对象。需要exp_full_database或dba角色
12、grants用于指定是否要导出对象权限信息,默认为Y
13、help显示帮助信息,默认为N
14、indexes用于指定是否要导出与表和簇相关的所以,默认为Y
15、log用于指定导出日志文件的名称,默认不产生导出日志文件
16、object_consistent用于指定是否要基于对象级设置只读事务导出,默认为N
17、owner用于指定用户导出模式,普通用户只能导出其自身方案。
18、parfile用于指定导出工具要使用的参数文件名,当经常使用exp工具导出数据时,可以将命令行选项放到参数文件中。然后在导出时调用该参数文件
19、query用于指定where条件子句,从而导出表的部分数据。直接导出方式不能使用该选项。
20、recordlength用于指定文件记录的长度,其默认值为buffer选项的值
21、resumable用于指定是否要激活‘空间继续分配’特征,默认为N,为了使用resumable_name和resumable_timeout,必须将该选项设置为Y
    resumable_name指定‘空间继续分配’语句所对应的标识符
    resumable_timeout用于指定错误被修正的最大时间周期
22、rows用于指定是否要导出表行数据,默认为Y,若为N只会导出表结构
23、statistics用于指定当导入导出文件时生成优化统计信息的类型,默认为estimate
24、tables用于指定导出表
25、tablespaces用于指定表空间导出模式,要求exp_full_database or dba角色
26、transport_tablespace用于指定是否要导出表空间的元数据
27、triggers用于指定是否要导出触发器,默认为Y
28、tts_full_check用于指定是否检查被搬移表空间集合的关联关系,默认N
29、userid用于指定执行导出操作的用户名、口令和连接字符串

******************************************* 数据导入 IMP *****************************************
在执行Import前,需要运行SQL脚本catexp.sql或catalog.sql。这些脚本只运行一次。这些脚本执行下面的任务:
1)给角色IMP_FULL_DATABASE赋予必要的权限;
4)把角色IMP_FULL_DATABASE授予DBA角色;
5)创建导入需要的数据字典。
为了执行导入,用户必须有CREATE SESSION的系统权限。如果导出的文件是由具有角色权限EXP_FULL_DATABASE的用户产生的,另外一个用户想导入这样的文件,这个用户必须被授予IMP_FULL_DATABASE权限。
===Import的调用方法===
命令行(Command-line Entries):
imp username/password PARAMETER=vaule PARAMETER=vaule PARAMETER=vaule
交互式(Interactive Export Prompts):
imp username/password
参数文件(Parameger Files):
imp username/password PARFILE=filename
其中,PARFILE用于指定参数文件的路径及名字。
格式如下:
PARAMETER=value
PARAMETER=(value)
PARAMETER=(value1,value2,...)

1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin
 imp导入工具将EXP形成的二进制系统文件导入到数据库中.
 
   它有四种模式:
       a.  用户模式(User): 导入用户所有对象以及对象中的数据;
       b.  表模式(Table): 导入用户所有表或者指定的表;
       c.  整个数据库(Full): 导入整个数据库。
       d.  表空间(Tablespace):导入表空间,用于可移动表空间。
      
   只有拥有IMP_FULL_DATABASE和DBA权限的用户才能做整个数据库导入
  
   imp步骤:
   (1) create table  (2) insert data  (3) create index (4) create triggers,constraints
2.导入工具imp交互式命令行方式的例子
$ imp
Import: Release 8.1.6.0.0 - Production on 星期五 12月 7 17:01:08 2001
(c) Copyright 1999 Oracle Corporation.  All rights reserved.
用户名:  test
口令:****
连接到: Oracle8i Enterprise Edition Release 8.1.6.0.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production
导入文件: expdat.dmp> /tmp/m.dmp
输入插入缓冲区大小(最小为 8192 ) 30720>
经由常规路径导出由EXPORT:V08.01.06创建的文件
警告: 此对象由 TEST 导出, 而不是当前用户
已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入
只列出导入文件的内容(yes/no):no>
由于对象已存在, 忽略创建错误(yes/no):no> yes
导入权限(yes/no):yes>
导入表数据(yes/no):yes>
导入整个导出文件(yes/no):no> yes
. 正在将TEST的对象导入到 SCOTT
. . 正在导入表                       "CMAMENU"       4336行被导入
成功终止导入,但出现警告。
3.导入工具imp非交互式命令行方式的例子
$ imp system/manager fromuser=jones tables=(accts)
$ imp system/manager fromuser=scott tables=(emp,dept)
$ imp system/manager fromuser=scott touser=joe tables=emp
$ imp scott/tiger file = expdat.dmp full=y
$ imp scott/tiger file = /mnt1/t1.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y
log=/oracle_backup/log/imp_scott.log
$ imp system/manager parfile=params.dat
params.dat 内容
file=dba.dmp show=n ignore=n grants=y fromuser=scott tables=(dept,emp)
4.导入工具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相关信息.
      导入完成后再改回来.
    有三种方法:
   1)修改字符集环境变量
      以在UNIX环境下为例,此时需要确保NLS_LANG和ORA_NLS33的正确。如:
      NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280;EXPORT NLS_LANG
      ORA_NLS33=$ORACLE_HOME/common/nls/admin/data;export ORA_NLS33
     
      而在Windows状态下,需要修改注册表中的所有NLS变量。
     
   2)重新安装RDBMS
      采用自定义安装,重新安装RDBMS,设置字符集与导出时的字符集一致。
  
   3)修改Oracle字符集
      修改ORACLE实例的字符集是一种不推荐的方法,该操作可能会导致ORACLE实例不可用。    
(6) imp和exp版本不能往上兼容
 imp可以成功导入低版本exp生成的文件, 不能导入高版本exp生成的文件
 根据情况我们可以用
 $ imp username/password@connect_string
  说明: connect_string 是在/ORACLE_HOME/network/admin/tnsnames.ora
     定义的本地或者远端数据库的名称
 注意事项:
 UNIX: /etc/hosts           要定义本地或者远端数据库服务器的主机名
 win98:    windows\hosts             和IP地址的对应关系 
 win2000:  winnt\system32\drivers\etc\hosts

1 将d:\daochu.dmp 中的数据导入 test数据库中。
  imp system/manager@test file=d:\daochu.dmp
  imp aichannel/aichannel@hust full=y file=d:\data\newsmgnt.dmp ignore=y
上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。在后面加上 ignore=y 就可以了。
2 将d:\daochu.dmp中的表table1 导入 
  imp system/manager@test file=d:\daochu.dmp tables=(table1)  
基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。 
注意:操作者要有足够的权限,权限不够它会提示。数据库时可以连上的。可以用tnsping test 来获得数据库test能否连上。
imp example:
导入表:
  导入表是指使用工具imp将exp文件中的表结构及其数据装载到数据库中,导入表是使用tables选项来完成
  如果要将表导入到其他用户中则需要指定fromuser和touser
Imp scott/tiger@demo file=tab2.dmp tables=dept,emp
imp system/manager@demo file=tab2.dmp tables=emp,dept fromuser=scott touser=system
imp system/manager@mycon file=c:\tab1.dmp tables=(dept,emp) touser=scott
导入用户:
  导入方案是使用imp工具将exp文件中特定方案的所有对象及数据装载到数据库中
imp scott/tiger@demo file=schema.dmp
imp system/manager@demo file=schema.dmp fromuser=scott touser=system
imp system/manager@mycon file=usr1.dmp fromuser=scott touser=scott
IMP USERID=scott/Perfect1@orcl01 FILE=I:\dmp\sxdb.dmp LOG=d:\dmp\sxdb.log BUFFER=2048000 IGNORE=n ROWS=n COMMIT=y FROMUSER=sxdb TOUSER=sxdb
导入数据库:
  导入数据库是指使用工具imp将exp文件中所有用户的对象及其数据装载到oracle数据库中,导入数据库是使用full选项来完成
IMP USERID=scott/Perfect1@orcl01 FILE=I:\dmp\sxdb.dmp LOG=d:\dmp\sxdb.log BUFFER=2048000 IGNORE=y ROWS=n COMMIT=y FULL=y
1.全库导入
  imp system/manager@mycon file=full1.dmp full=y
2.增量导入
  1)导入数据库最新信息
  imp system/manager@mycon inctype=system full=y file=inc7.dmp
  2)导入最近完全导出文件
  imp system/manager@mycon inctype=restore full=y file=full1.dmp
  3)导入所有累积导出文件
  imp system/manager@mycon inctype=restore full=y file=cum1.dmp
  4)导入最近一次增量导出的文件
  imp system/manager@mycon inctype=restore full=y file=inc1.dmp

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.parbible_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. 增量导入
 imp system./manager inctype= RECTORE FULL=Y FILE=A
附录一: 
给用户增加导入数据权限的操作 
第一,启动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:\work\oracle_data\backup>imp userid=test/test full=y file=inner_notify.dmp

附录二: 
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

===命令详解===
C:\Documents and Settings\Administrator>imp help=y
Import: Release 11.1.0.6.0 - Production on 星期三 12月 16 15:15:53 2009
Copyright (c) 1982, 2007, 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)                Y表示只显示导出文件的内容,并不真正执行数据导入。
TABLES                 表名列表                          指定要被导入的表,与Export中不同的是,这里不能指定模式名(如SYSTEM.A),模式名用参数FROMUSER指定。
IGNORE                 忽略创建错误 (N)                  指定是否忽略创建对象时的错误。Y表示出现部题的表将被跳过。
RECORDLENGTH           IO 记录的长度
GRANTS                 导入权限 (Y)                      Y表示导入授权。      
INCTYPE                增量导入类型
INDEXES                导入索引 (Y)        
COMMIT                 提交数组插入 (N)                  指定一组处理完是否提交。Y表示提交。
ROWS                   导入数据行 (Y)       
PARFILE                参数文件名
LOG                    屏幕输出的日志文件   
CONSTRAINTS            导入限制 (Y)
DESTROY                覆盖表空间数据文件 (N)            决定是否覆盖已经存在的数据。N表示不覆盖,但是会返回错误。在裸设备中,即使是N,已经存在的数据文件仍然要被覆盖。    
INDEXFILE              将表/索引信息写入指定的文件       指定用于创建索引的脚本文件的名字,在导入时不创建索引,把创建索引的SQL语句写入该文件,当导入完成后,利用该脚本重建索引。
SKIP_UNUSABLE_INDEXES  跳过不可用索引的维护 (N)          指定是否中跳过被标识为UNUSABLE的索引。这些索引的维护要毛病以导入完成以后。
FEEDBACK               每 x 行显示进度 (0)               表示处理完成多少行,在屏幕显示一个圆点,主要用于查看导入进度。
TOID_NOVALIDATE        跳过指定类型 ID 的验证
FILESIZE               每个转储文件的最大大小            指定导入文件的最大尺寸,指定的值必须与Export中指定的值相同。
STATISTICS             始终导入预计算的统计信息          指定统计的生成方法,ALWAYS表示无论统计是否有问题,都导入统计;NONE表示不导入统计,也不重新生成统计;SAFE表示只导入没有问题的统计;RECALCULATE表示重新生成统计。
RESUMABLE              在遇到有关空间的错误时挂起 (N)    指定是否可以使用可恢复空间功能,启用可恢复空间的功能,即在IMP时,如果空间不足,IMP并不会因为空间不足产生错误而退出,而是把IMP挂起,如果系统又得到了空余空间,IMP将继续运行。
RESUMABLE_NAME         用来标识可恢复语句的文本字符串
RESUMABLE_TIMEOUT      RESUMABLE 的等待时间              指定挂起多长时间后,如果空间问题还没有解决,IMP将会退出。
COMPILE                编译过程, 程序包和函数 (Y)        指定是否在Import时对包、过程、函数进行编译,N表示这些对象史有第一次被使用时进行编译。
STREAMS_CONFIGURATION  导入流的一般元数据 (Y)
STREAMS_INSTANTIATION  导入流实例化元数据 (N)
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE   导入可传输的表空间元数据 (N)
TABLESPACES            将要传输到数据库的表空间
DATAFILES              将要传输到数据库的数据文件        列出被导入到目标数据库中的数据文件。
TTS_OWNERS             拥有可传输表空间集中数据的用户
VOLSIZE                                                  指定磁带卷上每个导出文件的最大尺寸。
CHARSET=ASCII/EBCDIC                                     指定导出文件导出时使用的字符集。
成功终止导入, 没有出现警告。
C:\Documents and Settings\Administrator>
imp命令选项
1、buffer用于指定在传送行数据时的缓冲区尺寸
2、commit用于指定在每次数组插入完成之后是否提交数据,默认值为N,在装载了表的所有数据后才会提交
3、compile用于指定在导入包、过程和函数时是否要进行编译,默认为Y
4、constraints用于指定是否要导入表的约束,默认为Y
5、datafiles当设置选项transport_tablespace为Y时,该选项用于指定要搬移到目标数据库的数据文件列表
6、destory用于指定在导入时是否要覆盖已存在的数据文件,默认为N
7、feedback用于指定根据导入行数显示导入进度框,默认为0
8、file用于指定导入操作要使用的转储文件的名称
9、filesize用于指定导出文件的最大尺寸,如果数据库对象数据被分布到多个导出文件中,那么在导入时必须指定filesize
10、fromuser用于指定从导出文件中摘取并导入特定用户的对象,需要imp_full_database or dba角色
11、full用于指定导入转储文件的所有内容,默认为Y
12、grants用于指定是否要导入对象权限信息,默认为Y
13、help
14、ignore用于指定是否要忽略对象建立错误信息,默认为N
15、indexes用于指定是否要导入表和簇相关的索引,默认为Y
16、indexfile用于指定生成存放索引建立语句的文件名称,当使用该选项时,不会导入对象数据到数据库
17、log指定生成的导入日志文件的名称,默认为n
18、parfile指定导入工具要使用的参数文件名。经常使用imp导入数据时,可以将命令行选项放到参数文件中,然后在导入时调用该参数文件。例如:
PARM.TXT
talbes=dept,emp
constraints=n
indexes=n
grants=n
file=a.dmp
imp scott/tiger parfile=parm.txt
19、recordlength指定文件记录的长度,默认为buffer的值,需要将导出文件传送到不同os平台时,需要设置,不能大于64K
20、resumable指定是否激活空间继续分配特征,为了使用resumable_name和resumable_timeout,必须设置为Y。默认为N
21、resumable_name指定空间继续分配语句所对应的标识符
22、resumable_timeout指定错误被修正的最大时间周期,默认为7200。如果在该时间范围内没有修正错误,语句会被终止
23、rows用于指定是否要导入表行数据,默认为Y
24、show用于指定显示导出文件的内容,默认为N
25、skip_unusable_indexes用于指定在导入时是否要跳过不可使用的索引,默认为N
26、streams_configuration用于指定是否要导入流元数据,默认为Y
27、table用于指定导入表或表分区
28、statistics指定在导入时数据库优化器要执行的操作,默认为always
    ->ALWAYS: 无论是否有可疑信息,都会导入优化器的统计信息
    ->NONE : 不导入或重新计算优化器的统计信息
    ->SAFE :  如果无可疑信息,则导入原优化器统计信息;如果有可疑信息,则重新计算优化器的统计信息
    ->RECALCULATE: 不导入优化器的统计信息,在imp的时候重新收集优化器的统计信息
   
29、tablespaces用于指定导入特定表空间上的所有对象
30、toid_novalidate用于指定当导入对象表时要排除校验的对象类型
31、touser用于指定将特定方案对象导入到其他用户,需要imp_full_database or dba角色权限
32、transport_tablespace用于指定导入表空间元数据,默认为N
33、tts_owners当设置transport_tablespace=y时,该选项用于列出拥有被搬移表空间数据的数据库用户
34、userid用于指定执行到如操作的用户名、口令和连接字符串

=== Oracle通过设置statistics选项来提高import导入dmp性能 ===
昨天在导入一个dmp,发现特慢,一个2G的dmp,导了1个小时都没导完,查看了一下等待的SQL,大部份是在执行导入数据库对像的统计信息。记忆中import是可以设置不导入统计信息的。于是查询了一下官方文档,并做了一些测试,总结如下。
import执行导入时,缺省会将export的dmp统计信息导入,当数据库的对像(表,分区,索引)比较多的情况下,要将这些统计信息导入将花费比较长的时间。
如果统计信息不太重要的数据库,如测试数据库或只是为了查找一些表数据的数据库,可以先不导入统计信息,等数据导入完成后,空闲时间再重新生成统计信息。
oracle import可以设置导入时数据库统计信息如何处理,具体可以设置statistcs参数.statistics参数官方说明如下:
STATISTICS
缺省值:ALWAYS
说明:指定导入时关于数据库统计信息如何处理
有如下选项:
ALWAYS
总是导入数据库统计信息.
NONE
不导入数据库统计信息.
SAFE
当dmp中统计信息没有问题时导入数据库统计信息,如果有问题,则重新生成统计信息.
RECALCULATE
总是重新生成统计信息.
导入完成后,搜集优化程序统计信息:
EM--&gt管理\ 统计信息管理\ 管理优化程序统计信息\ 操作:搜集优化程序统计信息
 

===Oracle增量导入导出  增量导出/导入===
  增量导出是一种常用的数据备份方法,它只能对整个数据库来实施,并且必须作为SYSTEM来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为export.dmp,如果不希望自己的输出文件定名为export.dmp,必须在命令行中指出要用的文件名。
  增量导出包括三种类型:
  (1)、“完全”增量导出(Complete)          
  即备份三个数据库,比如: exp system/manager inctype=complete file=040731.dmp
  (2)、“增量型”增量导出 
  备份上一次备份后改变的数据,比如: exp system/manager inctype=incremental file=040731.dmp
  (3)、“累积型”增量导出
  累计型导出方式是导出自上次“完全”导出之后数据库中变化了的信息。比如: exp system/manager inctype=cumulative file=040731.dmp

  数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效的完成。
  比如数据库的被封任务可以做如下安排:
  星期一:完全备份(A)
  星期二:增量导出(B)
  星期三:增量导出(C)
  星期四:增量导出(D)
  星期五:累计导出(E)
  星期六:增量导出(F)
  星期日:增量导出(G)
  如果在星期日,数据库遭到意外破坏,数据库管理员可按一下步骤来回复数据库:
  第一步:用命令CREATE DATABASE重新生成数据库结构;
  第二步:创建一个足够大的附加回滚。
  第三步:完全增量导入A: imp system/manager inctype=RESTORE FULL=Y FILE=A
  第四步:累计增量导入E: imp system/manager inctype=RESTORE FULL=Y FILE=E
  第五步:最近增量导入F: imp system/manager inctype=RESTORE FULL=Y FILE=F
===怎样才能提高Oracle 10G增量备份的速度===
1.你可以通过发布以下命令来启用该跟踪机制:
SQL> alter database enable block change tracking using file '/oracle10g/rman/change.log';
该命令将创建一个名为 /rman_bkups/change.log 的二进制文件,以用于跟踪。
2.与此相反,你可以使用以下命令来禁用跟踪:
SQL> alter database disable block change tracking;
3.要想查看当前是否启用了对更改的跟踪,可以查询:
SQL> select filename, status from v$block_change_tracking;
4.假如跟踪文件丢失,则会做全库扫描:
以后的增量也会做全库扫描。唯一解决的办法,就是重新执行全备,最后再增量。=

===exp/imp时dmp文件字符集的转换===
在导出操作时,非常重要的是客户端的字符集设置,也就是客户端的NLS_LANG设置。
NLS_LANG参数由以下部分组成:
NLS_LANG=_.
NLS_LANG各部分含义如下:
LANGUAGE指定:
-Oracle消息使用的语言
-日期中月份和日显示
TERRITORY指定
-货币和数字格式
-地区和计算星期及日期的习惯
CHARACTERSET:
-控制客户端应用程序使用的字符集
通常设置或者等于客户端(如Windows)代码页
或者对于unicode应用设置为UTF8
在Windows上查看当前系统的代码页可以使用chcp命令:
E:\>chcp
活动的代码页: 936
代码页936也就是中文字符集 GBK。
通常在导出时最好把客户端字符集设置得和数据库端相同,这样可以避免在导出时发生不必要的数据转换,导出文件将和数据库具有相同的字符集。
即使将来会把导出文件导入到不同字符集的数据库中,这样做也可以把转换延缓至导入时刻。
当进行数据导入时,主要存在以下两种情况:
1.源数据库和目标数据库具有相同字符集设置
这时,只需要设置NLS_LANG等于数据库字符集即可导入(前提是,导出使用的是和源数据库相同字符集,即三者相同)
2.源数据库和目标数据库字符集不同
如果我们导出时候使用的NLS_LANG是和源数据库相同的字符集,那么导入时就可以设置客户端NLS_LANG等于导出时使用的字符集,这
样转换只发生在数据库端,而且只发生一次。
dmp文件用UltraEdit打开查看十六进制文件,第2-3个字节表示字符集,假如是"00 01"。
在Unix上我们可以通过以下命令来查看:cat expdat.dmp | od -x | head
查看这个十六进制id的十进制:
SQL> select to_number(1,'xxxx') from dual;
TO_NUMBER(1,'XXXX')
-------------------
                  1
查看这个十进制id表示的字符集:
SQL> select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
----------------------------------------
US7ASCII
查看目标字符集的十进制id:
SQL> select nls_charset_id('zhs16gbk') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
                       852
查看这个十进制id的十六进制:
SQL> select to_char(852,'xxxx') from dual;
TO_CHAR(852,'XXXX')
--------------------------------------------------------------------------------
354
dmp文件用UE打开,把"00 01"改为"03 54"即完成了字符集的转换。
查询数据库中有效的字符集可以使用以下脚本:
col nls_charset_id for 9999
col nls_charset_name for a30
col hex_id for a20
select nls_charset_id(value) nls_charset_id, value nls_charset_name, to_char(nls_charset_id(value),'xxxx') hex_id
from v$nls_valid_values
where parameter = 'CHARACTERSET'
order by nls_charset_id(value);
查询oracle server字符集:
select * from v$nls_database_parameters;
查询客户端登陆session字符集:
select * from v$nls_session_parameters;
通常在我们的现实环境中,存在3个字符集设置。
第一: 客户端应用字符集(Client Application Character Set)
第二: 客户端NLS_LANG参数设置
第三: 服务器端,数据库字符集(Character Set)设置
我们说,一个字符在客户端应用(比如SQLPLUS,CMD,NOTEPAD等)中以怎样的字符显示取决于客户端操作系统,客户端能够显示怎样的字符,
我们就可以在应用中录入这些字符,至于这些字符能否在数据库中正常存储,就和另外的两个字符集设置紧密相关了。
在传输过程中,客户端NLS_LANG主要用于进行转换判断
如果NLS_LANG等于数据库字符集,则不进行任何转换直接把字符插入数据库
如果不同则进行转换,转换主要有两个任务
如果存在对应关系,则把相应二进制编码经过映射后(这一步映射以后,所代表的字符可能发生转换)传递给数据库
如果不存在对应关系,则传递一个替换字符(很多平台就是?)
数据库字符集,在和客户端NLS_LANG不同时,会把经过NLS_LANG转换的字符进行进一步处理
对于?(即不存在对应关系的字符)直接以?形式存放入数据库
对于其他字符,在NLS_LANG和数据库字符集之间进行转换后存入

===查询服务器端字符集===
SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
设置客户端字符集,使之与服务器端字符集匹配:
SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK (Windows)
EXPORT NLS_LANG=AMERICAN_AMERICA.ZHS16GBK (Linux)
SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK Export NLS_LANG (Solaris)

========================
加快IMP速度
 
为什么IMP速度慢?
1、IMP作了大量的跟普通方式一样的insert
2、IMP时候创建索引通常是logging的,产生了大量的undo和redo
如何提高IMP的速度?
1、不建议使用commit参数,因为当imp失败的时候,会导致很多后续的麻烦事儿
2、增大buffer参数值,以便于一次读进更大的array
3、设置较大的初始化参数sort_area_size,以加快创建索引时候的排序速度
4、增大重作日志的大小,以减少log switch的次数,也就是减少checkpoint次数,减少写磁盘的次数
   a、查看日志
      select a.GROUP#,MEMBER,BYTES/1024/1024 M
      from v$log  a,v$logfile b
      where a.GROUP#=b.GROUP#;
   b、增加日志组
      alter database add logfile group 4
     ('D:\ORACLE\ORADATA\JOSEPH\log04.LOG',
      'D:\ORACLE\ORADATA\JOSEPH\redo04.LOG')
      size 100m;
   c、添加日志文件
      alter database add logfile member
      'D:\ORACLE\ORADATA\JOSEPH\log___01.LOG' to group 1,
      'D:\ORACLE\ORADATA\JOSEPH\log___02.LOG' to group 2;
   d、删除日志组文件
      alter database drop logfile group 4;
5、如果要往已经存在的表中追加数据,那么有些情况下,比如表中存在位图索引,那么最好先删除索引,再导入。否则更新索引时会产生大量等待
6、使用indexfile和indexes参数,再导入数据之后再手工创建索引。
 
 =======================
 oracle 10g imp 导入终止后, ora-20005的问题
在导入一个大量数据的dmp时,
使用imp .....
由于导入速度慢,就ctrl+c 终止了导入过程.
等修改完成后,再使用imp 导入时,就显示如下错误:
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 13182
ORA-06512: at "SYS.DBMS_STATS", line 13202
ORA-06512: at line 2
这个问题只有在10g以上版本中才有的问题.
这是因为10g是自动收集表的统计信息.在导入时,先锁定表的统计信息,以免增加系统的负担.只会在导入完成后,才会重新收集表的统计信息.
由于是异常终止了导入过程.才导致锁的表的统计信息,并没有正常释放.
解决办法:
1.查询状态:
SQL> select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
1.使用系统包,解锁
SQL> exec dbms_stats.unlock_table_stats('owner','table_name')
2.重新生成表的对象或者用户对象.
=========================
Import parameter: STATISTICS
 What is the new value SAFE of the STATISTICS parameter at IMPORT ?
------------------------------------------------------------------
The 4 possible values for this parameter are :
   
  ->ALWAYS: Always imports database optimizer statistics regardless of whether or not they are questionable.
                         无论是否有可疑信息,都会导入优化器的统计信息
  ->NONE : Does not import or recalculate the database optimizer statistics.
                     不导入或重新计算优化器的统计信息
  ->SAFE : Imports database optimizer statistics back only if they are not questionable.
                    If they are questionable, recalculates the optimizer statistics.
                    如果无可疑信息,则导入原优化器统计信息
                    如果有可疑信息,则重新计算优化器的统计信息
  ->RECALCULATE: Does not import the database optimizer statistics. Instead, recalculates them on import.
                                       不导入优化器的统计信息,在imp的时候重新收集优化器的统计信息
---------------------------------------------------------------------
When are statistics questionable ?
(什么是统计信息可疑)
----------------------------------
The precalculated optimizer statistics are flagged as questionable at export
time if:
在exp时,如果出现以下几种情况,那么预先计算好的优化器的统计信息被标记为可疑
   -> There are row errors while exporting
       exp时有行的错误
   -> The client character set or NCHAR character set does not match the server character set or NCHAR character set
      客户端和server端的字符集不一致
   -> A QUERY clause is specified
       有查询语句
   -> Only certain partitions or subpartitions are exported
        exp只导出某一个分区或者子分区
e.g.
 1. 导出用户 ecc_view2 的dmp文件 (制造统计信息不是最新的情况)
 a. ECC_VIEW2 检查统计信息
 select  table_name, tablespace_name, status, num_rows, blocks,last_analyzed
 from user_tables
 table_name   tablespace_name   status   num_rows  blocks  last_analyzed
 -----------------   -------------------------  ---------   ---------------  ----------  -----------------------
       TEST                             USERS     VALID                  2              5  2009-6-23 13:47:05
 
 b. 重新收集统计信息
 EXEC DBMS_STATS.gather_table_stats(ownname => 'ECC_VIEW2',tabname => 'TEST',cascade => TRUE);
 
 select  table_name, tablespace_name, status, num_rows, blocks,last_analyzed
 from user_tables
 table_name   tablespace_name   status   num_rows  blocks  last_analyzed
 -----------------   -------------------------  ---------   --------------  ---------  -----------------------
       TEST                             USERS   VALID                   5           5    2009-6-24 14:35:40
     
 c. 插入5条记录,exp
 insert into test  
 select * from TEST     
select count(*) from test  -- 10 rows
 d. exp ecc_view2
 [oracle@rac1 ~]$ expecc_view2/ecc@devdb1file=./ecc_view2.dmp ;
 . about to export ECC_VIEW2's tables via Conventional Path ...
. . exporting table                           TEST         10 rows exported
Export terminated successfully without warnings.
 2. 创建用户 ecc_view3
create user ecc_view3
identified by ecc
default tablespace DATA03
grant connect, resource to ecc_view3
 3. 导入数据到ecc_view3
 a. statistics = ALWAYS (default)
[oracle@rac1 ~]$ impecc_view3/ecc@devdb1file=./ecc_view2.dmp fromuser=ecc_view2 touser=ecc_view3
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
. . importing table                         "TEST"         10 rows imported
Import terminated successfully without warnings.
 select  table_name, tablespace_name, status, num_rows, blocks,last_analyzed
 from user_tables
 table_name   tablespace_name   status   num_rows  blocks  last_analyzed
 ------------------   -----------------------     ------             --------     ------    -----------------------
      TEST                            USERS       VALID                5           5      2009-6-24 14:42:44
 
 b. statistics = none     
 drop table test
 [oracle@rac1 ~]$ impecc_view3/ecc@devdb1file=./ecc_view2.dmp fromuser=ecc_view2 touser=ecc_view3 statistics=none
 select  table_name, tablespace_name, status, num_rows, blocks,last_analyzed
 from user_tables
 table_name   tablespace_name   status   num_rows  blocks  last_analyzed
 ----------   ------------------------------       ------       -------------    ------  -----------------------
 TEST                           USERS           VALID  
 
 c. statistics = safe     
 drop table test
 [oracle@rac1 ~]$ impecc_view3/ecc@devdb1file=./ecc_view2.dmp fromuser=ecc_view2 touser=ecc_view3 statistics=safe
 select  table_name, tablespace_name, status, num_rows, blocks,last_analyzed
 from user_tables
 table_name   tablespace_name   status   num_rows  blocks               last_analyzed
 ---------------   ---------------------------  ------               --------       ------          -----------------------
      TEST                         USERS     VALID                    10          5        2009-6-24 14:54:51
 d. statistics = RECALCULATE     
 drop table test
 [oracle@rac1 ~]$ impecc_view3/ecc@devdb1file=./ecc_view2.dmp fromuser=ecc_view2 touser=ecc_view3 statistics=RECALCULATE;
 select  table_name, tablespace_name, status, num_rows, blocks,last_analyzed
 from user_tables
 table_name   tablespace_name   status   num_rows  blocks  last_analyzed
 -----------------               ----------------  --------        ------------      ------  ---------------------------
     TEST                                USERS  VALID                    10         5   2009-6-24 14:56:03
 =======================
 导入工具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生成的文件
     根据情况我们可以用
     $ imp username/password@connect_string
     说明: connect_string 是在/ORACLE_HOME/network/admin/tnsnames.ora  
       定义的本地或者远端数据库的名称
     注意事项:
       UNIX: /etc/hosts           要定义本地或者远端数据库服务器的主机名
       win98:    windows\hosts             和IP地址的对应关系 
       win2000:  winnt\system32\drivers\etc\hosts
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10527166/viewspace-683271/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10527166/viewspace-683271/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值