暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle数据泵常用命令

原创 张文林 2023-09-19
285

前言

     expdp和impdp是oracle数据库之间移动数据的工具。expdp和impdp只能在数据库服务端使用,不能在客户端使用。本文简单总结了expdp和impdp常用的命令,详细信息参考oracle官方文档Utilities。

       

directory相关SQL语句:

select * from dba_directories;

create directory exp_dir as '/archivelog/expdp';

grant read,write on directory exp_dir to G;

 

expdp

注意:

    1、导数的数据库用户需要拥有对directory_object的读写权限。

    2、操作系统中需要已经存在directory_object指定的路径。

    3、oracle用户拥有对directory_object指定路径的读写权限。

    4、system(DBA权限)用户导出用户,会将创建用户和授予系统权限的元数据也导出,普通用户不能导出这些元数据。

 

迁移数据前检查(验证目标端和源端数据库是否符合要求):

1.版本号

2.字符集

3.SID

4.表空间

5.临时表空间

6.数据库时区

7.redo日志

8.监听和网络参数

9.用户

 

--导出

操作步骤:

1.创建逻辑目录

create directory exp_dir as '/archivelog/expdp'; --/archivelog/expdp为系统文件目录,目录的拥有人和所属组要为oracle用户

 

2.创建导出用户,并授予导出权限。(以G用户为例)

drop user G cadcade;

create user G identified by Hxb#ora123;

grant dba to G;

grant all on directory exp_dir to G;

 

3.导出数据,最好在指定的导出目录下执行shell的导出语句(此例子为/archivelog/expdp)

 

导出一张表,例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log tables=scott.emp exclude=statistics compression=all cluster=N

 

导出一张表部分数据,例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log tables=scott.emp query=scott.emp:\"where 过滤字段\>to_date\(\'2020-08-06 00:00:00\',\'yyyy-mm-dd hh24:mi:ss\'\)"\ exclude=statistics compression=all cluster=N

 

导出多张表部分数据,建议使用参数文件导出,例:

more test.par

directory=exp_dir

dumpfile=expdp.dmp   

logfile=expdp.log

tables=

(

scott.emp1,

scott.emp2,

scott.emp3,

scott.emp4

)

query=

(

scott.emp1:"where 过滤字段>to_date('2020-08-06 00:00:00','yyyy-mm-dd hh24:mi:ss')" ,

scott.emp2:"where 过滤字段>to_date('2020-08-06 00:00:00','yyyy-mm-dd hh24:mi:ss')" ,

scott.emp3:"where 过滤字段>to_date('2020-08-06 00:00:00','yyyy-mm-dd hh24:mi:ss')" ,

scott.emp4:"where 过滤字段>to_date('2020-08-06 00:00:00','yyyy-mm-dd hh24:mi:ss')"

)

parallel=4

exclude=statistics

compression=all

cluster=N

 

导出命令为

expdp G/Hxb#ora123 parfile=test.par

 

导出多张表,例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log tables=\(scott.emp,scott.dept\) exclude=statistics compression=all cluster=N

导出一个用户(导出这个用户的所有对象),例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log schemas=scott exclude=statistics compression=all cluster=N

 

导出多个用户,例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log schemas=\(scott,hr\) exclude=statistics compression=all cluster=N

 

导出整个数据库(sys、ordsys、mdsys的用户数据不会被导出)例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log full=yes exclude=statistics compression=all cluster=N

 

以导出一个用户为例

并行导出:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp%U.dmp logfile=expdp.log schemas=scott parallel=5 exclude=statistics compression=all cluster=N

 

导出用户元数据(包含表定义、存储过程、函数等等):

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log schemas=scott content=metadata_only exclude=statistics compression=all cluster=N

 

导出用户存储过程,例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log schemas=scott include=procedure exclude=statistics compression=all cluster=N

 

导出用户函数和视图,例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log schemas=scott include=\(function,view\) exclude=statistics compression=all cluster=N

 

导出一个用户,但不包括索引,例:

expdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=expdp.log schemas=scott exclude=index,statistics compression=all cluster=N

 

 

expdp参数说明:

attach=[schema_name.]job_name

说明:nodefault。连接到作业,进入交互模式。

 

导出模式,以下五个参数互斥。

full=[yes|no]

说明:nodefault。导出所有数据和元数据。要执行完全导出,需要具有datapump_exp_full_database角色。

 

schemas=schema_name[,...]

说明:default current user's schema。导出用户。

 

tables=[schema_name.]table_name[:partition_name][,...]

说明:nodefault。导出表。

 

tablespaces=tablespace_name[,...]

说明:nodefault。导出表空间。

 

transport_tablespaces=tablespace_name[,...]

说明:nodefault。导出可移动表空间。

 

过滤条件,以下三个参数互斥:

query=[schema.][table_name:] query_clause

说明:nodefault。按查询条件导出。

 

exclude=object_type[:name_clause][,...]

