只言片语分析datapump的工作原理(r2第18天)

datapump是从oracle 10g推出的新的数据导入导出工具,可以说是exp/imp的加强版,主要的亮点在于服务端,结合了direct+parallel,而且从datapump的结构上来说也和exp/imp有很大的差别。而老式的exp/imp还有一套自己的数据字典表需要维护,习惯了exp/imp,突然切换到expdp/impdp还有是一些抵触情绪的,因为从之前的感触中没有感受到datapump的强大,从公司的team的反馈,产品线中也遇到了不少的bug.但是很多东西你熟悉了了解了,就会明白oracle设计它的一些原因和出发点,有些小的问题也是可以接受的。 datapump官方没有提供很多Internal的东西,都只限于操作层面。以下内容都基于个人理解,欢迎拍砖。 一般来说在数据的导入过程中,oracle会创建3个临时的表,之前在排查Impdp临时中断的问题中注意到了这个细节,但是如何把他们关联一直没有头绪。http://blog.itpub.net/23718752/viewspace-1189257/ IMPORT的表类似下面的形式 SYS_IMPORT_TABLE_28 ERR的表类似下面的形式。 ERR$DP13FC20810001

ET的表类似下面的形式。 ET$1B5C6DCF0001 如果尝试访问这些表,会马上抛出ora错误,可以看出这些临时表是基于external table的形式,而且是不对外访问的,在数据导入完成之后就会自动清空。 SQL> select *from ET$1B5C6DCF0001; ERROR: ORA-29913: error in executing ODCIEXTTABLEOPEN callout KUP-11024: This external table can only be accessed from within a Data Pump job. 而且impdp相对Imp有一个特别的优点就是可以随时查看导入的进度。使用Impdp xxxx attach=SYS_IMPORT_TABLE_28 的形式就可以查看导入的数据量,导入的进度。这些情况基本都是基于SYS_IMPORT_TABLE_28 表来读取的信息,它基本就是一个控制表。 而ET,ERR的表是怎么关联的呢,知道有一天我查看一个性能问题的时候,从awr的日志中发现了如下的一段内容,关于datapump的。

Elapsed Time (s)

Executions

Elapsed Time per Exec (s)

%Total

%CPU

%IO

SQL Id

SQL Module

SQL Text

3,553.36

0

1.01

35.03

10.32

6cz7m51m82vqg

Data Pump Worker

INSERT /*+ PARALLEL("MO1_MEMO"...

相关的sql如下:

6cz7m51m82vqg

INSERT /*+ PARALLEL("TEST_MEMO", 1)+*/ INTO RELATIONAL("APPO"."TEST_MEMO" NOT XMLTYPE) ("APP_ID", "ENTITY_KEY", "PERIOD_KEY", "MEMO_ID", "SYS_CREATION_DATE", "SYS_UPDATE_DATE",xxxxxxxx, "ATTR10VALUE", "CLOB_IND", "MEMO_SYSTEM_TEXT_C") SELECT "APP_ID", "ENTITY_KEY", "PERIOD_KEY", "MEMO_ID", "SYS_CREATION_DATE", "SYS_UPDATE_DATE", xxxxxxxx, "ATTR10VALUE", "CLOB_IND", "MEMO_SYSTEM_TEXT_C" FROM "ET$111D05F70001" KU$ LOG ERRORS INTO "APPO"."ERR$DP111D05F70001" REJECT LIMIT UNLIMITED

可以很清楚的发现原来datapump内部在做这样的操作 使用Insert select的方式做数据的插入。几种ET的表是作为中间的数据缓存表,而ERR的表则是完全基于oracle的新版本特性,启用了错误日志。 有了这些信息也就明白,datapump在数据有冲突的情况下是怎么缓存那些信息的。这些信息都被放入了ERR的表中。

Rejected row #1043:

column APP_ID: 1000 column ENTITY_KEY: 1 column PERIOD_KEY: 2 column MEMO_ID: 34141901

可能仔细查看上面的sql语句发现insert select可能不是最好的方式,为什么不适用insert /*+append*/ select的方式呢,你可以简单做一个测试就会发现,其实在数据的插入中如果启用错误日志,再启用append模式是冲突的。参见:http://blog.itpub.net/23718752/viewspace-1190545/ 上面的例子中我导入数据的表中还有CLOB字段,尽管在Impdp中指定了parallel,但是在实际的插入中还是并行度为1. 所以基于以上信息,可以发现parallel的情况也是根据数据的情况来制定的,append的方式在某些情况下速度可能更快,可以根据自己的需要来选择,甚至手工来完成。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沃趣科技

Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup

作者 姚崇 出品 沃趣技术 在12cR2版本中,我们可以在一个ASM Diskgroup提供不同的冗余级别和配额给不同的数据库使用。提到Quota会让人...

3579
来自专栏乐沙弥的世界

从ORA-27300,ORA-27301到ORA-00064

    最近由于session数量增加,需要调整session,也就是要调整process参数。看是比较简单的一个问题,却遭遇了ORA-27300,ORA-2...

461
来自专栏Hadoop实操

如何在Impala中实现拉链表

拉链表是针对数据仓库设计中表存储数据的方式而定义的,即是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。传统数据仓库一般采用拉链的方式保留主数据(...

5989
来自专栏别先生

一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)

Hive官网(HQL)语法手册(英文版):https://cwiki.apache.org/confluence/display/Hive/LanguageMa...

4529
来自专栏乐沙弥的世界

Oracle 控制文件(CONTROLFILE)

为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份

762
来自专栏乐沙弥的世界

数据泵 EXPDP 导出工具的使用

对于Oracle 数据库之间的导入导出,可以使用Oracle提供的导入导出工具EXP/IMP来实现。EXP/IMP是Oracle早期提供的数据导入导出工具。在...

1063
来自专栏乐沙弥的世界

dbms_stats 导入导出表统计信息

      在SQL tuning的过程中,不正确的或者过时的统计信息导致使用不正确的执行计划被采用的情况比比皆是。 当然对于这个情形,我们可以通过收集最新的统...

412
来自专栏数据和云

返璞归真:实例会话RAC条件下的笛卡尔积种参数可能性

? 杨廷琨(yangtingkun) 云和恩墨 CTO 高级咨询顾问,Oracle ACE 总监,ITPUB Oracle 数据库管理版版主 参数文件是Or...

26710
来自专栏杨建荣的学习笔记

Oracle 12c PDB浅析(二)(r8笔记第29天)

之前写了第一篇Oracle 12c PDB浅析 在上次的基础上继续来学习学习。 首先关于多租户的架构设计来说,就好比在一座已经几十年的老房子上动地基...

3046
来自专栏杨建荣的学习笔记

一条运行了3天的"简单"的sql(r2笔记82天)

早上刚到公司,查看系统的负载,就马上看到一个进程的执行时间已经有3天了。 而且cpu的消耗极高。 Tasks: 2374 total, 19 running,...

3015

扫描关注云+社区