EXPIMP的使用详解Word文档格式.docx
《EXPIMP的使用详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《EXPIMP的使用详解Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
INCTYPE
增量导出类型
INDEXES
导出索引
RECORD
跟踪增量导出
(Y)
ROWS
导出数据行
PARFILE
参数文件名,如果你exp的参数很多,可以存成参数文件.
CONSTRAINTS
导出约束
CONSISTENT
交叉表一致性
LOG
屏幕输出的日志文件
STATISTICS
分析对象
(ESTIMATE)
DIRECT
直接路径
(N)
TRIGGERS
导出触发器
FEEDBACK
显示每
x
行
(0)
的进度
FILESIZE
各转储文件的最大尺寸
QUERY
选定导出表子集的子句
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE
导出可传输的表空间元数据
TABLESPACES
将传输的表空间列表
IMP的所有参数(括号中为参数的默认值):
导入整个文件
数据缓冲区大小
FROMUSER
所有人用户名列表
输入文件
TOUSER
用户名列表
SHOW
只列出文件内容
表名列表
IGNORE
忽略创建错误
导入权限
增量导入类型
导入索引
COMMIT
提交数组插入
导入数据行
参数文件名
导入限制
DESTROY
覆盖表空间数据文件
INDEXFILE
将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES
跳过不可用索引的维护
ANALYZE
执行转储文件中的
语句
TOID_NOVALIDATE
跳过指定类型
id
的校验
RECALCULATE_STATISTICS
重新计算统计值
导入可传输的表空间元数据
将要传输到数据库的表空间
DATAFILES
将要传输到数据库的数据文件
TTS_OWNERS
拥有可传输表空间集中数据的用户
关于增量参数的说明:
exp/imp的增量并不是真正意义上的增量,所以最好不要使用。
使用方法:
Exp
parameter_name=value
or
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名称,例如:
owner=duanl
table=nc_data,fi_arap
3.BUFFER和FEEDBACK,在导出比较多的数据时,我会考虑设置这两个参数。
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。
6.
FILESIZE该选项在8i中可用。
如果导出的dmp文件过大时,最好使用FILESIZE参数,限制文件大小不要超过2G。
userid=duanl/duanl
file=f1,f2,f3,f4,f5
filesize=2G
owner=scott
这样将创建f1.dmp,
f2.dmp等一系列文件,每个大小都为2G,如果导出的总量小于10G
EXP不必创建f5.bmp.
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。
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;
app_index
2.发出EXP命令
SQL>
host
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.在目标数据库附加该数据文件
“datafile=(c:
\temp\app_data,c:
\temp\app_index)”
6.设置目标数据库表空间为读写
write;
优化EXP/IMP的方法:
当需要exp/imp的数据量比较大时,这个过程需要的时间是比较长的,我们可以用一些方法来优化exp/imp的操作。
exp:
使用直接路径
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过程中我们需要注意四个字符集的参数:
导出端的客户端字符集,导出端数据库字符集,导入端的客户端字符集,导入端数据库字符集。
我们首先需要查看这四个字符集参数。
查看数据库的字符集的信息:
nls_database_parameters;
PARAMETER
VALUE
------------------------------
--------------------------------------------------------------------------------
NLS_LANGUAGE
AMERICAN
NLS_TERRITORY
AMERICA
NLS_CURRENCY
$
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
.,
NLS_CHARACTERSET
ZHS16GBK
NLS_CALENDAR
GREGORIAN
NLS_DATE_FORMAT
DD-MON-RR
NLS_DATE_LANGUAGE
NLS_SORT
BINARY
NLS_TIME_FORMAT
HH.MI.SSXFF
AM
NLS_TIMESTAMP_FORMAT
DD-MON-RR
NLS_TIME_TZ_FORMAT
AM
TZH:
TZM
NLS_TIMESTAMP_TZ_FORMAT
NLS_DUAL_CURRENCY
NLS_COMP
NLS_NCHAR_CHARACTERSET
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
REPLACE
view
exu81rls
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)
AS
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),
Insert,'
decode(bitand(r.stmt_type,4),
Update,'
decode(bitand(r.stmt_type,8),
Delete,'
),
r.check_opt,
r.enable_flag,
DECODE(BITAND(r.stmt_type,
16),
0,
1)
user$
u,
obj$
o,
rls$
r
where
u.user#
o.owner#
and
r.obj#
o.obj#
(uid
0
uid
exists
(
session_roles
role='
Select_CATALOG_ROLE'
/
grant
on
sys.exu81rls
to
public;
可以跨版本的使用EXP/IMP,但必须正确地使用EXP和IMP的版本:
1、总是使用IMP的版本匹配数据库的版本,如:
要导入到817中,使用817的IMP工具。
2、总是使用EXP的版本匹配两个数据库中最低的版本,如:
从9201往817中导入,则使用817版本的EXP工具