时隔16年JeffBarr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

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:002345

评论

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

昆仑分布式数据库独特的变量读写功能介绍

KunlunBase昆仑数据库

数据库 读写分离

2022年2月云主机性能评测报告

博睿数据

开发者说丨如何从零开始构建一个轻量级应用

华为云开发者联盟

Vue 低代码 页面 应用 AppCube

恒源云(GpuShare)_表序编码器的联合实体和关系提取(论文浅谈)

恒源云

自然语言处理 机器学习 深度学习

知识管理——企业数字化转型的新挑战

小炮

【技术学习】一次Node.js站点渗透

H

node.js 网络安全 渗透测试

网络安全之文件包含漏洞总结

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

以领先NLP技术构建AI数字疗法体系,聆心智能致力于解开更多“心结”

硬科技星球

ARP欺骗攻击

喀拉峻

网络安全

如何为你的企业创建自助服务知识库

小炮

J2PaaS低代码平台,如何赋能开发者,助力企业数字化?

J2PaaS低代码平台

开发者 低代码 企业数字化 地代码平台 J2PaaS

【Kali】中密码暴力破解工具hydra的使用

学神来啦

网络安全 字典 kali kali Linux

阿里巴巴如何提升构建的效率 | 阿里巴巴DevOps实践指南

阿里云云效

阿里巴巴 阿里云 CI/CD 持续交付 构建工具

亿级月活沙盒平台《迷你世界》背后的黑科技

华为云数据库小助手

GaussDB DDM 华为云数据库

在线TOML转JSON工具

入门小站

工具

网易X工行:云原生日志系统 Loggie 正式开源!

网易数帆

开源 云原生 日志 Filebeat Loggie

培训第二弹!全国大学生智能汽车竞赛百度竞速组预告

百度开发者中心

吉利控股集团与百度深化战略合作

百度开发者中心

干货|性能提升密钥,由代码细节带来的极致体验

SphereEx

Apache 数据库 开源 ShardingSphere SphereEx

Hadoop HDFS 3.3.1分布式存储搭建

KunlunBase昆仑数据库

国产数据库

华为SmartCare和AUTIN品牌升级:助力运营商走出5G发展迷宫

脑极体

Meetup预告|面向云原生的架构及演进

云智慧AIOps社区

开源 云原生 AIOPS 智能运维

见证中国云势力崛起!博睿数据实力入围2021~2022 Cloud 100 榜单

博睿数据

如何使用一个有安全性问题的隐私计算技术?

易观分析

隐私计算

【OpenMLDB Monthly Meeting】2022.2 月会议纪要

第四范式开发者社区

人工智能 数据库 开源 Meetup 特征平台

多任务学习模型之DBMTL介绍与实现

阿里云大数据AI技术

机器学习 深度学习 数据模型 多任务学习

RTC 音频质量评价和保障

网易云信

WebRTC

建设领先的AI原生云,百度智能云落地新一代高性能AI计算集群

百度开发者中心

星汉未来成为 FinOps 产业标准生态联盟首批会员

星汉未来

云原生 开源社区 成本优化 IT运维

国内领先的云软件厂商安超云加入,为龙蜥社区注入新动能

OpenAnolis小助手

开源 操作系统 云厂商 国产

DSTC10 赛道最佳论文揭晓!文心 PLATO 再获殊荣

百度开发者中心

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