之前一直在查找数据库导出之类的问题,今天正好有机会和大家分享一下.

    导入/导出是ORACLE幸存的最陈旧的两个命令行工具,其实我从来不认为Exp/Imp是一种好的备份方法,确正的说法是Exp/Imp只能是一个好的储转工具,特别是在小型据数库的储转,表空间的移迁,表的取抽,测检逻辑和物理冲突等中有不小的劳功。当然,我们也可以把它作为小型据数库的物理备份后的一个逻辑帮助备份,也是不错的提议。对于越来越大的据数库,特别是TB级据数库和越来越多据数仓库的现出,EXP/IMP越来越力不能及了,这个时候,据数库的备份都转向了RMAN和第三方工具。面上说明一下EXP/IMP的应用。
如何使exp的帮助以不同的字符集示显:set nls_lang=simplified chinese_china.zhs16gbk,通过设置环境变量,可以让exp的帮助以中文示显,如果set nls_lang=American_america.字符集,那么帮助就是英文的了
 程序代码
EXP的全部参数(括号中为参数的默认值):
USERID       户用名/令口     如: USERID=duanl/duanl      
FULL         导出个整据数库 (N)
BUFFER       据数缓冲区的小大         
OWNER        全部者户用名表列,你希望导出哪个户用的对象,就用owner=username
FILE         出输件文 (EXPDAT.DMP)    
TABLES       表名表列 ,指定导出的table名称,如:TABLES=table1,table2
COMPRESS     导入一个extent (Y)   
RECORDLENGTH IO 记载的长度
GRANTS       导出限权 (Y)            
INCTYPE      增量导出类型
INDEXES      导出索引 (Y)           
RECORD       跟踪增量导出 (Y)
ROWS         导出据数行 (Y)        
PARFILE      参数件文名,如果你exp的参数很多,可以存成参数件文.
CONSTRAINTS  导出约束 (Y)    
CONSISTENT   交叉表致一性
LOG          屏幕出输的日记件文    
STATISTICS   析分对象 (ESTIMATE)
DIRECT       直接路径 (N)              
TRIGGERS     导出触发器 (Y)
FEEDBACK     示显每 x 行 (0) 的进度
FILESIZE     各储转件文的最大尺寸
QUERY        选定导出表子集的子句
列下关键字仅于用可传输的表空间
TRANSPORT_TABLESPACE 导出可传输的表空间元据数 (N)
TABLESPACES 将传输的表空间表列


 程序代码
IMP的全部参数(括号中为参数的默认值):
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)
ANALYZE  行执储转件文中的 ANALYZE 语句 (Y)
FEEDBACK 示显每 x 行 (0) 的进度
TOID_NOVALIDATE  跳过指定类型 id 的校验
FILESIZE 各储转件文的最大尺寸
RECALCULATE_STATISTICS 新重盘算统计值 (N)
列下关键字仅于用可传输的表空间
TRANSPORT_TABLESPACE 导入可传输的表空间元据数 (N)
TABLESPACES 将要传输到据数库的表空间
DATAFILES 将要传输到据数库的据数件文
TTS_OWNERS 具有可传输表空间中集据数的户用


关于增量参数的说明:exp/imp的增量并非真正意义上的增量,所以最好不要应用。
 


应用方法:
Exp parameter_name=value or Exp parameter_name=(value1,value2……)
只要入输参数help=y以可就看到全部帮助.


EXP用常选项
1. FULL,这个于用导出个整据数库,在ROWS=N起一应用时,可以导出个整据数库的结构。例如:
exp userid=test/test file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
2. OWNER和TABLE,这两个选项于用定义EXP的对象。OWNER定义导出指定户用的对象;TABLE指定EXP的table名称,例如:
exp userid=test/test file=./db_str.dmp log=./db_str.log owner=duanl
exp userid=test/test file=./db_str.dmp log=./db_str.log table=nc_data,fi_arap
3. BUFFER和FEEDBACK,在导出比较多的据数时,我会斟酌设置这两个参数。例如:
exp userid=test/test file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
4 .FILE和LOG,这两个参数别分指定备份的DMP名称和LOG名称,括包件文名和目录,例子见面上。

    5. COMPRESS,是不是压缩导出据数的内容。用来制控导出对象的storage语句如何发生。默认值为Y,应用默认值,对象的存储语句的init extent于等前当导出对象的extent的总和。推荐应用COMPRESS=N。(causes Export to flag table data for consolidation into one initial extent upon Import,The Export utility, not the Import utility, generates the data definitions, including the storage parameter definitions. )

    6. FILESIZE该选项在8i中可用。如果导出的dmp件文过大时,最好应用FILESIZE参数,制限件文小大不要超越2G。如:
