$imptest/testfile=/home/exppipefromuser=testtouser=macro& gunzip
$rm–fr/home/exppipe 4.全库导入的一般步骤
注意:在导出时,需要通过toad或其他工具提取源数据库创建主键和索引的脚本 1.先全库加rows=n把结构导进去
$impsystem/managerfile=exp.dmplog=imp.logfull=yrows=nindexes=n 2.使业务用户的触发器失效/删除主键和唯一索引 spooldrop_pk_u.sql
select'altertable'||table_name||'dropconstraint'||constraint_name||';' fromuser_constraints
whereconstraint_typein('P','U'); /
spooloff
spooldisable_trigger.sql
select'altertrigger'||trigger_name||'disable;' fromuser_triggers; /
spooloff
@drop_pk_u.sql
@disable_trigger.sql 3.以ignore=y全库导入
$impsystem/managerfile=exp.dmplog=imp.logfull=yignore=y
4.通过toad或其他工具提取源数据库创建主键和索引的脚本,在目标数据库中创建主键 和索引。使触发器生效。 1.4常见问题 1.字符集问题
ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示, 货币形式,排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的显示等有效。
ORACLE的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语 言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据 (如文本)时候的编码规则。
ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,
字符集在创建数据库的时候设定,并保存在数据库props$表中。
在客户端的字符集环境比较简单,主要就是环境变量或注册表项NLS_LANG,注
意NLS_LANG的优先级别为:参数文件<注册表<环境变量
使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里
需要一个2进制文件编辑工具即可,如uedit32。用编辑方式打开导出的dmp文件,获 取2、3字节的内容,如0001,先把它转换为10进制数,为1,使用函数
11
NLS_CHARSET_NAME即可获得该字符集: SQL>selectnls_charset_name(1)fromdual; NLS_CHARSET_NAME(1) ------------------- US7ASCII
可以知道该dmp文件的字符集为US7ASCII,如果需要把该dmp文件的字符集换 成ZHS16GBK,则需要用NLS_CHARSET_ID获取该字符集的编号: SQL>selectnls_charset_id('zhs16gbk')fromdual; NLS_CHARSET_ID('ZHS16GBK') -------------------------- 852
把852换成16进制数,为354,把2、3字节的0001换成0354,即完成了把该 dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk 字符集的数据库就可以了。 2.版本问题
Exp/Imp很多时候,可以跨版本使用,如在版本7与版本8之间导出导入数据,但 这样做必须选择正确的版本,规则为:
·总是使用IMP的版本匹配数据库的版本,如果要导入到816,则使用816的导入工 具。
·总是使用EXP的版本匹配两个数据库中低的那个版本,如在815与816之间互导, 则使用815的EXP工具。
imp和exp版本不能往上兼容:imp可以导入低版本exp生成的文件,不能导入高 版本exp生成的文件
2.SQL*Loader 2.1基本知识
Oracle的SQL*LOADER可以将外部格式化的文本数据加载到数据库表中。通常 与SPOOL导出文本数据方法配合使用。 1.命令格式
SQLLDRkeyword=value[,keyword=value,...] 例:
$sqlldruser/pwdcontrol=emp.ctldata=emp.datbad=emp.badlog=emp.log 2.控制文件
SQL*LOADER根据控制文件可以找到需要加载的数据。并且分析和解释这些数 据。
控制文件由三个部分组成,具体参数参考帮助文档: 1.全局选件,行,跳过的记录数等; 2.INFILE子句指定的输入数据; 3.数据特性说明。 comment:--注释 例: loaddata infile*
12
append--除了append外,还有insert、replace、truncate等方式 intotableemp
fieldsterminatedby‘|’ (
nofloatexternal, namechar(20),
ageintegerexternal, dutychar(1),
salaryfloatexternal,
upd_tsdate(14)‘YYYYMMDDHH24MISS’ )
begindata
100000000003|Mulder|000020|1|000000005000|20020101000000 100000000004|Scully|000025|2|000000008000|20020101235959
控制文件中infile选项跟sqlldr命令行中data选项含义相同,如使用infile*则表明 数据在本控制文件以begindata开头的区域内。 一些选项:
FIELDSTERMINATEDBYWHITESPACE FIELDSTERMINATEDBYx'09'
FILLER_1FILLER,//指定某一列将不会被装载
DEPTNOposition(1:2),DNAMEposition(*:16),//指定列的位置 SEQNORECNUM//载入每行的行号
SKIPn//指定导入时可以跳过多少行数据 3.数据文件
按控制文件数据格式定义的数据行集,例:
100000000001|Tom|000020|1|000000005000|20020101000000 100000000002|Jerry|000025|2|000000008000|20020101235959 固定格式、可变格式、流记录格式: 固定格式:
当数据固定的格式(长度一样)时且是在文件中得到时,要用INFILE\loaddata
infile'example.dat'\intotableexample
fieldsterminatedby','optionallyenclosedby'\(col1char(5), col2char(7)) example.dat:
001,cd,0002,fghi, 00003,lmn, 1,\0005,uvwx, 可变格式:
13
当数据是可变格式(长度不一样)时且是在文件中得到时,要用INFILE\。如: loaddata
infile'example.dat'\intotableexample
fieldsterminatedby','optionallyenclosedby'\(col1char(5), col2char(7)) example.dat:
009hello,cd,010world,im, 012my,nameis,
流记录格式://Stream-recoredformat: loaddatainfile'xx.dat'\
intotablexxfieldterminatedby','optionallyenclosedby'\(col1char(5),col2char(7)) example.dat: hello,ccd,| world,bb,| 4.坏文件 bad=emp.bad
坏文件包含那些被SQL*Loader拒绝的记录。被拒绝的记录可能是不符合要求的记 录。
5.日志文件及日志信息 log=emp.log
当SQL*Loader开始执行后,它就自动建立日志文件。日志文件包含有加载的总 结,加载中的错误信息等。 2.2高级选项
1.ConventionalPathLoad与DirectPathLoad Conventional-pathLoad: 通过常规通道方式上载。
特点:commit,alwaysgenredologs,enforceallconstraints,fireinserttriggers,can loadintocluster,otherusercanmakechange rows:每次提交的记录数
bindsize:每次提交记录的缓冲区
readsize:与bindsize成对使用,其中较小者会自动调整到较大者
sqlldr先计算单条记录长度,乘以rows,如小于bindsize,不会试图扩张rows以填 充bindsize;如超出,则以bindsize为准。 命令为:
$sqlldrdbuser/oraclecontrol=emp.ctllog=emp.logrows=10000bindsize=8192000 Direct-PathLoad:
通过直通方式上载,可以跳过数据库的相关逻辑,不进行SQL解析,而直接将数 据导入到数据文件中。
特点:save,conditionlygenredologs,enforcePKUKNN,notfiretriggers,cannotload
14
intocluster,otherusercannotmakechange 命令为:
$sqlldrdbuser/oraclecontrol=emp.ctllog=emp.logdirect=true 2.SPOOL导出文本数据方法
导入的数据文件可以用SPOOL导出文本数据方法生成。 SQL*PLUS环境设置
SETNEWPAGENONEHEADINGOFFSPACE0PAGESIZE0 SETTRIMOUTONTRIMSPOOLONLINESIZE2500
注:LINESIZE要稍微设置大些,免得数据被截断,它应和相应的TRIMSPOOL结 合使用防止导出的文本有太多的尾部空格。
但是如果LINESIZE设置太大,会大大降低导出的速度,另外在WINDOWS下导 出最好不要用PLSQL导出,速度比较慢,直接用COMMEND下的SQLPLUS命令最
小化窗口执行。对于字段内包含很多回车换行符的应该给与过滤,形成比较规矩的文本 文件。
通常情况下,我们使用SPOOL方法,将数据库中的表导出为文本文件,如下述: settrimspoolon
setlinesize120pagesize2000newpage1headingofftermoff spool路径+文件名
selectcol1||','||col2||','||col3||','||col4||'..'fromtablename; spooloff 2.3脚本
1.将表中数据记录导出为字段值用分隔符'|'分开的.dat文件 #!/bin/ksh
################################################################## ##名称:unloadtable
##功能:本shell用于将表中数据记录导出 ##导出为字段值用分隔符'|'分开的.dat文件 ##编者:
##日期:2006.03.18
################################################################## if[$#-ne3] then
echo\exit0 fi
##准备工作
echo\echo\echo\echo\
echo\
echo\
15