只言片语分析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 条评论
登录 后参与评论

相关文章

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

一个SQL性能问题的优化探索(一)(r11笔记第33天)

今天同事问我一个问题,看起来比较常规,但是仔细分析了一圈,发现实在是有些晕,我隐隐感觉这是一个bug,但是有感觉问题还有很多需要确认和理解的细节。 同事...

3399
来自专栏butterfly100

InnoDB锁机制

1. 锁类型 锁是数据库区别与文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。 InnoDB使用的锁类型,分别有: 共享锁(S)和排他锁(X) 意...

3375
来自专栏向治洪

深入理解Android插件化技术

插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概念的提出(Android版本),到2016年插件化的百花争艳,可以说,插件化...

3837
来自专栏Zephery

谈谈个人网站的建立(八)—— 缓存的使用

一、概述 1.1 缓存介绍 系统的性能指标一般包括响应时间、延迟时间、吞吐量,并发用户数和资源利用率等。在应用运行过程中,我们有可能在一次数据库会话中,执行多次...

2775
来自专栏机器学习算法与Python学习

Python:爬虫系列笔记(7) -- 爬去糗事百科段子

转自:静觅 » Python爬虫实战一之爬取糗事百科段子 前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧。那么这次为大家带来,Python...

3795
来自专栏木东居士的专栏

程序员该如何管理后宫:皇上选妃(代理模式)

1845
来自专栏Java爬坑系列

【MySQL疑难杂症】如何将树形结构存储在数据库中(方案一 Adjacency List)

  今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢?   像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这...

2258
来自专栏xcywt

学习SQLite之路(四)

20160621 更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite   a...

1908
来自专栏腾讯Bugly的专栏

《Android插件化技术——原理篇》

| 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头。从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层...

7886
来自专栏社区的朋友们

TAF 必修课(五):Client 端调用

本节对 Taf-Client 如何发起远程调用进行解析,包括初始化过程、路由查询、以及目前支持的同步、异步和 Future 调用方式。

5150

扫码关注云+社区