Oracle索引组织表与大对象平滑迁移至OceanBase的实施方案

作者简介:严军(花名吉远),十年以上专注于数据库存储领域,精通Oracle、Mysql、OceanBase,对大数据、分布式、高并发、高性能、高可用有丰富的经验。主导过蚂蚁集团核心系统数据库升级,数据库LDC单元化多活项目,常年负责蚂蚁重大数据库活动(如双11、双12、春节红包大促),现任阿里云数据库架构师和云计算专家,专注于金融行业数据库架构设计和咨询工作。

因最近笔者在协助金融客户完成系统的平滑迁移与升级工作。随着迁移系统数量的不断增加,发现客户对Oracle的使用的复杂度和深度都相当高。因此,本文列举了Oracle的索引组织表、大对象的特性,以及迁移到OceanBase(简称OB)的相应方案,以供参考。希望能对大家有所帮助。

1、索引组织表(Index-Organized Table, IOT)

1.1 索引组织表介绍

   索引组织表是一类特殊的表,它将索引和表的数据存储在一起(或者说实际上将所有数据都放入了索引中)。普通表的数据以无序(Heap)的方式存放在数据库中。而索引组织表按照主键进行排序,以二叉树的形式对表的数据进行存储。

●索引组织表不存储ROWID,它通过主键来访问数据。

●索引组织表适合通过主键对数据进行访问的应用。

优点

1.快速的随机访问。索引和表的数据存储在一起,如果对表进行更新,Oracle只更新索引结构。

2.快速的范围扫描。索引组织表已经按照主键对数据进行排序,因此,范围扫描的速度是很快的。

3.更少的存储需求。索引数据和表的数据存储在一起,可以减少存储需求。普通的索引条目只包含索引值和指向数据行的ROWID

组成

1.索引部分。存放主键值,频繁访问的部分非主键值,指向溢出区的ROWID

2.溢出部分。用于存放非主键值。溢出区存放在一个溢出表空间中。用户可以指定溢出表空间。

1.2 问题业务场景

客户反馈OMS迁移时部分SYS_IOT开头的表迁移出现报错,原来以为是系统表,但核对时发现通过 user_objects查询能查到这个表。

最后确定这类表其实都是索引组织表的子表,且子表不支持任何操作。复现脚本如下:

-- 创建IOT时,必须要设定主键,否则报错。
CREATE TABLE TEST_IOT
(id NUMBER PRIMARY KEY,
C1 VARCHAR2(50),
C2 VARCHAR2(10))
ORGANIZATION INDEX PCTTHRESHOLD  10 OVERFLOW;select object_name,object_type from user_objects where object_name like '%IOT%';
/* 
SYS_IOT_OVER_96983	TABLE
SYS_IOT_TOP_96983	INDEX
TEST_IOT	TABLE 
*/-- 只需要对父表进行赋权和获取DDL操作,子表不支持任何操作。
grant select on SYS_IOT_OVER_96983 to scott;
-- ORA-25191: cannot reference overflow table of an index-organized table
select dbms_metadata.get_ddl('TABLE','SYS_IOT_OVER_96983','APPTEST') from dual;
/* ORA-31603: object "SYS_IOT_OVER_96983" of type TABLE not found in schema "APPTEST"
ORA-06512: at "SYS.DBMS_METADATA", line 6478
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 6465
ORA-06512: at "SYS.DBMS_METADATA", line 9202
ORA-06512: at line 1
*/--  查询父子表对应关系
select TABLE_NAME,IOT_NAME from dba_tables where owner='APPTEST';
TEST_IOT	
SYS_IOT_OVER_96983	TEST_IOT

1.3 迁移方案

●表结构迁移:通过dbcat进行结构迁移,索引组织表会被转换成普通表(后续OMS会支持);

●数据迁移:由于Logminer捕获不到增量日志,这类表只能离线迁移。离线迁移方案建议:

   ○主键单字段场景:OMS效率尚可,也可以使用dataX或者导出CSV文件后导入OB的方式;

   ○主键多字段场景:不建议使用OMS,建议datax或者导出方式。

2. 大对象(LOB类型)

