OceanBase 中的ROWID与Oracle的差异与如何迁移

1. ROWID

1.1 OB和Oracle中rowid的区别

正如大家所知道的,OceanBase兼容Oracle的rowid特性,但在其生成规则上却存在不同,具体表现如下:

OceanBase

● 定义:OceanBase(简称 OB)的rowid是通过主键(包括隐藏主键)直接经过base64编码计算得出的,因此一旦主键发生变动,相应的rowid也会随之改变。关于主键的生成规则,具体如下:

   ○有主键非分区表,用户定义的主键

   ○有主键分区表,用户定义的主键

   ○无主键非分区表,内部生成sequence作为隐藏主键

   ○无主键分区表,分区键+sequence作为隐藏主键

●长度:17个字符。

Oracle

●定义:该值表明了该行在oracle数据库中的物理具体位置。保存rowid需要10个字节或者是80个位二进制位。这80个二进制位分别是:

   ○1. 数据对象编号,表明此行所属的数据库对象的编号,每个数据对象在数据库建立的时候都被唯一分配一个编号,并且此编号唯一。数据对象编号占用大约32位。

   ○2. 对应文件编号,表明该行所在文件的编号,表空间的每一个文件标号都是唯一的。文件编号所占用的位置是10位。

   ○3. 块编号,表明改行所在文件的块的位置块编号需要22位。

   ○4. 行编号,表明该行在行目录中的具体位置行编号需要16位。

●长度:rowid需要 10个字节的存储空间,并用18个字符来显示。

1.2 用户业务场景和迁移方案

业务场景

●表A:存储业务单据信息,数据量较大;

●表B:A表关联表,表中有一列存放B表的rowid值;

●业务场景需要经常通过B表去A表关联取数,为了优化取数性能直接通过rowid关联。

迁移方案

由于迁移后OB rowid长度和Oracle不一致,且定义完全不同,列数据迁移过去会失去原有意义成为垃圾数据。具体改造方案如下:

  1.表结构调整:删除rowid类型列,数据也不做迁移;

  2.性能调优:创建合适索引,通过其他字段关联查询。由于业务侧预留了业务主键可以关联,实测性能满足客户需求。

1.3 Oracle rowid发生变化的场景

由于OMS迁移过程中全量和增量迁移都和源端oracle的rowid密切关联(无论有主键表还是无主键表),所以我们需要密切关注Oracle源端的rowid变化场景,迁移过程中都要避免。Oracle rowid发生变化的场景如下:

○1. Oracle 行迁移

○2. 另外一些不急于rowmovement会导致rowid修改的动作,比如move和逻辑导出再导入

Oracle 行迁移(row movement)场景

●行迁移 ( Row movement): 默认情况下,oracle数据块中的一行其生命周期内是不会发生移动的,即块的rowid不会发生改变。但是在某些情景下,我们希望行的rowid可以发生变化,这时候我们就需要启动表的row movement特性。

-- 启用row movement特性
Alter table table_name enable row movement;
(1)分区表

当我们允许分区表的分区键是可更新的时候,如果分区键的更新导致当前修改的数据条目需要移动到其他分区,此时就会发生rowid的改变。

create table test_rowid(id number,test_value varchar2(10))
partition by list(test_value)(
partition p1 values('1'),
partition p2 values('2'),
partition p3 values('3'));

insert into test_rowid values(1,'1');
insert into test_rowid values(2,'2');
insert into test_rowid values(3,'3');
insert into test_rowid values(4,'1');
commit;

select rowid,id,test_value from test_rowid ;
/*ROWID	ID	TEST_VALUE
AAAefAAAHAADJMWAAA	1	1
AAAefAAAHAADJMWAAB	4	1
AAAefBAAHAADJcWAAA	2	2
AAAefCAAHAADJsWAAA	3	3 */
 
update test_rowid set test_value=2 where id=4;
-- ORA-14402: updating partition key column would cause a partition change
 
alter table test_rowid enable row movement;
 
