文章目录

  • 1、EXPDP/IMPDP用法详解
    • 1.1、expdp/impdp模式
    • 1.2、监控expdp/impdp任务
  • 2、EXPDP/IMPDP使用技巧和案例
    • 2.0、使用技巧
    • 2.1、库、表空间、用户、表等导出导入
    • 2.2、过滤对象
      • 2.2.1、使用include
      • 2.2.2、使用query选项
      • 2.2.3、使用EXCLUDE排除对象
      • 2.2.4、使用content来过滤导出元数据还是只有数据
    • 2.3、remap对象
    • 2.4、估算导出的对象需要多长时间以及容量大小
    • 2.5、远程导出导入
      • 2.5.1、利用network_link
      • 2.5.2、使用tnsname连接数据库进行导出导入
    • 2.6、impdp优化
  • 4、EXP/IMP用法详解
    • 4.1、EXP/IMP命令行帮助信息
    • 4.2、EXP/IMP常用选项
    • 4.3、EXP/IMP与字符集
    • 4.4、不同版本的EXP/IMP问题
  • 5、EXP/IMP使用技巧和案例
    • 5.1、exp使用rowid分割支持并行
    • 5.2、imp优化
    • 5.3、Read DMP info
    • 5.4、exp/imp案例
    • 5.5、exp备份数据库脚本

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 bytesfrom dba_segmentswhere (segment_name like 'DW_SONG_HOT_TOP_STEP_' orsegment_name like 'DW_SONG_HOT_TOP_STEP__' orsegment_name like 'DW_SINGER_SONG_HOT_TOP_STEP_' orsegment_name like 'DW_SINGER_SONG_HOT_TOP_STEP__' orsegment_name like 'DW_SINGER_SONG_PREF_REC_DM__' or/*   segment_name like 'DW_CUST_TAG_SONG_STYLE_RE__' orsegment_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

  1. 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。

  1. 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
)
ASSELECT   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$ rWHERE       u.user# = o.owner#AND r.obj# = o.obj#AND (   UID = 0OR UID = o.owner#OR EXISTS (SELECT   *FROM   session_rolesWHERE   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/binexport PATHexport 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.AL32UTF8NOWDATE=`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.logUSER=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.logUSER=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.logUSER=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.logUSER=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.logUSER=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.logUSER=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.logUSER=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.logecho "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}

Oracle expdp和impdp相关推荐

  1. oracle按表导入impdp,oracle expdp、impdp导入从原表空间更换到其他表空间 ----导入到另个表空间测试...

    expdp数据泵 优点:支持并发多线程方式,可以远程导出,性能显著提高,可开并行parallel=n,比exp/imp实用工具相比,导出提高了10倍左右,导入提高了5倍左右.能根据备份时收集的元数据, ...

  2. oracle——expdp与impdp备份使用方法

    一.引言 原来oracle备份一直跟mysql一样导出sql语句,最近发现有新方法,尝试了下,跟住时代潮流.其实oracle的备份方法挺多的: Oracle备份分成物理备份与逻辑备份.         ...

  3. expdp导出表结构_(转)oracle使用expdp、impdp和exp、imp导入导出表及表结构

    使用expdp.impdp和exp.imp时应该注重的事项: 1.exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. 2.expdp和impdp是服务端的工具程序,他们只能在 ...

  4. Oracle expdp/impdp导出导入命令及数据库备份

    经常报错: ORA-39002: invalid operation ORA-39070: Unable to open the log file. ORA-29283: invalid file o ...

  5. Oracle expdp impdp导出导入命令及数据库备份

    使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用, ...

  6. 非oracle用户使用expdp,expdp 和impdp使用之一(不同用户和不用表空间)

    1.创建DIRECTORYSQL> create or replace directory dir_dp as '/fol/dir_dp'; Directory created. 2.授权SQL ...

  7. ORACLE expdp/impdp导出实例

    服务器上以sys或system超级管理员登录. SQL>create directory expdp_dir as '/home/oracle/dmpdata';(dmpdata 需要建立.赋予 ...

  8. Oracle数据库逻辑备份与恢复(3)——数据泵(expdp、impdp)

    Oracle数据库逻辑备份与恢复(3)--数据泵(expdp.impdp) 使用数据泵技术(expdp.impdp)导出和导入数据比使用exp.imp命令导出和导入数据速度要快,原因是数据泵技术可以使 ...

  9. 通过数据泵expdp、impdp方式备份与还原(导出与导入)Oracle数据库

    作者专注于Java.架构.Linux.小程序.爬虫.自动化等技术. 工作期间含泪整理出一些资料,微信搜索[程序员高手之路],回复 [java][黑客][爬虫][小程序][面试]等关键字免费获取资料. ...

最新文章

  1. wiki多个文件一起导入_mac文件信息管理工具EagleFiler for Mac分享给大家
  2. ”device not found“错误原因及解决方法
  3. 说说如何使用 vue-router 实现页面跳转
  4. 陈十一院士旗下国产CAE软件开发商获数亿元融资,产品技术已有应用成果
  5. 如何用python画数据图-用Python如何画出数据可视化图呢?本文详解
  6. Codeforces 173E Camping Groups 线段树
  7. 翟天临凌晨回应“毕业季被声讨”
  8. selenium-03-常用操作
  9. [转载] python2.7中模块学习- textwrap 文本包装和填充
  10. python中的struct
  11. 【影像学基本知识】Slice gap and slice thickness and cross-talk
  12. 人工智能7大关键技术,终于有人讲明白了
  13. 计算机调用计算器快捷键,Windows系统打开计算器的快捷键 计算器快捷键大全
  14. 人脸识别最低像素_人脸识别新利器:让你在50米内无处遁逃
  15. 凡事预则立,不预则废
  16. esclip直接快捷键构造函数_IntelliJ Idea 常用快捷键
  17. dede后台登陆后一片空白的解决办法汇总
  18. DeepMind爆发史:决定AI高峰的“游戏玩家”|深度学习崛起十年
  19. 中华人民共和国数据安全法(全文)
  20. 转速闭环控制直流调速系统的仿真 matlab

热门文章

  1. 【报告分享】中国人工智能厂商全景报告.pdf(附下载链接)
  2. 王道机试指南读后总结-2
  3. linux shell tr,shell脚本 之 tee tr
  4. python函数降低编程复杂度_Python重构此函数,将其认知复杂度从19降低到允许的15...
  5. 跨境电商ERP系统怎么使用?
  6. php自动加载类与路由,PHP实现路由和类自动加载
  7. 自动驾驶公司 | 纵目科技完成D轮1.9亿美元融资
  8. SpringBoot指南(一)——SpringBoot入门
  9. 性能测试:基础(5)
  10. 第三:GitHub的使用(超详细)