写点什么

ORACLE 进阶(一) 通过 EXPDP IMPDP 命令实现导 dmp

  • 2022 年 7 月 03 日
  • 本文字数:3660 字

    阅读完需:约 12 分钟

ORACLE进阶(一) 通过EXPDP IMPDP命令实现导dmp

一、前言

关于dmp文件我们用的还是比较多的,dmp文件是作为oracle导入和导出表使用的文件格式。

二、准备工具

  • FileZilla

  • SecureCRT


其中,FileZilla主要用于查看生成的dmp文件与日志文件;SecureCRT主要用于执行 shell 脚本。

三、Expdp 文件导出

dmp文件导出用的比较多的一般是三种:导出整个数据库实例下的所有数据、导出指定用户的所有表、导出指定表。


相关参数以及导出示例:


  1. DIRECTORY指定转储文件和日志文件所在的目录。


DIRECTORY=directory_object
复制代码


Directory_object用于指定目录对象名称。需要注意,目录对象是使用CREATE DIRECTORY语句建立的对象,而不是OS目录。


Expdp scott/tiger DIRECTORY= DMP DUMPFILE=a.dumpcreate or replace directory dmp as 'd:/dmp'expdp zftang/zftang(@zftang) directory=dmp  dumpfile=test.dmp content=metadata_only
复制代码


  1. CONTENT该选项用于指定要导出的内容。默认值为ALL


CONTENT={ALL | DATA_ONLY | METADATA_ONLY}
复制代码


当设置CONTENTALL时,将导出对象定义及其所有数据。为DATA_ONLY时,只导出对象数据,为METADATA_ONLY时,只导出对象定义。


expdp zftang/zftang@zftang directory=dmp dumpfile=test.dmp content=metadata_only
复制代码


expdp zftang/zftang@zftang directory=dmp  dumpfile=test.dmp content=data_only
复制代码


  1. DUMPFILE用于指定转储文件的名称,默认名称为expdat.dmp


DUMPFILE=[directory_object:]file_name [,….]
复制代码


Directory_object用于指定目录对象名,file_name用于指定转储文件名。需要注意,如果不指定directory_object,导出工具会自动使用DIRECTORY选项指定的目录对象。


expdp zftang/zftang@zftang directory=dmp  dumpfile=test1.dmp
复制代码


数据泵工具导出的步骤:1、创建DIRECTORY


create directory dir_dp as 'D:/oracle/dir_dp'; 
复制代码


2、授权


Grant read,write on directory dir_dp to zftang;
复制代码


--查看目录及权限


SELECT privilege, directory_name, DIRECTORY_PATH FROM user_tab_privs t, all_directories d WHERE t.table_name(+) = d.directory_name ORDER BY 2, 1;
复制代码


3、执行导出


expdp zftang/zftang@fgisdb schemas=zftang directory=dir_dp dumpfile =expdp_test1.dmp logfile=expdp_test1.log;
复制代码


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1With the Partitioning, OLAP and Data Mining options 启动 "ZFTANG"."SYS_EXPORT_SCHEMA_01": zftang/********@fgisdb schory=dir_dp dumpfile =expdp_test1.dmp logfile=expdp_test1.log; */

四、备注

1、directory=dir_dp必须放在前面,如果将其放置最后,会提示:


  • ORA-39002: 操作无效

  • ORA-39070: 无法打开日志文件。

  • ORA-39087: 目录名 DATA_PUMP_DIR; 无效 2、在导出过程中,DATA DUMP 创建并使用了一个名为SYS_EXPORT_TABLE_01的对象,此对象就是DATA DUMP导出过程中所用的JOB名字,如果在执行这个命令时如果没有指定导出的JOB名字那么就会产生一个默认的JOB名字,如果在导出过程中指定JOB名字就为以指定名字出现。


expdp zftang/zftang@fgisdb schemas=zftang directory=dir_dp dumpfile =expdp_test1.dmp logfile=expdp_test1.log,job_name=my_job1;
复制代码


3、导出语句后面不要有分号,否则如上的导出语句中的job表名为‘my_job1;’,而不是 my_job1。因此导致expdp zftang/zftang attach=zftang.my_job1执行该命令时一直提示找不到 job 表。

五、数据泵导出的各种模式

5.1 按表模式导出:

expdp zftang/zftang@fgisdb tables=zftang.b$i_exch_info,zftang.b$i_manhole_info dumpfile =expdp_test2.dmp logfile=expdp_test2.log directory=dir_dp job_name=my_job
复制代码

5.2 按查询条件导出

expdp zftang/zftang@fgisdb  tables=zftang.b$i_exch_info dumpfile =expdp_test3.dmp logfile=expdp_test3.log directory=dir_dp job_name=my_job query='"where rownum<11"'
复制代码

5.3 按表空间导出

Expdp zftang/zftang@fgisdb dumpfile=expdp_tablespace.dmp tablespaces=GCOMM.DBF logfile=expdp_tablespace.log directory=dir_dp job_name=my_job
复制代码

5.4 导出方案

Expdp zftang/zftang DIRECTORY=dir_dp DUMPFILE=schema.dmp SCHEMAS=zftang,gwm
复制代码

5.5 导出整个数据库

expdp zftang/zftang@fgisdb dumpfile =full.dmp full=y logfile=full.log directory=dir_dp job_name=my_job
复制代码

六、Impdp 文件导入