update test_rowid set test_value=2 where id=4;
-- 1 row updated.

select rowid,id,test_value from test_rowid ;
/*ROWID	ID	TEST_VALUE
AAAefAAAHAADJMWAAA	1	1
AAAefBAAHAADJcWAAA	2	2
AAAefBAAHAADJcWAAB	4	2
AAAefCAAHAADJsWAAA	3	3 */
id=4的列rowid发生变化。
(2)闪回操作

在闪回操作时,我们同样需要开启表的row movement特性。

alter table test_rowid disable row movement;
-- Table altered.
 
SQL> select current_scn from v$database;
-- 38719199
 
select rowid,id,test_value from test_rowid where test_value=1;
/* ROWID	ID	TEST_VALUE
AAAefAAAHAADJMWAAA	1	1 */ 

delete from test_rowid where test_value=1;
commit;
 
flashback table test_rowid to scn 38719199;
-- ORA-08189: cannot flashback the table because row movement is not enabled

alter table test_rowid enable row movement;
-- Table altered.
 
flashback table test_rowid to scn 38719199;
-- Flashback complete.
 
select rowid,id,test_value from test_rowid where test_value=1;
/* ROWID	ID	TEST_VALUE
AAAefAAAHAADJMWAAC	1	1 */

flashback table原理:oracle flashback table 是通过临时表来实现的。

create table hh(id number);
insert into hh values(1);
commit;
 
alter table hh enable row movement;
select current_scn from v$database;
--  1635103

update hh set id = 2;
commit; 
 
alter session set tracefile_identifier = 'ee';
alter session set sql_trace=true;
flashback table hh to scn 1635103;
-- Flashback complete.
 