2.1 大对象介绍

Oracle

Oracle包含4种大对象类型BLOB、CLOB、NCLOB、BFILE,存储长度都为4G。具体如下:

●CLOB:内部字符大对象,存储单字节和多字节字符数据。支持固定宽度和可变宽度的字符集,常用于大文本的存储。

●NCLOB:国家语言字符集大对象,存储UNICODE类型的数据,支持固定宽度和可变宽度的字符集。

●BLOB:内部二进制大对象,存储非结构化的二进制数据大对象,它可以被认为是没有字符集语义的比特流,一般是图像、声音、视频等文件。

●BFILE:外部二进制文件,存储在数据库外的系统文件,只读的,数据库会将该文件当二进制文件处理。

OB

LOB 全称为大对象数据类型(Large Object),包括 BLOB 和 CLOB,用来存储大型和非结构化数据,例如文本、图像、视频和空间数据等。本文主要提供 OceanBase 数据库当前版本所支持的大对象数据类型的概览和使用限制。

大对象数据类型概览

OceanBase 数据库当前版本所支持的大对象数据类型的信息如下表所示。

类型长度定义长度上限(字符)字符集
BLOB变长48 MBBINARY
CLOB变长48 MB与租户的字符集一致

说明:与 Oracle 通过 LOB Locator 引用数据不同,在 OceanBase 数据库中,LOB Locator 与数据保存在同一结构中。

2.2 迁移方案

●BLOB/CLOB:确定在OB支持的最大长度范围内,平迁。超出最大范围需要业务改造;

●NCLOB:OB不支持 nclob,OMS在迁移中会将字段类型转成 nvarchar2 。注意nvarchar2 上限为 32767 个字节;

●BFILE:建议在Oracle中使用代码转成BLOB后迁移,案例如下:

-- BFile实际上是Oracle数据库指向操作系统文件的一个指针。
-- 读取操作系统文件并转为BLOB代码:-- 创建测试文件
touch /home/oracle/test.jpg
-- 创建directory对象
create directory obtest as '/home/oracle/xxx';
grant read on directory obtest to <username>;
create table obfiletest(col1 bfile,cole2 blob);
INSERT INTO obfiletest(col1) VALUES (BFILENAME ('obtest', 'test.jpg'));-- BFILE转BLOB
Declarev_bfile Bfile;v_blob  Blob;v_dest  Number := 1;v_lang  Number := 1;
Beginv_bfile := bfilename('OBTEST', 'test.jpg');--dbms_output.put_line(v_bfile);dbms_lob.createtemporary(v_blob, True);dbms_lob.fileopen(v_bfile, dbms_lob.file_readonly);dbms_output.put_line(dbms_lob.getlength(v_bfile));dbms_lob.loadblobfromfile(dest_lob => v_blob, src_bfile => v_bfile,amount => dbms_lob.getlength(v_bfile),dest_offset => v_dest, src_offset => v_lang);Update obfiletest Set cole2 = v_blob;dbms_lob.fileclose(file_loc => v_bfile);
End;
/

2.3 关于CLOB字段的UNIQUE INDEX

●在创建CLOB字段的同时,Oracle会自动创建一个UNIQUE INDEX;OB支持CLOB字段类型,但不会自动创建UNIQUE INDEX(手工创建会报错)

●方案:OB不支持该index,直迁数据即可(OMS迁移会忽略)。在做对象校验时需要忽略这类index。

