写点什么

Oracle 19c 迁移遇到大容量 lob 表怎么办?

  • 2020-08-02
  • 本文字数:2186 字

    阅读完需:约 7 分钟

Oracle 19c迁移遇到大容量lob表怎么办?

本文由 dbaplus 社群授权转载。

背景

从 Oracle 数据库官方服务支持生命周期表,我们可以清晰看到 Oracle 11g 已过主支持生命周期,2020 年后不再支持。基于这个背景,某客户的应用系统数据库将从 IBM AIX 小型机环境迁移到某国产数据库一体机,同时数据库版本从 11g 直接升级为 19c。


LOB 字段带来的问题

经过分析,此数据库的数据量不大,只有区区 3TB,同时由于停机时间非常充分,可以考虑采取数据泵 datapump 的方式实现数据迁移。但是在仔细查看后,发现数据库中有个单表 2TB,仔细再查 2TB 基本全是 lob 字段,且不是分区表,这个问题就有点棘手了。



根据以往的经验来看,这种大容量 TB 级的 lob 表,使用以往常规导出的方式,大概率会报 Ora-01555。



稍稍测试一下,果不其然。

解决方法

一般的方法可以修改一下 undo_retention 参数以及 lob 字段的 retention 设置来解决,大致如下:


alter system set undo_retention=7200 scope=both;alter table table_name MODIFY LOB(col_name)(retention);
复制代码


然而当前的数据库是一个生产环境,参数修改这样的风险工程还是少做为妙,因此需要另辟蹊径。既然 ORA-01555 是由于长时间查询引起,我们可以尝试减少倒出的数据量。


最后决定用 Expdp 的 Query 试一试,但是 2TB 的数据量的单表 lob 还是第一次,那么根据哪个条件进行 Query 导出呢?


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


要怎样才能均分呢?看来只能用 Rowid 试试看。


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


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



上图是 Rowid 的结构图,主要包含 4 个部分:


  • 第一部分 6 位表示:该行数据所在的数据对象的 Data_object_id

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

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

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


一个扩展 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=“……”:将表数据根据条件进行分批导出全部数据。


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



将参数文件复制并修改取模的余数值,分为十个进程并发执行。查看全部导出日志,每个批次耗时相差不大,满足均匀分批导出的计划。


小结

遇到超大 lob 表导出需要,一般的思路是尽可能通过分区或者过滤查询减少单表数据导出的数据量,减少整体耗时,办法可以分为:


1、查看是否是分区表,分区表的话按分区导出


userid=' / as sysdba'directory=DMPdumpfile=export.dmplogfile=export.logCONTENT=DATA_ONLYCOMPRESSION=DATA_ONLYtables=(onwer.tbale_name:part_name)
复制代码


2、业务沟通,是否存在均匀分布的字段值,按照字段值分批导出,例如


USERID=' / as sysdba'directory= DMPCONTENT=DATA_ONLYCOMPRESSION=DATA_ONLYdumpfile=export.dmplogfile=export.logtables=owner.table_nameQUERY="WHERE column_name > 100000
复制代码


3、不满足以上的都可以使用本文 rowid 方式进行导出


Cat exp_owner_table_seq.parUSERID='/ as sysdba'directory= DMPCONTENT=DATA_ONLYCOMPRESSION=DATA_ONLYdumpfile=export.dmplogfile=export.logtables=owner.table_nameQUERY="wheremod(dbms_rowid.rowid_block_number(rowid),10)=1"
复制代码


作者介绍


梁铭图,新炬网络首席架构师,十多年数据库运维、数据库设计、数据治理以及系统规划建设经验,拥有 Oracle OCM、Togaf 企业架构师(鉴定级)、IBM CATE 等认证,曾获 dbaplus 年度 MVP 以及华为云 MVP 等荣誉,并参与数据资产管理国家标准的编写工作。在数据库运维管理和架构设计、运维体系规划、数据资产管理方面有深入研究。


