从Oracle数据库官方服务支持生命周期表我们可以清晰看到Oracle11g已过主支持生命周期,2020年后不再支持,取而代之的是12C及以上版本。

基于这个背景,大部分的客户开始了新一轮的数据库升级,下文主要剖析一个和升级相关的Case,希望对大家有帮助。

某客户系统基于版本迭代要求,需要将某核心数据库Oracle11.2.0.3升级至Oracle19.5版本,该系统业务数2.5TB,对于运营商系统来说,这体量的数据量是小儿科,凭借老司机的第一感觉割接应该没啥问题。

但是查看后发现有个单表2TB,仔细再查2TB基本全是lob,且不是分区表,这个问题就有点棘手了。搞的小哥我有点出汗的感脚了。

针对这种大容量的lob表,使用以往常规导出的方式,毫无悬念的报Ora-01555。

作为身经百战的割接小王子,见到挑战我就兴奋,接着出汗。经过自我风暴后,决定用Expdp的Query试一试,但是2TB的数据量的单表lob还是第一次,那么根据哪个条件进行Query导出呢?

首先需考虑到是根据有索引列进行导出,这样的效率会比较高。确认后,问题又来了,索引列不满足均匀分批条件,故这个思路走不通了。

要怎样才能均分呢,继续自我风暴中,要均分,Rowid行不行?Oracle提供了rowid这个概念。那就来看看怎么使用rowid进行导出的。

首先Rowid是用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。Rowid它是一个伪列,它并不实际存在于实体表中。

它是Oracle在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的Rowid能找到一行数据的物理地址信息。从而快速地定位到数据行,而且使用Rowid来进行单记录定位速度是最快的。

上图是Rowid的结构图,主要包含4个部分:第一部分6位表示:该行数据所在的数据对象的Data_object_id

第二部分3位表示:该行数据所在的相对数据文件的id

第三部分6位表示:该数据行所在的数据块的编号

第四部分3位表示:该行数据的行的编号

虽然我们从Rowid伪列中Select出来的Rowid是以base64字符显示的,但在Oracle内部存储的时候还是以原值的二进制表示的。

一个扩展Rowid采用10个byte来存储,共80bit,其中obj#32bit,rfile#10bit,block#22bit,row#16bit。所以相对文件号不能超过1023,也就是一个表空间的数据文件不能超过1023个(不存在文件号为0的文件),一个Datafile只能有2^22=4M个 block,一个block中不能超过2^16=64K行数据的由来。

了解了Rowid后,怎么进行均匀分批呢?答案是利用Oracle提供的DBMS_ROWID 包。

导出脚本如下:

参数说明:

Content=DATA_ONLY

只导出表中的数据,导出会更快,导入时也更快,index之类的对象在data导入后单独处理;

COMPRESSION=DATA_ONLY

数据量太大,节省空间,传输到新环境时效更高

Query=“……”

将表数据根据条件进行分批,在一个scn内导出全部数据

为啥选用rowid_block_number呢?因为导出这个大表的需求下,Object_id就一个,分不了批次,Fileid只有150个,BLOCK_ID 是126924个,ROW_NUMBER是19,数据量数值进行Mod取余分批的差异就越小,所以使用rowid_block_number。使用这个方法后还是很顺利的导出了数据。

查看全部导出日志,每个批次耗时相差不大,满足均匀分批导出的计划。

总结,遇到超大lob表导数需求后的三板斧:

A.查看是否是分区表,分区表的话按分区导出;

catexp_owner_table_seq.par

userid='/assysdba'

directory=DMP

dumpfile=exp_owner_table_seq.dmp

logfile=exp_owner_table_seq.log

CONTENT=DATA_ONLY

COMPRESSION=DATA_ONLY

tables=(

onwer.tbale_name:part_name

)

B.业务沟通,是否存在均匀分布的字段值,按照字段值分批导出;

catexp_owner_table_seq.par

USERID='/as sysdba'

directory= DMP

CONTENT=DATA_ONLY

COMPRESSION=DATA_ONLY

dumpfile=exp_owner_table_seq.dmp

logfile=exp_owner_table_seq.log

tables=owner.table_name

QUERY="WHEREcolumn_name like 'XXXX%'

C.不满足以上的都可以使用本文rowid方式进行导出。

catexp_owner_table_seq.par

USERID='/as sysdba'

directory= DMP

CONTENT=DATA_ONLY

COMPRESSION=DATA_ONLY

dumpfile=exp_owner_table_seq.dmp

logfile=exp_owner_table_seq.log

tables=owner.table_name