6.1 按表导入

p_street_area.dmp 文件中的表,此文件是以 gwm 用户按 schemas=gwm 导出的:


impdp gwm/gwm@fgisdb  dumpfile =p_street_area.dmp logfile=imp_p_street_area.log directory=dir_dp tables=p_street_area job_name=my_job
复制代码

6.2 按用户导入(可以将用户信息直接导入,即如果用户信息不存在的情况下也可以直接导入)

impdp gwm/gwm@fgisdb schemas=gwm dumpfile =expdp_test.dmp logfile=expdp_test.log directory=dir_dp job_name=my_job
复制代码


6.3 不通过 expdp 的步骤生成 dmp 文件而直接导入的方法


--从源数据库中向目标数据库导入表p_street_areaimpdp gwm/gwm directory=dir_dp NETWORK_LINK=igisdb tables=p_street_area logfile=p_street_area.log  job_name=my_jobigisdb是目的数据库与源数据的链接名,dir_dp是目的数据库上的目录
复制代码

6.4 更换表空间

采用remap_tablespace参数


--导出gwm用户下的所有数据expdp system/orcl directory=data_pump_dir dumpfile=gwm.dmp SCHEMAS=gwm
复制代码


注:如果是用sys用户导出的用户数据,包括用户创建、授权部分,用自身用户导出则不含这些内容--以下是将 gwm 用户下的数据全部导入到表空间 gcomm(原来为 gmapdata 表空间下)下


impdp system/orcl directory=data_pump_dir dumpfile=gwm.dmp remap_tablespace=gmapdata:gcom
复制代码

七、EXP、IMP 与 EXPDP、IMPDP 的区别

  • EXPIMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。

  • EXPDPIMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。

  • IMP只适用于EXP导出的文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件。

  • expdpimpdp命令时,可暂不指出用户名/密码 @实例名 as 身份,然后根据提示再输入,如:


expdp schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1;
复制代码

八、导出导入可能遇到的坎

导入过程中碰到的两个问题:

8.1 中文字符集转换

  • KUP-11007: conversion error loading table "TEST"."T_PSR" ORA-12899: 列 REASON_CODE 的值太大 (实际值: 21, 最大值: 20)

  • KUP-11009: data for row: REASON_CODE : 0X'BABDBFD5C6F7C8DDC1BFCFDED6C6'


这里涉及到了字符集转换的问题,中文在 GBK 字符集中占 2 位,但在 UTF-8 字符集中占 3 位,所以在 GBK 中保存小于 20 个字符的情况下,导入到了 UTF-8 的库中,就可能因为需要额外的字符空间导致超出字段长度定义,报了 ORA-12899 的错误。

8.2 主外键关联

  • ORA-31693: Table data object "TEST"."T_ITE" failed to load/unload and is being skipped due to error:

  • ORA-29913: error in executing ODCIEXTTABLEFETCH callout

  • ORA-02291: integrity constraint (TEST.FK_ITE_REF_PSR) violated parent key not found


由于有些表之间是存在主外键关联的,expdp 导出的时候选择了 data_only 仅导出数据,impdp 导入的时候会因未插入主键记录而插入外键记录,出现 ORA-02291 的错误,对于这种情况可以选择先禁止主外键关联,导入后再恢复关联。操作顺序:


  1. 导入前,执行如下 SQL 找到需要禁止的外键关联


select 'ALTER TABLE '||TABLE_NAME||' DISABLE CONSTRAINT '||constraint_name||';'from user_constraints WHERE CONSTRAINT_TYPE='R';
复制代码


  1. 执行(a)的结果 SQL。

  2. 导入后,执行如下 SQL 找到需要恢复的外键关联


select 'ALTER TABLE '||TABLE_NAME||' ENABLE NOVALIDATE CONSTRAINT '||constraint_name||';' from user_constraints WHERE CONSTRAINT_TYPE='R';
复制代码


NOVALIDATE参数不会验证已存储的数据,但未来再插入的记录则会遵循主外键关联的关系。

九、总结

  • 使用 10g 以上版本提供的 expdp/impdp 数据泵导入导出工具,较以往的 exp/imp 工具,无论是在参数的可选择性上,还是速度和压缩比上,都有了不小的改进,提供更为方便快速的数据导入导出方法给我们。

  • 导入导出可能碰到最多的问题,字符集转换算是其中之一,要明确导入导出数据对字符集的依赖程度,才能确保数据导入导出的正确。

  • 对于有主外键关联的数据,如果选择 data_only 仅导出数据,那么可在导入前禁止约束,这样导入过程不会受到主外键关联的影响,导入后可以恢复约束,保证约束的正确。

十、删除外键约束

 ALTER TABLE test_sub DROP CONSTRAINT main_id_cons;
复制代码


1、ORACLE 数据库中的外键约束名都在表 user_constraints 中可以查到。其中constraint_type='R'表示是外键约束。2、启用外键约束的命令为:alter table table_name enable constraint constraint_name3、禁用外键约束的命令为:alter table table_name disable constraint constraint_name4、然后再用 SQL 查出数据库中所以外键的约束名:


select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R'
复制代码


发布于: 刚刚阅读数: 4
用户头像

No Silver Bullet 2021.07.09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
ORACLE进阶(一) 通过EXPDP IMPDP命令实现导dmp_oracle_No Silver Bullet_InfoQ写作社区