通过查看trace文件,我们可以发现oracle  flashback table 是通过一个临时表sys_temp_fbt来实现的。
trace文件中的部分内容如下:
********************************************************************************
sqlid='dtjmzuugu6ktw'
INSERT /*+ APPEND */ into SYS_TEMP_FBT SELECT /*+ FBTSCAN FULL(S) PARALLEL(S, DEFAULT) */ :1, :2, :3, rowid, SYS_FBT_INSDEL FROM "APPTEST"."HH" as of SCN :4 S
********************************************************************************
sqlid='bytpvbcb8zbb6'
/* Flashback Table */ DELETE /*+ BYPASS_UJVC */ FROM (SELECT /*+ ORDERED USE_NL(S) PARALLEL(S,DEFAULT) PARALLEL(T,DEFAULT) */ S.rowid FROM SYS_TEMP_FBT T, "APPTEST"."HH" S WHERE T.rid = S.rowid and T.action = 'D' and T.object#  = : 1) V
********************************************************************************
sqlid='a3h5cbfc5b6xv'
/* Flashback Table */ INSERT /*+ PARALLEL(S, DEFAULT) PARALLEL(T, DEFAULT) */ INTO "APPTEST"."HH" SELECT /*+ USE_NL(S) ORDERED PARALLEL(S, DEFAULT) PARALLEL(T, DEFAULT) */ S.* FROM SYS_TEMP_FBT T , "APPTEST"."HH" as of SCN :1 S WHERE T.rid = S.rowid and T.action = 'I' and T.object# = :2 
 
由此可见,oracle是通过SYS_TEMP_FBT进行删除操作,而后进行插入操作,
因此行的rowid有可能发生改变。
 SQL> select * from sys_temp_fbt ;
SCHEMA     OBJECT_NAME             OBJECT# RID                            A
---------- -------------------- ---------- ------------------------------ -
hh       hh                      76906 AAASxqAAGAAAAC0AAA             D
hh       hh                      76906 AAASxqAAGAAAAC0AAA             I


SQL> select tname,tabtype from tab;
TNAME                    TABTYPE
------------------------------ -------
HH                     TABLE
SYS_TEMP_FBT       TABLE

drop表Oracle有另外的回收站技术恢复,不需要开ROW MOVEMENT

SQL> ALTER TABLE test_rowid DISABLE ROW MOVEMENT;  
Table altered.  
SQL> DROP TABLE test_rowid;  
Table dropped.  
SQL> FLASHBACK TABLE test_rowid TO BEFORE DROP;  
Flashback complete.  
没错,因为drop表Oracle有另外的回收站技术恢复过来,而删除几行记录是不能 直接通过回收站恢复的。
(3)回收空间

在收缩空间时,也会造成行的移动

SQL> alter table hh disable row movement;
Table altered.
 
SQL> alter table hh shrink space;
alter table hh shrink space
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled
 
SQL> alter table hh enable row movement;
Table altered.
 
SQL> alter table hh shrink space;
Table altered.
 
Shrink space操作(without  compact)也会导致所有已经打开的游标失效,因此需要谨慎使用!

1.4 OB rowid变化场景:

对于源端是OB的情况,OMS迁移并不会依赖rowid,通过前面的介绍也可以看到OB rowid的变化是很频繁的,主要变化场景如下:

●有主键非分区表,主键发生变化,rowid变化

●有主键分区表,因为分区键包含在主键内,所以同上

●无主键非分区表,对于一行记录rowid不会变化。

●无主键分区表,分区键发生变化时,rowid变化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web前端一套全部清晰 ⑥ day4 CSS.2 复合选择器、CSS特性、背景属性、标签的显示模式

别人的议论,那是别人的,你的人生,才是你的 —— 24.5.7 一、复合选择器 定义:由两个或多个基础选择器,通过不同的方式组合而成 作用:更准确、更高效的选择目标元素(标签) 1.后代选择…

Unity 性能优化之LOD技术(十)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 LOD技术效果一、LOD技术是什么?二、LODGroup组件介绍三、LODGroup组件使用步骤添加组件添加模型 四、Project Settings中与LOD组件相关参数总结 L…

pytest(二):关于pytest自动化脚本编写中,初始化方式setup_class与fixture的对比

一、自动化脚本实例对比 下面是一条用例,使用pytest框架,放在一个类中,两种实现方式: 1.1 setup_class初始化方式 1. 优点: 代码结构清晰,setup_class 和 teardown_class 看起来像传统的类级别的 setup 和 teardown 方法。2. 缺点: 使用 autouse=True 的 fixture 作为…

free5gc+ueransim操作

启动free5gc容器 cd ~/free5gc-compose docker-compose up -d 记录虚拟网卡地址,eth0 ifconfig 查看并记录amf网元的ip地址 sudo docker inspect amf "IPAddress"那一行,后面记录的即是amf的ip地址 记录上述两个ip地址,完成UER…

MCU通过UART/SPI等接口更新flash的方法

MCU可提供一种方便的方式来更新flash内容以进行错误修复bugfix或产品更新update。可以使用以下任何模式更新flash内容: •系统内编程(ISP,In-System Programming):用于使用内部bootloader程序和UART/SPI对片上闪存进行编程program或重新编程reprogram。 •应用程序内编程…

一毛钱不到的FH8208C单节锂离子和锂聚合物电池一体保护芯片

前言 目前市场上电池保护板,多为分体方案,多数场合使用没有问题,部分场合对空间有进一步要求,或者你不想用那么多器件,想精简一些,那么这个芯片就很合适,对于充电电池来说,应在使用…

AI论文速读 |2024[IJCAI]TrajCL: 稳健轨迹表示:通过因果学习隔离环境混杂因素

题目: Towards Robust Trajectory Representations: Isolating Environmental Confounders with Causal Learning 作者:Kang Luo, Yuanshao Zhu, Wei Chen, Kun Wang(王琨), Zhengyang Zhou(周正阳), Sijie Ruan(阮思捷), Yuxuan Liang(梁宇轩) 机构&a…

AI数据中心网络技术选型,InfiniBand与RoCE对比分析

InfiniBand与RoCE对比分析:AI数据中心网络选择指南 随着 AI 技术的蓬勃发展,其对数据中心网络的要求也日益严苛。低延迟、高吞吐量的网络对于处理复杂的数据密集型工作负载至关重要。本文分析了 InfiniBand 和 RoCE 两种数据中心网络技术,帮助…

91、动态规划-不同的路径

思路: 首先我们可以使用暴力递归解法,无非就是每次向下或者向右看看是否有解法,代码如下: public class Solution {public int uniquePaths(int m, int n) {return findPaths(0, 0, m, n);}private int findPaths(int i, int j,…

数据结构-线性表-应用题-2.2-12

1)算法的基本设计思想:依次扫描数组的每一个元素,将第一个遇到的整数num保存到c中,count记为1,若遇到的下一个整数还是等于num,count,否则count--,当计数减到0时,将遇到的下一个整数保存到c中,计…

04.2.配置应用集

配置应用集 应用集的意思就是:将多个监控项添加到一个应用集里面便于管理。 创建应用集 填写名称并添加 在监控项里面找到对应的自定义监控项更新到应用集里面 选择对应的监控项于应用集

[疑难杂症2024-004] 通过docker inspect解决celery多进程记录日志莫名报错的记录

本文由Markdown语法编辑器编辑完成. 写作时长: 2024.05.07 ~ 文章字数: 1868 1. 前言 最近我负责的一个服务,在医院的服务器上线一段时间后,利用docker logs查看容器的运行日志时,发现会有一个"莫名其妙"的报错&…

Verilog中4bit超前进位加法器

4bit超前进位加法器的逻辑表达式如下: 中间变量GiAiBi,PiAi⊕BiGi​Ai​Bi​,Pi​Ai​⊕Bi​ 和:SiPi⊕Ci−1Si​Pi​⊕Ci−1​,进位:CiGiPiCi−1Ci​Gi​Pi​Ci−1​ 用Verilog语言采用门级描述方式&am…

Buuctf-Misc题目练习

打开后是一个gif动图,可以使用stegsolve工具进行逐帧看。 File Format:文件格式 Data Extract:数据提取 Steregram Solve:立体试图 可以左右控制偏移 Frame Browser:帧浏览器 Image Combiner:拼图,图片拼接 所以可以知道我们要选这个Frame Browser …

odoo实施之创建行业demo

创建数据库,添加公司数据 选择应用,获取15天免费试用 创建完成 设置客户公司logo 创建用户 更改用户语言 前置条件:配置邮件 开发模式下,额外信息 加载demo数据

微信小程序 手机号授权登录

手机号授权登录 效果展示 这里面用的是 uni-app 官方的登录 他支持多端发布 https://zh.uniapp.dcloud.io/api/plugins/login.html#loginhttps://zh.uniapp.dcloud.io/api/plugins/login.html#login 下面是代码 <template><!-- 授权按钮 --><button v-if&quo…

微软 AI 研究团队推出 SIGMA:一个开源研究平台,旨在推动混合现实与人工智能交叉领域的研究与创新

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

如何永久删除服务和相关文件夹

如何永久删除服务和文件夹&#xff1f; How can I remove the service and folder permanently? 以AlibabaProtect服务为例 takeown /f "C:\Program Files (x86)\AlibabaProtect sc delete AlibabaProtect我运行了上述操作&#xff0c;并通过任务管理器杀死了“阿里巴巴…

AI时代的就业转型与个人发展

AI时代的就业转型与个人发展&#xff1a;机遇与挑战并存 AI出现的背景&#xff1a;技术革命的浪潮 随着21世纪信息技术的突飞猛进&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;作为一场技术革命的产物&#xff0c;正逐渐从科幻小说走向现实世界的…

linux的信号量的使用

1.信号量 在多线程情况下&#xff0c;线程要进入关键代码就得获取信号量&#xff08;钥匙&#xff09;{sem_init(&sem, 0, 0);}&#xff0c;没有信号量的情况下就一直等待sem_wait(&sem)&#xff0c;只到别人把钥匙&#xff08;sem_post(&sem)&#xff09;给你。 …