QUERY="wheremod(dbms_rowid.rowid_block_number(rowid),10)=1"以上是本小王子实际工作中遇到的2TB数据量lob的处理过程,希望对大家有启发借鉴的作用和意义,后续割接迁移中遇到好玩儿的事情,我再来和大家分享。我们后会有期。

oracle 索引 lob 迁移,Oracle 11g到19c迁移TB级lob表的酸爽相关推荐

  1. oracle 索引-1无效,oracle 索引失效原因及解決方法

    一.以下的方法會引起索引失效 ‍1,<> 2,單獨的>, 3,like "%_" 百分號在前. 4,表沒分析. 5,單獨引用復合索引里非第一位置的索引列. 6,字 ...

  2. oracle 索引命中条件,Oracle索引命中与扫描规律总结 | 学步园

    索引扫描类型(该表取自网络文章): index unique scan(索引唯一扫描)通过唯一索引查找一个数值经常返回单个ROWID.如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导 ...

  3. oracle索引重建并行,oracle重建索引(一)

    重建索引有多种方式,如drop and re-create.rebuild.rebuild online等.下面简单比较这几种方式异同以及优缺点: 首先建立测试表及数据: SQL> CREATE ...

  4. oracle索引是不是聚簇索引,Oracle聚簇索引的使用方式

    很多初学者,在接触Oracle数据库后,都会很疑惑Oracle聚簇索引是什么,如何使用Oracle聚簇索引,Oracle散列聚簇又与Oracle聚簇索引有什么关系.本文针对这3个问题结合相关资料,给出 ...

  5. oracle索引逻辑损坏,ORACLE如何检查找出损坏索引(Corrupt Indexes) | 码农网

    在 Oracle 数据库中如何找出损坏索引呢? 下面我们人为构造一个案例,将索引块损坏.如下案例所示: SQL> create tablespace test_data 2  datafile  ...

  6. oracle索引未使用,oracle

    我正在使用Oracle 12C,我有以下代码 SELECT d.id, 'Status' "ImportStatus", p.importid "ImportID&quo ...

  7. oracle索引图文解析,oracle索引介绍(图文详解)

    针对数据库查询而言,数据库索引是一个必选择项,但针对如今的各种各样大中型数据库查询而言,数据库索引能够 进一步提高数据库查询的特性,以致于它变成了数据库查询不能缺乏的一部分. 数据库索引归类: 逻辑性 ...

  8. oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例

    关于B-Tree.Bitmap.函数索引的相关内容请参考另一篇博文: Oracle中B-Tree.Bitmap和函数索引使用案例总结 通常来说,索引选取的数据列最好为分散度高.选择性好.从索引树结构的 ...

  9. oracle索引未使用,oracle - 未使用主键索引 - SO中文参考 - www.soinside.com

    首先,您应该考虑索引并不总是一个好主意. 如果Oracle必须从表中读取大多数数据,它将使用FULL TABLE SCAN,因为它比首先读取索引块然后再读取数据块更快.涉及太多的IO操作. 现在,回到 ...

最新文章

  1. CVPR 2021 | 论文大盘点:3D目标检测
  2. Javascript的prototype
  3. yum提示Error: rpmdb open failed
  4. java设计模式-建造者模式
  5. html5语义化 兼容,HTML5语义化标签,兼容性问题
  6. mongodb 存储过程 遍历表数据_mongodb查看数据库和表的信息
  7. Mysql优化之Order By/Group By
  8. 英特尔展示业界首个一体封装光学以太网交换机
  9. 逐条驳斥天猫精灵抄袭说?百度钱晨解秘小度Play设计
  10. python主要简介_Python的简介
  11. kettle的乱码和null值无法插入
  12. Android实现组件之间同步的回调通信
  13. linux程序设计大作业,LINUX/UNIX Shell编程大作业
  14. 通过.pk8及.pem文件生成Android studio使用的keystore文件。
  15. 礼物:《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)
  16. 安装 win7虚拟机
  17. 水仙花数(所有自幂数)的实现详解-C语言
  18. 华为ensp搭建习题
  19. python学习——如何求最大公约数
  20. 7-1 C0216:输入矩形的长和宽,输出周长和面积

热门文章

  1. java B2B2C springmvc mybatis电子商城系统:分布式配置中心
  2. 人人都能学会的python编程教程1:第一行代码
  3. this is a test
  4. Linux 在不重启的情况下识别新挂载的磁盘
  5. 20145209 《信息安全系统设计基础》课程总结
  6. 如何在单例模式下禁止init
  7. 高性能web系统的架构和系统优化
  8. SOCK开发之---TCP/IP简介
  9. 关于coredump文件生成与查看
  10. 会写helloworld,不等于入门