exp userid=duanl/duanl file=f1,f2,f3,f4,f5 filesize=2G owner=scott
这样将建创f1.dmp, f2.dmp等一系列件文,个每小大都为2G,如果导出的总量小于10G

    EXP不必建创f5.bmp.

    7. CONSISTENT,If you use CONSISTENT=n, each table is usually exported in a single transaction. However, if a table contains nested tables, the outer table and each inner table are exported as separate transactions. If a table is partitioned, each partition is exported as a separate transaction.

    每日一道理
有一首诗最为动人,那就是青春;有一段人生最美丽,那就是青春;有一道风景最为亮丽,那就是青春。青春,不要说已疲惫,也许你的幻想曾被现实无情毁灭,也许你的追求毫无结果,但你应该相信,没有寒风的洗礼,哪来万紫千红的春天,没有心的耕耘,哪有累累硕果?

    

IMP用常选项
1、FROMUSER和TOUSER,应用它们实现将据数从一个SCHEMA中导入到另外一个SCHEMA中。例如:设假我们做exp时导出的为test的对象,当初我们想把对象导入户用:
imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1
2、IGNORE、GRANTS和INDEXES,其中IGNORE参数将疏忽表的存在,继承导入,这个对于要需调整表的存储参数时很有效,我们可以先根据实际情况用理合的存储参数建好表,然后直接导入据数。而GRANTS和INDEXES则示表是不是导入授权和索引,如果想应用新的存储参数重建索引,或者为了加快到入速度,我们可以斟酌将INDEXES设为N,而GRANTS一般都是Y。例如:imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1 indexes=N


表空间传输
    表空间传输是8i新加增的一种倏地在据数库间动移据数的一种法办,是把一个据数库上的式格据数件文附加到另外一个据数库中,而不是把据数导出成Dmp件文,这在有些时候是非常管用的,因为传输表空间动移据数就象制复件文一样快。
关于传输表空间有一些则规,即:
·源据数库和目标据数库必须运行在雷同的硬件平台上。
·源据数库与目标据数库必须应用雷同的字符集。
·源据数库与目标据数库必定要有雷同小大的据数块
·目标据数库不能有与移迁表空间同名的表空间
·SYS的对象不能移迁
·必须传输自括包的对象集
·有一些对象,如物化图视,基于函数的索引等不能被传输
可以用以下的方法来测检一个表空间或一套表空间是不是合符传输准标:
exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);
select * from sys.transport_set_violation;
如果没有行择选,示表该表空间只括包表据数,并且是自括包的。对于有些非自括包的表空间,如据数表空间和索引表空间,可以起一传输。
以下为要简应用骤步,如果想参考细详应用方法,也可以参考ORACLE联机帮助。
1.设置表空间为只读(假设表空间名字为APP_Data 和APP_Index)
alter tablespace app_data read only;
alter tablespace app_index read only;
2.出发EXP命令
SQL>host exp userid=”””sys/password as sysdba””” 
transport_tablespace=y tablespace=(app_data, app_index)
以上要需注意的是
·为了在SQL中行执EXP,USERID必须用三个引号,在UNIX中也必须注意防止“/”的应用
·在816和后以,必须应用sysdba才能作操
·这个命令在SQL中必须放置在一行(这里是因为示显问题放在了两行)
3.拷贝据数件文到另一个所在,即目标据数库
  可是以cp(unix)或copy(windows)或通过ftp传输件文(必定要在bin方法)
