只言片语分析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 联机重做日志文件(ONLINE LOG FILE)

--=========================================

1142
来自专栏拂晓风起

Log4Net ,.net和SQL Server的完美结合

1255
来自专栏数据和云

返璞归真:如何判断一个初始化参数是否来自默认设置

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

2847
来自专栏数据库新发现

Oracle诊断案例-Job任务停止执行

Last Updated: Saturday, 2004-11-20 12:47 Eygle

812
来自专栏数据和云

触类旁通:那些关于 TBL$OR$IDX$PART$NUM 的诡异案例和知识

你是否留意过数据库中有一个奇怪的函数 TBL$OR$IDX$PART$NUM ,你是否留意过很多场景下都出现过它的身影?

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

insert中启用错误日志的问题及分析(r2第10天)

在平时的工作中,有时候需要insert一批数据,这些数据可能是临时表,外部表,普通表,子查询等形式,类似下面的格式 insert into xxxx (sele...

3259
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(31)-MVC使用RDL报表

这次我们来演示MVC3怎么显示RDL报表,坑爹的微软把MVC升级到5都木有良好的支持报表,让MVC在某些领域趋于短板 我们只能通过一些方式来使用rdl报表。 R...

3445
来自专栏数据库新发现

在Mac上通过Docker部署Oracle Database 12.2版本

Oracle 已经宣布支持了Docker部署,这也让我们在Mac上部署 Oracle 数据库有了多一个选择,这是我的第一个Docker应用,非常简便快速的就完...

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

使用impdp不当导致的数据丢失问题(r5笔记第1天)

今天有个朋友问我们一个问题,说他在使用了impdp导入数据的时候,使用了TABLE_EXISTS_ACTION=REPLACE这个选项,结果现在数据都给覆盖了。...

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

关于sysdba,sysoper,dba的区别(r3笔记第62天)

关于sysdba,sysoper,dba这些名词在工作中可能接触的比较多,如果接触的环境是服务器端的,sysdba可能是经常用到的。如果是数据库的维护工作,db...

2726

扫码关注云+社区

领取腾讯云代金券