1、EXPDP/IMPDP用法详解
1.1、expdp/impdp模式
expdp和impdp 有三种方式:command-line|parameter file|Interactive-Command Mode
以下为interactive-command mode 命令
Activity Command Used
Add additional dump files. ADD_FILE on page 2-46
Exit interactive mode and enter logging mode. CONTINUE_CLIENT onpage 2-47
Stop the export client session, but leave the job running. EXIT_CLIENT on page 2-47
Redefine the default size to be used for any subsequent dump files. FILESIZE on page 2-47
Display a summary of available commands. HELP on page 2-48
Detach all currently attached client sessions and terminate the current job. KILL_JOB on page 2-48
Increase or decrease the number of active worker processes
for the current job. This command is valid only in the
Enterprise Edition of Oracle Database 11g. PARALLEL on page 2-48
Restart a stopped job to which you are attached. START_JOB on page 2-49
Display detailed status for the current job and/or set status interval. STATUS on page 2-49
Stop the current job for later restart. STOP_JOB on page 2-50
1.2、监控expdp/impdp任务
1、数据字典视图
DBA_DATAPUMP_JOBS和DBA_DATAPUMP_SESSIONS以及v$session_longops视图
2、连接到后台任务
expdp ‘/ as sysdba’ attach=“SYS”.“SYS_EXPORT_SCHEMA_01”
2、EXPDP/IMPDP使用技巧和案例
2.0、使用技巧
1、使用parfile参数文件
参数文件中使用sysdba用户 userid=’/ as sysdba’
当参数文件中有中文时,可以把需要输入的中文字符放到一个表中,参考ID 7154316.8
2、dumpfile变量%U
建议命名规则:dbname_business_expdp&impdp_%U.dmp.date
3、impdp时去掉存储属性,这样可以避免导入DDL语句时初始段把表空间弄的很大
transform=segment_attributes:n
4、为了加快导出速度,可以加并行和排除一些索引、授权、统计信息
EXCLUDE=STATISTICS,INDEX,GRANTS
5、压缩dmp文件,compression=ALL
6、指定并行,parallel = 4
7、忘了开并行或指定dump文件大小等
attach进入expdp任务后在命令行交互模式输入:
parallel = 4
filesize =
2.1、库、表空间、用户、表等导出导入
oracle expdp支持整库、表空间、整个用户、表、视图等对象的导出导入
1)、整库导出导入
expdp hr FULL=y DUMPFILE=dpump_dir1:full1%U.dmp, dpump_dir2:full2%U.dmp
FILESIZE=2G PARALLEL=3 LOGFILE=dpump_dir1:expfull.log JOB_NAME=expfull
2)、按照用户导出导入
nohup expdp chenqy/cqyang@ORCL_gdvgop parfile=gdvgop_liferary_EXPDP.par.20130820 &
directory=DMP content=all
schemas=GDVGOP,LIFERAY
dumpfile=gdvgop_liferay.dmp
logfile=gdvgop_liferay.log
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
nohup impdp chenqy/cqyang@orcl parfile=gdvgop_liferary_IMPDP.par.20130820 &
directory=SUNRISEDUMP
content=all
schemas=GDVGOP,LIFERAY
remap_schema=LIFERAY:LIFERAY_GDVGOP
remap_tablespace=TBS_DATA_VGOP:TBS_VGOP_DATA
dumpfile=gdvgop_liferay.dmp
EXCLUDE=STATISTICS
logfile=impdp_gdvgop_liferay.log
3)、按照表空间导出导入
expdp system/manager DIRECTORY=dump_dir DUMPFILE=tablespace.dmp TABLESPACES=user01,user02 logfile=exp.log;
impdp system/manager DIRECTORY=dump_dir DUMPFILE=tablespace.dmp TABLESPACES=user01 logfile=exp.log;
4)、按照表导出导入
# --expdp $nohup expdp \'/ as sysdba\' parfile=MUSICDW_CUST_CONSUM_EXPDP.par.20130823 &
DIRECTORY=sunrisedump
#schemas=MUSICDW
content=all
DUMPFILE=MUSICDW_CUST_CONSUM_EXPDP_%U.dmp.20130823
logfile=MUSICDW_CUST_CONSUM_EXPDP.log.20130823
tables=MUSICDW.CUST_CONSUMPTION_LEV
#FILESIZE=20G
#PARALLEL=8
++++++++++++++++++++++++++++++++++++++++++++++++
#$nohup impdp \'/ as sysdba\' parfile=MUSICDW_CUST_CONSUM_IMPDP.par.20130823 &
#schemas=MUSICDM
DIRECTORY=JESSE_EXPDP
content=all
DUMPFILE=MUSICDW_CUST_CONSUM_EXPDP_%U.dmp.20130823
logfile=MUSICDW_CUST_CONSUM_IMPDP.log.20130823
tables=MUSICDW.CUST_CONSUMPTION_LEV
#exclude=table:"in('RPT_INFO_QUERY_201306')"
table_exists_action=replace
#cluster=n
#remap_schema=CUSTPTY:MUSICDM
remap_tablespace=TBS_ODS_LOG:TBS_RPT
#PARALLEL=4
2.2、过滤对象
2.2.1、使用include
INCLUDE = object_type[:name_clause] [, ...] a list of valid values for object_type
DATABASE_EXPORT_OBJECTS SCHEMA_EXPORT_OBJECTS TABLE_EXPORT_OBJECTS
如何导出指定的package、package body、procedure等
注意参考官方文档,语法中include=后面跟的是object_type而不仅仅指表
--�����ݲֿ� musicdw���
# expdp parfile CUSTPTY_DW_EXPDP.par.20130809 $nohup expdp \'/ as sysdba\' parfile=CUSTPTY_DW_EXPDP.par.20130809 &
directory=sunrisedump
schemas=CUSTPTY
content=all
include=table:"in (select distinct table_name from dbmon.expcustlist20130809)"
dumpfile=CUSTPTY_DW_EXPDP_%U.dmp.20130809
logfile=CUSTPTY_DW_EXPDP.log.20130809
filesize=20G
cluster=n
parallel=4
--���뵽�ͻ�������custptr custpty�û���
# impdp parfile CUSTPTY_DW_IMPDP.par.20130809 $nohup impdp \'/ as sysdba\' parfile=CUSTPTY_DW_IMPDP.par.20130809 &
DIRECTORY=JESSE_EXPDP
schemas=CUSTPTY
content=all
DUMPFILE=CUSTPTY_DW_EXPDP_%U.dmp.20130809
logfile=CUSTPTY_DW_IMPDP.log.20130809
table_exists_action=replace
cluster=n
remap_tablespace=TBS_RPT:TBS_ODS_LOG
PARALLEL=4
###########################################################
create table dbmon.expcustlist20130809 as select segment_name table_name from (select owner, segment_name, sum(bytes) / 1024 / 1024 bytes
from dba_segments
where (segment_name like 'DW_SONG_HOT_TOP_STEP_' or
segment_name like 'DW_SONG_HOT_TOP_STEP__' or
segment_name like 'DW_SINGER_SONG_HOT_TOP_STEP_' or
segment_name like 'DW_SINGER_SONG_HOT_TOP_STEP__' or
segment_name like 'DW_SINGER_SONG_PREF_REC_DM__' or
/* segment_name like 'DW_CUST_TAG_SONG_STYLE_RE__' or
segment_name like 'DW_CUST_TAG_SONG_FEEL_RE__' or*/
segment_name ='DW_SONG_PREF_RECOMMEND_DM'
-- in ('DW_SONG_SALE_TOP_DM', 'DW_SONG_PREF_RECOMMEND_DM', 'DW_CUST_TAG_SONG_PARTY_RE', 'DW_CUST_TAG_SONG_DAY_RE')
)
group by owner, segment_name)
2.2.2、使用query选项
QUERY=(hr.employees:"WHERE last_name IN(SELECT last_name FROM hr.employees@dblink1)")
处理query参数中的单引号和双引号,expdp 中query选项中有单引号或者双引号
2.2.3、使用EXCLUDE排除对象
例如:导出全库的DDL语句,导入时使用excluede排除不需要的系统用户DDL
parfile中EXCLUDE=SCHEMA:"in('HR','SCOTT','SYS','SYSMAN')"
2.2.4、使用content来过滤导出元数据还是只有数据
如果只是导出一个表的分区或者子分区,只需要导出数据就可以 content=data_only ,也不需要replace
如果只需要导出表结构,则 content=metadata_only
expdp \'/ as sysdba\' DIRECTORY=sunrisedump DUMPFILE=CUSTPTY.dmp SCHEMAS=CUSTPTY CONTENT=METADATA_ONLY include=table PARALLEL=2 logfile=CUSTPTY.log;
content参数控制的是全部导出表结构,灵活性不大。
如果要导出其中一个表的表结构,可以使用query来实现,但是数据量大的时候性能差(这种方法先导出后过滤适合数据量小)。
expdp \'/ as sysdba\' DIRECTORY=sunrisedump DUMPFILE=CUSTPTY.dmp logfile=custpty.log SCHEMAS=CUSTPTY include=table:"in('T','TT')"query='t:"where 1=2"'
使用exclude 参数来控制导出部分表的结构
expdp \'/ as sysdba\' ... tables=(t,tt) exclude=table/table_data:\"=\'T\'\"
- impdp导入技巧,impdp导入表的时候加content=metadata_only参数,可以获得表ddl语句以及insert具体语句
2.3、remap对象
- remap_tablespace
导入到不同的表空间
导入数据时记得remap_tablespace,不仅源库和目标库表空间不一样,并且一个用户下所有的表不一定都在同一个表空。要去dba_tables或者dba_segments里面查看对应的tbs name
- remap_schema
导入到不同的用户
把一个用户导入另外一个用户注意不仅要remap_schema而且还要remap_tablespace
2.4、估算导出的对象需要多长时间以及容量大小
$ expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=SCOTT ESTIMATE=statistics
$ expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=SCOTT ESTIMATE=blocks
ESTIMATE默认参数为blocks
$ expdp help=y
2.5、远程导出导入
2.5.1、利用network_link
oracle 10g+版本的expdp/impdp功能可以利用不同数据库之间的dblink把源端数据在目标端使用impdp命令(network_link)直接导入。
用法一:使用expdp命令把远端dump文件放入本地端directory中
本地端执行:用户名密码是本地端的
expdp \'/ as sysdba\' schemas=remote_users dumpfile=xx.dmp logfile=xx.dmp directory=local_dir network_link='';
用法二:在目标端使用impdp命令直接导入源端的数据
1、创建目标端到源端的dblink
前提是tnsping通过,需要配置tnsnames.ora
create database link target_to_source connect to source_user identified by password using '';
2、在目标端使用Impdp命令导入源端的数据
impdp target_user/password schemas=source_users network_link= target_to_source
2.5.2、使用tnsname连接数据库进行导出导入
场景1:当一个数据库(单机)安装有多个实例时(开发环境居多)太别小心实例问题,导出导入语句一定要加上@name,例如:首先设置export ORACLE_SID=xxx
场景2:不能直接在数据库本地执行命令,需要用客户端连数据库然后去执行导出导入命令
expdp chenqy/cqyang@orcl schemas=BOMCPORTAL directory=sunrisedump dumpfile=BOMCPORTAL20130808.dmp logfile=BOMCPORTAL20130808.log
impdp chenqy/cqyang@orcl directory=sunrisedump dumpfile=BOMCPORTAL20130808.dmp schemas=BOMCPORTAL REMAP_SCHEMA=BOMCPORTAL:BOMCPORTAL_WH
3、注意事项
目标端impdp时使用的用户需要有dblink的权限。dblink中connect的用户需要有导出source_objects的权限。远程直接impdp不支持并行,也不支持某些数据类型,具体参考oracle官方文档。
2.6、impdp优化
1、impdp 如何加快索引的创建
In What Order Are Indexes Built During Datapump Import (IMPDP) and How to Optimize the Index Creation (Doc ID 1966442.1)
4、EXP/IMP用法详解
从oracle 10g开始开始,力推expdp/impdp,用来替换之前的exp/imp,目前最新19c版本仍然保留exp/imp功能,为了兼容。但exp/imp也不是没有优点,对于快速导出一张小表来说,还是挺好用,至少不用设置directory。
导入/导出是ORACLE幸存的最古老的两个命令行工具,其实我从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理冲突等中有不小的功劳。当然,我们也可以把它作为小型数据库的物理备份后的一个逻辑辅助备份,也是不错的建议。对于越来越大的数据库,特别是TB级数据库和越来越多数据仓库的出现,EXP/IMP越来越力不从心了,这个时候,数据库的备份都转向了RMAN和第三方工具。下面说明一下EXP/IMP的使用。
4.1、EXP/IMP命令行帮助信息
使用 $ exp/imp -help之前
如何使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就可以看到所有帮助.
4.2、EXP/IMP常用选项
- 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
- 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。
- 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.dmp.
- 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
4.3、EXP/IMP与字符集
进行数据的导入导出时,我们要注意关于字符集的问题。在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
unix中修改为可用:
$ export NLS_LANG=AMERICAN_AMERICA.UTF8
通常在导出时最好把客户端字符集设置得和数据库端相同。当进行数据导入时,主要有以下两种情况:
(1) 源数据库和目标数据库具有相同的字符集设置。
这时,只需设置导出和导入端的客户端NLS_LANG等于数据库字符集即可。
(2) 源数据库和目标数据库字符集不同。
先将导出端客户端的NLS_LANG设置成和导出端的数据库字符集一致,导出数据,然后将导入端客户端的NLS_LANG设置成和导出端一致,导入数据,这样转换只发生在数据库端,而且只发生一次。
这种情况下,只有当导入端数据库字符集为导出端数据库字符集的严格超集时,数据才能完全导成功,否则,可能会有数据不一致或乱码出现。
4.4、不同版本的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;
/
/* Formatted on 2011/07/22 13:22:16 (QP5 v5.114.809.3010) */
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工具。
5、EXP/IMP使用技巧和案例
5.1、exp使用rowid分割支持并行
exp这种落后的导出方式可以通过rowid分割方式来并行导出,脚本如下:
E:/1@Repository IT/1.0@Oracle/1.0.0@基本日常管理/逻辑导出导入/exp并行脚本
5.2、imp优化
参考文档:Tuning Considerations When Import Is Slow [ID 93763.1]
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的数据量比较大时,这个过程需要的时间是比较长的,我们可以用一些方法来优化exp/imp的操作。
exp:使用直接路径 direct=y
oracle会避开sql语句处理引擎,直接从数据库文件中读取数据,然后写入导出文件.
可以在导出日志中观察到: exp-00067: table xxx will be exported in conventional path
如果没有使用直接路径,必须保证buffer参数的值足够大.
有一些参数与direct=y不兼容,无法用直接路径导出可移动的tablespace,或者用query参数导出数据库子集.
当导入导出的数据库运行在不同的os下时,必须保证recordlength参数的值一致.
5.3、Read DMP info
很多情况下别人直接扔给你个dmp文件也没有告诉你使用什么工具导出的,也不知道是按照表导出的还是按照用户导出的。其实这些信息可以不用去问别人,dmp文件头部的一些信息可以告诉我们
用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:
SQL> select nls_charset_name(to_number(‘0354’,‘xxxx’)) from dual;
ZHS16GBK
如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):
cat exp.dmp |od -x|head -1|awk ‘{print $2 $3}’|cut -c 3-6
然后用上述SQL也可以得到它对应的字符集。
右边部分是exp的版本信息等。如果是按照用户导出会有如:DCHENQY.RUSERS信息。如果是按照表导出,会有如:DCHENQY.RTABLES信息。
如图所示:按照表导出
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
修改dmp文件字符集
上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。
具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。
比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码: SQL> select to_char(nls_charset_id(‘ZHS16GBK’), ‘xxxx’) from dual;
0354
然后将dmp文件的2、3字节修改为0354即可。
如果dmp文件很大,用ue无法打开,就需要用程序的方法了
5.4、exp/imp案例
1、设置客户端字符集
linux:export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK --一定要大写
windows: set nls_lang=AMERICAN_AMERICA.ZHS16GBK --windows 不区分大小写
unix: nls_lang=AMERICAN_AMERICA.ZHS16GBK
2、考虑是否要导出导入权限、索引==
一般来说权限单独grant,索引根据导出导入的性能来决定是否需要索引
-------分区表应该创建好后,再进行导入
3、linux环境
我喜欢linux,可以方便的使用脚本–实例见附件
4、windows环境
(1)按表导:
导出:
exp oracle/oracle@orcl file=D:\dmp\oracle1.dmp tables=(oracle.BOOK_B,oracle.BOOK_C) log=D:\dmp\oracle.log
导入:
imp oracle/oracle@orcl file=D:\dmp\oracle1.dmp tables=(BOOK_B,BOOK_C) log=D:\dmp\oracle.log
(2)按用户导:
导出:
exp oracle/oracle@oraibss file=d:\dmp\user%date:~0,10%.dmp log=d:\dmp\user%date:~0,10%.log owner=user compress=n buffer=8092 consistent=y direct=n constraints=y feedback=10000 grants=y record=y indexes=y triggers=y rows=y
导入:
imp oracle/oracle fromuser=(oracle) touser=(oracle) file=d:\dmp\user.dmp log=d:\dmp\user.log
(3)全库导:
导出:
exp system/oracle@oraibss full=y direct=n buffer=8192 compress=y file=d:\dmp\full%date:~0,10%.dmp log=d:\dmp\full%date:~0,10%.log
exp system/oracle@oraback full=y direct=n buffer=8192 compress=y file=d:\dmp\fulloracle.dmp log=d:\dmp\fulloracle.log
导入:
imp system/oracle@oratest full=y buffer=8192 file=d:\dmp\full%date:~0,10%.dmp log=d:\dmp\fullimp%date:~0,10%.log
imp system/oracle@oratest full=y buffer=8192 file=/backup/back/full.$DATELOG.01.dmp log=/backup/back/full.$DATELOG.log
5.5、exp备份数据库脚本
#!/bin/bash
PATH=$PATH:$HOME/bin
export PATH
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=uprr
export PATH=$PATH:$HOME/BIN:$ORACLE_HOME/bin
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
NOWDATE=`date "+%Y%m%d"`
LOGDIR="/safedata/crontab/log"
NOWDATE_7=`date -d -7days +%Y%m%d`
NOWDATE_8=`date -d -8days +%Y%m%d`
NOWDATE_9=`date -d -9days +%Y%m%d`
NOWDATE_10=`date -d -10days +%Y%m%d`
NOWDATE_11=`date -d -11days +%Y%m%d`
NOWDATE_12=`date -d -12days +%Y%m%d`
NOWDATE_13=`date -d -13days +%Y%m%d`
FILEPATH=/safedata/oracle/dmpbak/${NOWDATE}
mkdir -p ${FILEPATH}
cd ${FILEPATH}
echo "Start export file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
USER=UPRR
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
USER=METABASE
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
USER=DATACORE
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
USER=MDR
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
USER=ABOQ
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
USER=REPORT
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
USER=WORK
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
echo "Complete export file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log
#ɾ��һ��ǰ��7����dmp�����ļ�
cd /safedata/oracle/dmpbak
rm -fr ${NOWDATE_7} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_8} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_9} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_10} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_11} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_12} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_13} >> "$LOGDIR"/"$NOWDATE"_dmp.log
#sleep 300
#cd ..
#tar -cvf ${NOWDATE}.tar ${NOWDATE}
#gzip ${NOWDATE}_${USER}.dmp
#gzip ${NOWDATE}.tar
#rm -fR ${NOWDATE}