4.把地本的表空间设置为写读
5.在目标据数库附加该据数件文
imp file=expdat.dmp userid=”””sys/password as sysdba””” transport_tablespace=y “datafile=(c:\temp\app_data,c:\temp\app_index)”
6.设置目标据数库表空间为写读
alter tablespace app_data read write;
alter tablespace app_index read write;


化优EXP/IMP的方法:
    当要需exp/imp的据数量比较大时,这个进程要需的间时是比较长的,我们可以用一些方法来化优exp/imp的作操。
exp:应用直接路径 direct=y
oracle会避开sql语句处置擎引,直接从据数库件文中读取据数,然后写入导出件文.
可以在导出日记中观察到: exp-00067: table xxx will be exported in conventional path
    如果没有应用直接路径,必须保障buffer参数的值足够大.
    有一些参数于direct=y不兼容,没法用直接路径导出可动移的tablespace,或者用query参数导出据数库子集.
    当导入导出的据数库运行在不同的os下时,必须保障recordlength参数的值致一.


imp:通过以下几个径途化优
1.防止盘磁排序
将sort_area_size设置为一个较大的值,比如100M
2.防止日记换切等待
加增重做日记组的数量,增大日记件文小大.
3.化优日记缓冲区
比如将log_buffer容量扩展10倍(最大不要超越5M)
4.应用阵列入插与提交
commit = y
注意:阵列方法不能处置括包LOB和LONG类型的表,对于这样的table,如果应用commit = y,每入插一行,就会行执一次提交.
5.应用NOLOGGING方法减小重做日记小大
在导入时指定参数indexes=n,只导入据数而疏忽index,在导完据数后在通过脚本建创index,指定 NOLOGGING选项


导出/导入与字符集
    停止据数的导入导出时,我们要注意关于字符集的问题。在EXP/IMP进程当中我们要需注意四个字符集的参数:导出端的客户端字符集,导出端据数库字符集,导入端的客户端字符集,导入端据数库字符集。
我们首先要需查看这四个字符集参数。
查看据数库的字符集的信息:
SQL> select * from nls_database_parameters;
PARAMETER                      VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                   AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               ZHS16GBK
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                         BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY              $
NLS_COMP                       BINARY
NLS_NCHAR_CHARACTERSET         ZHS16GBK
NLS_RDBMS_VERSION              8.1.7.4.1
NLS_CHARACTERSET:ZHS16GBK是前当据数库的字符集。


我们再来查看客户端的字符集信息:
客户端字符集的参数NLS_LANG=_< territory >.
language:指定oracle息消应用的言语,日期中日和月的示显。
Territory:指定币货和数字的式格,地域和盘算期星及日期的习气。
Characterset:制控客户端应用程序应用的字符集。常通设置或于等客户端的代码页。或者对于unicode应用设为UTF8。
在windows中,询查和改修NLS_LANG可在注册表中停止:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\
xx指存在多个Oracle_HOME时的系统编号。


在unix中:
$ env|grep NLS_LANG
NLS_LANG=simplified chinese_china.ZHS16GBK


改修可用:
$ export NLS_LANG=AMERICAN_AMERICA.UTF8


常通在导出时最好把客户端字符集设置得和据数库端雷同。当停止据数导入时,主要有以下两种情况:
(1)    源据数库和目标据数库有具雷同的字符集设置。
这时,只要设置导出和导入端的客户端NLS_LANG于等据数库字符集可即。
(2)    源据数库和目标据数库字符集不同。
    先将导出端客户端的NLS_LANG设置成和导出端的据数库字符集致一,导出据数,然后将导入端客户端的NLS_LANG设置成和导出端致一,导入据数,这样转换只发生在据数库端,而且只发生一次。
    这类情况下,只有当导入端据数库字符集为导出端据数库字符集的严厉超集时,据数才能完整导胜利,否则,可能会有据数不致一或码乱现出。


不同本版的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号为2261722,你可以到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; 



可以跨本版的应用EXP/IMP,但必须确正地应用EXP和IMP的本版: 
1、总是应用IMP的本版匹配据数库的本版,如:要导入到817中,应用817的IMP工具。
2、总是应用EXP的本版匹配两个据数库中最低的本版,如:从9201往817中导入,则应用817本版的EXP工具。