create table test001 (uinfo clob
);
insert into test001 values ('
{"employees":[{"firstName":"Bill","lastName":"Gates","creation_time":"2021-01-01","age":"30"},{"firstName":"George","lastName":"Bush","creation_time":"2021-06-01","age":"26"},{"firstName":"Thomas","lastName":"Carter","creation_time":"2020-03-01","age":"23"}]
}           
');
commit;select * from dba_indexes where table_name='TEST001';SELECT INDEX_NAME,TABLE_NAME,TABLE_OWNER,DBMS_METADATA.get_ddl('INDEX',INDEX_NAME,'APPTEST') INDEX_DDLFROM user_indexes --当前用户下的索引WHERE table_name = 'TEST001';-- 对应DDLCREATE UNIQUE INDEX "APPTEST"."SYS_IL0000101865C00001$$" ON "APPTEST"."TEST001" (PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)TABLESPACE "USERS" PARALLEL (DEGREE 0 INSTANCES 0) 

1699495940

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

连锁企业如何通过OceanBase解决数据库瓶颈

本文来自OceanBase客户&#xff0c;重庆三十七度健康管理有限公司的技术负责人Rinvay的分享 背景 足疗养生对于大家来说应该并不陌生&#xff0c;自古以来便有多部古籍记载。尽管现代生活中&#xff0c;人们可能不再严格遵循节气进行泡脚&#xff0c;但在忙碌的工作间隙&#…

C语言例题31:在屏幕上显示一个菱形

题目要求&#xff1a;在屏幕上显示一个菱形 #include <stdio.h>void main() {int i, j;int x;printf("输入菱形行数(3以上的奇数&#xff09;&#xff1a;");scanf("%d", &x);//显示菱形上面的大三角形for (i 1; i < (x 1) / 2; i) {for (…

缓解程序员工作压力:保持高效创新的方法与经验分享

文章目录 每日一句正能量前言工作与休息的平衡心理健康与自我关怀社交与网络建设后记 每日一句正能量 不要抱怨你的伴侣丑&#xff0c;不要抱怨你没有一个好爸爸&#xff0c;不要抱怨你的工作差&#xff0c;不要抱怨没人赏识你。现实有太多的不如意&#xff0c;就算生活 给你的…

【ARM CoreLink 系列 4.2 -- NI-700 Function units 详细介绍】

上篇文章:【ARM CoreLink 系列 4.1 – NI-700 interconnect hub 控制器详细介绍】 文章目录 ASNI 介绍AMNI 介绍HSNI 介绍HMNI 介绍AHB请求者接口AHB镜像完成者接口PMNI 介绍PCDC 介绍Routers 介绍SERDES 介绍PMU 介绍ASNI 介绍 CoreLink NI-700的ASNI(

汇川AM400PLC编码器转速测量功能块(M法测速)

M法测速的原理和相关代码,大家可以参考相关专栏文章,常用链接如下: 1、编码器M法测速仿真 编码器M法测速仿真(Simulink)_mt法测速 simulink-CSDN博客文章浏览阅读2k次。编码器M法和T法测速的详细讲解可以参看下面的文章链接,这里不再赘述,这里主要介绍Simulink里建模仿真…

python程序设计语言超详细知识总结

Python 首先 python 并不是简单&#xff0c;什么语言都有基础和高级之分&#xff0c;要想掌握一门语言&#xff0c;必须把高级部分掌握才行。 HelloWorld helloWorld.py print(hello, world)数据类型与变量 变量的数据类型数据类型描述变量的定义方式整数型 (int)整数&…

吴恩达2022机器学习专项课程(一)8.1 过拟合

目录 什么是过拟合&#xff1f;如何解决过拟合&#xff1f;什么是泛化&#xff1f;它跟过拟合有什么关系&#xff1f;过拟合案例线性回归线性回归的欠拟合线性回归较好的拟合线性回归的过拟合 逻辑回归逻辑回归的欠拟合逻辑回归的较好的拟合逻辑回归的过拟合 总结 什么是过拟合…

Prometheus+Grafana多方位监控

PrometheusGrafana多方位监控 契机 ⚙ 最近发现火山引擎有托管的Prometheus,可是当前是邀测阶段。并且发现火山云的ECS是自带开机自启的exporter的。刚好需要搭建一套服务器监控&#xff0c;所以研究了一套Prometheus监控&#xff0c;包含linux主机监控nginx监控es监控rabbitM…

数据库(MySQL)—— 数据类型

数据库&#xff08;MySQL&#xff09;—— 数据类型 MySQL中的数据类型数值类型字符串类型时间戳类型 一个实例 我们今天来看MySQL中的数据类型&#xff1a; MySQL中的数据类型 MySQL中的数据类型有很多&#xff0c;主要分为三类&#xff1a;数值类型、字符串类型、日期时间类…

Linux的学习之路:21、线程(1)

摘要&#xff1a; 本章说一下线程 目录 摘要&#xff1a; 一、回忆一下 二、如何理解线程 三、命令行看线程 四、利用函数进行使用 五、本章总结 1、线程的优点 2、线程的缺点 3、线程的异常 4、线程的用途 一、回忆一下 1、exe就是一个文件 2、我们的可执行程序…

监控摄像机如何选购?

在选购监控摄像机时&#xff0c;需了解其基本知识&#xff0c;如分辨率、帧率、存储方式等。根据需求选择合适的产品&#xff0c;关注夜视功能、品牌和售后服务。预算和性价比同样重要。这样才能选到实用又安全的监控摄像机&#xff0c;提高生活品质。摘要由作者通过智能技术生…

JavaScript(四)

一、JavaScript变量 在 JavaScript 中&#xff0c;你可以使用几种不同的方式来声明变量。以下是主要的几种方式&#xff1a; 使用 var 关键字&#xff1a; 在 ES5 (ECMAScript 5) 及之前的版本中&#xff0c;var 是最常用的声明变量的方式。但是&#xff0c;var 有一个问题&am…

Scott Brinker:16年后,当前的(而非未来的)Martech已经出现,但分布不均。

杜克大学、德勤和美国营销协会共同开展的名为「CMO调查」 的两年一度的项目&#xff0c;是营销行业内的一项重要研究项目&#xff0c;已经持续了十多年。该调查的组织工作做得非常好&#xff0c;每次发布我都迫不及待地想要阅读。 我特别兴奋地阅读了刚刚发布的2024年春季版&a…

Elasticsearch内存占用分析

目录 1. 堆内存 (Heap Memory) 2. 索引缓存 (Index Cache) 3. 段缓存 (Segment Cache) 4. 文件系统缓存 (File System Cache) 5. 分片和副本 (Shards and Replicas) 6. 分析器和令牌器 (Analyzers and Tokenizers) 7. 过度配置 (Over-Allocation) 8. 垃圾回收 (Garbage…

MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解

目录 前言语法示例代码运用 前言 mysql中内置函数date_add 和 date_sub能对指定的时间进行增加或减少一个指定的时间间隔&#xff0c;返回的是一个日期。 语法 添加时间间隔 DATE_ADD(date,INTERVAL expr type)SELECT DATE_add(NOW(),INTERVAL -7 DAY);//获取7天前的日期 S…

java基础郎波版chapter4习题

文章目录 1.试说明Java语言是如何支持多重继承的。2.类的构造方法和成员方法之间有什么区别?构造方法&#xff1a;成员方法&#xff1a; 3.编写程序片段,定义表示课程的类Course。4.编写程序创建习题3中的Course类的对象,设置并打印输出该对象的课程名、编号以及先修课号。5.J…

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些&#xff0c;然后再动手操作 用Python写了一个简单数组类&#xff0c;首先思考下都写哪些功能&#xff1a; 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

ffplay支持mac/iOS硬解码实践

1. ffmpeg编译开启videotoolbox的支持。 ./configure --enable-videotoolbox --enable-hwaccels 2. stream_component_open方法中开启硬件解码器。 int FSPlay::stream_component_open(VideoState *is, int stream_index) {//...codec avcodec_find_decoder(avctx->code…

Python自学篇3-PyCharm开发工具下载、安装及应用

一、Python开发工具 自学篇1中讲到了安装Python之后出现的几个应用程序&#xff0c;其中IDLE、Python.exe都可以用来编写python程序&#xff0c;也可以进行调试&#xff1b;但是比较基础&#xff0c;比较原始&#xff0c;调试不方便&#xff0c;界面也不友好&#xff0c;需要更…

Unity List底层源码剖析

文章目录 前言一、List源码二、Add接口三、Remove接口四、Insert接口五、其他接口1、[]接口2、Clear接口3、Contains接口4、ToArray接口5、Find接口6、Enumerator接口7、Sort接口 六、线程安全总结 前言 没有扎实的基础&#xff0c;很多编写的程序会随着软件规模的扩大或扩展而…