王涛,新炬网络资深数据库专家,长期服务于运营商、金融、制造业及政企客户。扎根客户一线,多次主导运营商数据库大版本升级,擅长数据割接及同步技术的研究和应用,割接实战经验丰富。


原文链接


https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650792712&idx=2&sn=742813cf08dccc3eede90b5e477ca083&chksm=f3f9569dc48edf8bf9dd0af84d5d768755b44f98b7e188c2553187aa5f7bbcf507f2c7530b32&scene=27#wechat_redirect


2020-08-02 10:002069

评论

发布
暂无评论
发现更多内容

Android-APK瘦身实践:二次瘦身如何再减少大小?,ffmpeg音视频开发实战5

android 程序员 移动开发

Android-Q来了!谷歌将在数小时内发布测试版,腾讯+华为+阿里面试真题分享

android 程序员 移动开发

Android-源码分析-Dalvik-虚拟机创建过程,android棋牌游戏开发

android 程序员 移动开发

Android-系统开发_四大组件篇----探讨-Activity-的生命周期(1)

android 程序员 移动开发

Android-目前最稳定和高效的UI适配方案,flutterandroid版本

android 程序员 移动开发

Android-黑科技保活实现原理揭秘,kotlin开发微信

android 程序员 移动开发

Android-Q来了!谷歌将在数小时内发布测试版(1),阿里大牛整理

android 程序员 移动开发

Android-Studio-4-0-最新进展,这几个新体验太牛逼了!

android 程序员 移动开发

Android-Studio-教程:入门开发第一个程序,2021年最新Android面试点梳理

android 程序员 移动开发

Android-怎么就不卡了呢之Choreographer,android开发实例大全

android 程序员 移动开发

Android-春招-面试经历-2019年,已收藏

android 程序员 移动开发

Android-11-正式发布---开发者们的舞台已就绪,flutterpush消息

android 程序员 移动开发

Android-Apng动画的播放,大牛手把手动态教学,你都不愿意看吗

android 程序员 移动开发

Android-Q-对-startActivity()-做了限制,怎么适配?,安卓开发自学教程

android 程序员 移动开发

Android-Service-ANR-的监控机制,flutter文档

android 程序员 移动开发

Android-多渠道打包配置;你了解吗?,移动互联网app开发入门

android 程序员 移动开发

Android-性能优化-ANR-的原因和解决方案,【一步教学,一步到位

android 程序员 移动开发

Android-Binder机制及AIDL使用,字节跳动安卓开发面试题

android 程序员 移动开发

Android-茫茫9个月求职路,终于拿满意offer,最新大厂程序员进阶宝典

android 程序员 移动开发

Android-_巧_仿蚂蚁森林水滴动效,androidstudiojni开发

android 程序员 移动开发

Android-记一次解决问题的过程:从源码中分析永远是解决问题的最有效方法

android 程序员 移动开发

Android-10分区存储介绍及百度APP适配实践,三年经验月薪50k我是怎么做到的

android 程序员 移动开发

Android-GC原理探究(深度好文),PDF超过6000页,

android 程序员 移动开发

Android-系统开发_四大组件篇----探讨-Activity-的生命周期

android 程序员 移动开发

Android-金三银四跳槽季,拿上攻略有底气!,持续更新大厂面试笔试题

android 程序员 移动开发

Android-面试官:性能优化我就问这些问题!能不能刷到我就看你的造化了

android 程序员 移动开发

Android-高级开发面试题以及答案整理,android基础开发

android 程序员 移动开发

Android-app自动更新总结(已适配9-0),一个回答引发热烈讨论

android 程序员 移动开发

Android-ContentProvider实例详解,2021年您应该知道的技术之一

android 程序员 移动开发

Android-冷门知识点汇总:你知道哪些Android中的冷门知识?

android 程序员 移动开发

Android-开发必看---Flutter之全埋点思考与实现,你了解过移动端适配吗

android 程序员 移动开发

Oracle 19c迁移遇到大容量lob表怎么办?_数据库_dbaplus社群_InfoQ精选文章