说明:nodefault。排除特定的对象类型。

 

include=object_type[:name_clause][,...]

说明:nodefault。包括特定的对象类型。

 

其他参数:

directory=directory_object

说明:default:data_pump_dir。导出路径。

 

dumpfile=[directory_object:]file_name[,...]

说明:default:expdat.dmp。导出的文件名。

 

logfile=[directory_object:]file_name

说明:default:export.log。导出的日志文件名。

 

content=[all|data_only|metadata_only]

说明:default:all。指定要导出的数据。

 

parallel=integer

说明:default:1。并行度,该值应小于等于dmp文件数量,或可以为'dumpfile='使用替换变量'%U'。

         RAC环境中,并行度大于1时,注意目录应该为共享目录。

 

compression=[all|data_only|metadata_only|none]

说明:default:metadata_only。压缩。

 

parfile=[directory_path]file_name

说明:nodefault。指定导出参数文件名称。

 

network_link=source_database_link

说明:nodefault。连接到源数据库进行导出。

 

filesize=integer[b|kb|mb|gb|tb]

说明:default:0不限制大小。指定每个dmp文件的最大大小。

      如果此参数小于将要导出的数据大小,将报错ORA-39095。

 

job_name=jobname_string

说明:default:system-generated name of the form SYS_EXPORT_<mode>_NN。指定job名称。

 

version=[compatilble|latest|version_string]

说明:default:compatible。默认兼容模式,可以指定导出dmp文件的版本。

 

cluster=[yes|no]

说明:default:yes。Utilize cluster resources and distribute workers across the Oracle RAC。

需要特别注意的是,当处于多节点环境下时,若导出目录不在共享存储上,不添加cluster=no参数将会报ORA-31693等错误,原因是其他节点对导出目录无权限。

 

impdp

注意:

    1、expdp导出的文件不能使用imp导入,只能通过impdp导入数据库。

    2、导入时遇到已存在的对象,默认会跳过这个对象,继续导入其他对象。

    3、导入时应确认dmp文件和目标数据库的tablespace、schema是否对应。

    4、导入dmp文件时,应确定dmp文件导出时的命令,以便顺利导入数据。

 

拿到一个dmp文件,如果忘记了导出命令,可以通过以下方法确认(非官方,生产数据勿使用):

◆确认dmp文件是exp导出还是expdp导出

1)

xxd test.dmp | more      

expdp导出的文件开头为0301,exp导出的文件开头为0303

2)

strings  test.dmp | more  

 

expdp导出的dmp文件头信息:

"SYS"."SYS_EXPORT_TABLE_01"  -----job名称

x86_64/Linux 2.4.xx   -----操作系统版本

bjdb  -----数据库名称

ZHS16GBK  -----数据库字符集

11.02.00.04.00  -----数据库版本

 

exp导出的dmp文件头信息:

iEXPORT:V11.02.00  -----版本

USCOTT  -----用户

RTABLES  -----对象

 

◆确认expdp导出的dmp文件的导出命令

strings test.dmp | grep CLIENT_COMMAND

 

--导入

导出的dnp文件传输到目标端后,导入数据(操作命令在目标端进行)

1.创建逻辑目录

create directory imp_dir as '/oradata/impdp'; --/oradata/impdp为系统文件目录,目录的拥有人和所属组要为oracle用户

 

2.创建导入用户,并授予导出权限。(以G用户为例)

drop user G cadcade;

create user G identified by Hxb#ora123;

grant dba to G;

grant all on directory imp_dir to G;

 

3.导入数据,最好在指定的导出目录下执行shell的导出语句(此例子为/oradata/impdp)

 

impdp命令示例

导入dmp文件中的所有数据,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log full=yes cluster=N

 

导入一张表,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log tables=scott.emp cluster=N

 

导入多张表,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log tables=\(scott.emp,scott.dept\) cluster=N

 

导入一个用户,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log schemas=scott cluster=N

 

导入多个用户,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log schemas=\(scott,hr\) cluster=N

 

 

以导入dmp文件中的所有数据为例

并行导入:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp%U.dmp logfile=impdp.log parallel=5 cluster=N

 

导入元数据(包含表定义、存储过程、函数等等):

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log content=metadata_only cluster=N

 

导入存储过程,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log include=procedure cluster=N

 

导入函数和视图,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log include=\(function,view\) cluster=N

 

导入数据,但不包括索引,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log exclude=index cluster=N

 

重命名表名导入,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log remap_table=scott.emp:emp1 cluster=N

 

重命名schema名导入,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log remap_schema=scott:tim cluster=N

 

重命名表空间名导入,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log remap_tablespace=users:apptbs cluster=N

 

导入时,忽略所有对象的段属性,这样导入时对象都创建在目标数据库用户默认的表空间上。

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log transform=segment_attributes:n cluster=N

 

将dmp文件的ddl语句导入到一个文件,不导入数据库,例:

impdp G/Hxb#ora123 directory=exp_dir dumpfile=expdp.dmp   logfile=impdp.log sqlfile=import.sql cluster=N

 

 

 

impdp参数说明

attach=[schema_name.]job_name

说明:nodefault。连接到作业,进入交互模式。

 

导入模式,以下五个参数互斥。

full=[yes|no]

说明:default:yes。导入dmp文件的所有数据和元数据。

 

schemas=schema_name[,...]

说明:nodefault。导入用户。

 

tables=[schema_name.]table_name[:partition_name][,...]

说明:nodefault。导入表。

 

tablespaces=tablespace_name[,...]

说明:nodefault。导入表空间。

 

transport_tablespaces=tablespace_name[,...]

说明:nodefault。导入可移动表空间。

 

过滤条件,以下三个参数互斥:

query=[schema.][table_name:] query_clause

说明:nodefault。按查询条件导入。

 

exclude=object_type[:name_clause][,...]

说明:nodefault。排除特定的对象类型。

 

include=object_type[:name_clause][,...]

说明:nodefault。包括特定的对象类型。

 

其他参数:

directory=directory_object

说明:default:data_pump_dir。导入路径。

 

dumpfile=[directory_object:]file_name[,...]

说明:default:expdat.dmp。导入的文件名。

 

logfile=[directory_object:]file_name

说明:default:export.log。导入的日志文件名。

 

content=[all|data_only|metadata_only]

说明:default:all。指定要导入的数据。

 

parallel=integer

说明:default:1。并行度,该值应小于等于dmp文件数量,或可以为'dumpfile='使用替换变量'%U'。

 

compression=[all|data_only|metadata_only|none]

说明:default:metadata_only。压缩。

 

parfile=[directory_path]file_name

说明:nodefault。指定导入参数文件名称。

 

network_link=source_database_link

说明:nodefault。连接到源数据库进行导入。

 

job_name=jobname_string

说明:default:system-generated name of the form SYS_EXPORT_<mode>_NN。指定job名称。

 

version=[compatilble|latest|version_string]

说明:default:compatible。默认兼容模式,可以指定导入dmp文件的版本。

 

REMAP_TABLE=[schema.]old_tablename[.partition]:new_tablename

说明:nodefault。允许导入期间重命名表名。

 

REMAP_SCHEMA=source_schema:target_schema

说明:nodefault。允许导入期间重命名schema名。

 

REMAP_TABLESPACE=source_tablespace:target_tablespace

说明:nodefault。允许导入期间重命名表空间名。

 

TRANSFORM = transform_name:value[:object_type]

说明:nodefault。允许改正正在导入的对象的DDL。

 

SQLFILE=[directory_object:]file_name

说明:nodefault。根据其他参数,将所有的 SQL DDL 写入指定的文件。

 

TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE]

说明:default:skip(if content=data_only is specified,then the default is append)

 

交互模式

进入交互可以操作导入导出作业。

进入交互模式的方法:

1、导入导出命令行执行期间按Ctrl + c

2、expdp attach=jobname或impdp attach=jobname

     查看导入导出日志可以看到jobname,也可以通过查询dba_datapump_jobs找到jobname。

 

报错总结

系统目录未建立,报错:

ORA-39002: invalid operation

ORA-39070: Unable to open the log file.

ORA-29283: invalid file operation

ORA-06512: at "SYS.UTL_FILE", line 536

ORA-29283: invalid file operation

 

impdp导入exp导出的dmp文件,报错:

ORA-39000: bad dump file specification

ORA-39143: dump file "/u01/20161031/bjh02.dmp" may be an original export dump file

 

如果导出的数据库版本比导入的数据版本高,需要在导出时加上参数version=要导入的数据库版本。否则报错:

ORA-39001: invalid argument value

ORA-39000: bad dump file specification

ORA-31640: unable to open dump file "/home/oracle/EXPDP20161024_1.DMP" for read

ORA-27037: unable to obtain file status

 

文末再附加一条导出用户元数据的sqlfile命令,想到的自然是使用oracle自带的数据泵工具expdp:

expdp G/Hxb#ora123 directory=exp_dir schemas=scott dumpfile=scott.dmp logfile=scott.log content=metadata_only

但是问题来了,需求要的是sqlfile不是dumpfile,当然可以通过plsql developer工具把元数据导出成sqlfile的形式,但是导出的sqlfile还是不满足业务的需求,后经查阅官方文档得知,在导出元数据之后,只需要在导入的时候加上sqlfile参数,就可以生成sqlfile文件,具体命令如下:

impdp G/Hxb#ora123 directory=exp_dir schemas=scott dumpfile=scott.dmp logfile=scott_imp.log sqlfile=scott.sql

impdp工具里对sqlfile的描述如下

[oracle@dummy tmp]$ impdp -help

SQLFILE

Write all the SQL DDL to a specified file.

将所有的 SQL DDL 写入指定的文件。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论