配置OGG 如何批量修改源端及目标端序列值_满足客户变态需求学会这招你就赚了

欢迎您关注我的公众号【尚雷的驿站】
****************************************************************************
公众号:尚雷的驿站
CSDN :https://blog.csdn.net/shlei5580
墨天轮:https://www.modb.pro/u/2436
PGFans:https://www.pgfans.cn/user/home?userId=4159
****************************************************************************

一、背景描述

最近,我需要对一套 Oracle 11g 数据库进行迁移。这次迁移不是将源库的所有表数据同步至目标库,而是只需要迁移部分表的数据。

此外,业务要求迁移过程中不能停机,并确保迁移前后的数据一致性,以便在失败时能够回退。因此,我采用了 Oracle GoldenGate (OGG) 来同步数据,并进行了双向同步的配置(关于双向同步的详细内容将在后续进行补充)。

不仅如此,更为苛刻的要求是源端和目标端的序列必须满足以下需求:

  1. 调整新库的序列和步长,并记录当前操作时间:
  • 确保新库的序列号尾数为偶数
  • 将所有序列的步长调整为2
  • 导出调整后的序列信息,以确认调整是否成功
  1. 确认新库的正常执行后,调整旧库的序列和步长,并记录当前操作时间:
  • 确保旧库的序列号尾数为奇数
  • 将所有序列的步长调整为2
  • 导出调整后的序列信息,以确认调整是否成功
    尽管这些要求有些过分,但客户坚持这样要求。虽然这个数据库平时的业务量不大,但是迁移过程中不允许停机,必须实时同步数据,同时源端和目标端必须保持连接,还要保证应用程序可以花费相当长的时间来调整数据源。

通过以上序列的修改,我保证了当应用程序同时连接源端和目标端,并对数据进行修改时,不会因为序列问题导致数据冲突,从而影响了 OGG 的同步过程。因此,我费尽九牛二虎之力,最终编写了一个 PL/SQL 脚本,批量修改了源端和目标端的序列值,以使两端都能满足业务需求。

二、PL/SQL脚本

要分别在源端和目标端执行如下pl/sql脚本:

2.1 源端pl/sql

源端执行如下pl/sql脚本

sqlplus / as sysdba
-- 然后执行如下脚本
SET SERVEROUTPUT ON
DECLARECURSOR c_sequences ISSELECT sequence_owner,sequence_name,increment_by,last_numberFROM dba_sequencesWHERE sequence_owner in ('XXX','XXX') AND (increment_by <> 2 or MOD(last_number, 2) != 1);
BEGINFOR r_sequence IN c_sequences LOOPDECLAREcurrent_val NUMBER;BEGINEXECUTE IMMEDIATE 'ALTER SEQUENCE ' || r_sequence.sequence_owner||'.'||r_sequence.sequence_name || ' INCREMENT BY 1 NOCACHE';EXECUTE IMMEDIATE 'SELECT ' || r_sequence.sequence_owner||'.'||r_sequence.sequence_name || '.NEXTVAL FROM DUAL' into current_val;EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || r_sequence.sequence_owner||'.'||r_sequence.sequence_name || ' INCREMENT BY 2 CACHE 20';DBMS_OUTPUT.PUT_LINE(r_sequence.sequence_name);END;END LOOP; DBMS_OUTPUT.PUT_LINE('序列修改完成');
END;
/

2.2 目标端pl/sql

目标端执行如下pl/sql脚本

sqlplus / as sysdba
-- 然后执行如下脚本
SET SERVEROUTPUT ON
DECLARECURSOR c_sequences ISSELECT sequence_owner,sequence_name,increment_by,last_numberFROM dba_sequencesWHERE sequence_owner in ('XXX','XXX') AND (increment_by <> 2 or MOD(last_number, 2) != 0);
BEGINFOR r_sequence IN c_sequences LOOPDECLAREcurrent_val NUMBER;BEGINEXECUTE IMMEDIATE 'ALTER SEQUENCE ' || r_sequence.sequence_owner||'.'||r_sequence.sequence_name || ' INCREMENT BY 1 NOCACHE';EXECUTE IMMEDIATE 'SELECT ' || r_sequence.sequence_owner||'.'||r_sequence.sequence_name || '.NEXTVAL FROM DUAL' into current_val;EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || r_sequence.sequence_owner||'.'||r_sequence.sequence_name || ' INCREMENT BY 2 CACHE 20';DBMS_OUTPUT.PUT_LINE(r_sequence.sequence_name);END;END LOOP; DBMS_OUTPUT.PUT_LINE('序列修改完成');
END;
/

2.3 比对序列

可通过用在源端和目标端创建一个dblink,通过dblink来比对源端和目标端的序列值。
脚本如下:

conn xxx/xxx
WITH source_seq AS (SELECT sequence_name, last_number, increment_byFROM all_sequencesWHERE sequence_owner in ('XXX','XXX')
),
target_seq AS (SELECT sequence_name, last_number, increment_byFROM all_sequences@XXX.XXXWHERE sequence_owner in ('XXX','XXX')
)
SELECT 'SOURCE' AS seq_type, sequence_name, last_number, increment_by
FROM source_seq
UNION ALL
SELECT 'TARGET' AS seq_type, sequence_name, last_number, increment_by
FROM target_seq;

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

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

相关文章

WanAndroid(鸿蒙版)开发的第三篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

2024年3月GESP认证Scratch图形化编程四级真题及答案

GESP 图形化四级试卷 &#xff08;满分&#xff1a;100 分 考试时间&#xff1a;120 分钟&#xff09; 学校&#xff1a; 姓名&#xff1a; ​ 一、单选题&#xff08;共 10 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 题号 1 2 3 4 5 6 7 8 9 10 11 1…

【开源】SpringBoot框架开发学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

数字化转型导师坚鹏:人工智能在金融机构数字化转型中的应用

人工智能在金融机构数字化转型中的应用 课程背景&#xff1a; 金融机构数字化转型离不开人工智能&#xff0c;在金融机构数字化转型中&#xff0c;人工智能起到至关重要的作用&#xff0c;很多机构存在以下问题&#xff1a; 不清楚人工智能产业对我们有什么影响&#xff1f;…

考研数学|概率应该怎么学?

考研概率论老师很多&#xff0c;但是我最推荐两个老师&#xff0c;李良和方浩 我认为李良概率论基础讲解相比于其他老师最大的优点就是&#xff0c;每一步都会耐心解释其中的逻辑。很少会像方浩老师那样过于跳跃或者频繁串联&#xff0c;这点对于零基础思维转换慢的人来说&…

Transformer self-attention源码及原理理解

自注意力计算公式&#xff1a; 在公式(1)中Q(query)是输入一个序列中的一个token&#xff0c;K(key)代表序列中所有token的特征。 可以得到当前token与序列中其他token的相关性。在论文原文中512&#xff0c;表示每个token用512维特征表示&#xff08;序列符号的embedding长度…

C语言中大小写字母如何转化

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Linux TCP参数——tcp_adv_win_scale

文章目录 tcp_adv_win_scaleip-sysctl.txt解释buffering overhead内核缓存和应用缓存示例计算深入理解从2到1(tcp_adv_win_scale的值)总结 tcp_adv_win_scale adv-advise&#xff1b;win-window; 用于指示TCP中接收缓存比例的值。 static inline int tcp_win_from_space(int …

SpringSecurity(SpringBoot2.X版本实现)

资料来源于 SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权 侵权删 目录 介绍 快速开始 认证 认证流程 登录校验流程 SpringSecurity完整流程 认证流程详解 代码实现 准备工作 mysql mybatis-plus redis 统一返回类 核心代码 密码加密存…

Mesh网格obj文件构成解析

众所周知&#xff0c;Mesh网格是三维重建的常用手法&#xff0c;通过顶点-三角面的形式来完成对三维物体的表达。其中&#xff0c;最常见的Mesh网格文件格式就是obj格式。看起来复杂的三维形状其实在数值表示上是很简单的&#xff0c;大家跟我一起来做个小实验就好&#xff1a;…

echarts散点图自定义tooltip,鼠标放上去展示多行数据

先放效果图 如图&#xff0c;就是鼠标悬停在散点上&#xff08;这里的散点我替换成了图片&#xff0c;具体做法参考这篇文章&#xff1a;echarts散点图的散点用自定义图片替代-CSDN博客&#xff09;时&#xff0c;可以展示多行数据。之前查找资料的时候&#xff0c;很多用字符串…

练习unittest+Fixture实现

练习01 创建⼀个⽬录 case, 作⽤就是⽤来存放⽤例脚本,在这个⽬录中创建 5 个⽤例代码⽂件 , test_case1.py使⽤ TestLoader 去执⾏⽤例 将来的代码 ⽤例都是单独的⽬录中存放的 test_项⽬_模块_功能.py test_case1.py # 1. 导包 unittest import unittest # 2. 定义测试类, 只…

面试经典150题(114-118)

leetcode 150道题 计划花两个月时候刷完之未完成后转&#xff0c;今天完成了5道(114-118)150 gap 了一周&#xff0c;以后就不记录时间了。。 114.(70. 爬楼梯) 题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不…

旅行社旅游线路预定管理系统asp.net

旅行社旅游线路预定管理系统 首页 国内游 境外游 旅游景点 新闻资讯 酒店信息―留言板 后台管理 后台管理导航菜单系统管理修改密码留言管理注册会员管理基础数据设置国别设置有份设地区设置 旅行社管理友情链接管理添加友情链接友情链接管理新闻资讯管理添加新闻资讯新闻资讯管…

LayerNormalization 和 RMSNormalization的计算方法和区别

目录 问题来源 Layer Normalization 与 RMSNormalization 的详细计算方法 Layer Normalization&#xff08;层归一化&#xff09; RMSNormalization&#xff08;均方根归一化&#xff09; Layer Normalization与RMSNormalization的异同 Layer Normalization RMSNormaliza…

24 OpenCV直方图反向投影

文章目录 参考反向投影作用calceackProject 反向投影mixchannels 通道图像分割示例 参考 直方图反向投影 反向投影 反向投影是反映直方图模型在目标图像中的分布情况简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型 作用…

基于时空上下文(STC)的运动目标跟踪算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

Midjourney 和 Dall-E 的优劣势比较

Midjourney 和 Dall-E 的优劣势比较 Midjourney 和 Dall-E 都是强大的 AI 绘画工具&#xff0c;可以根据文本描述生成图像。 它们都使用深度学习模型来理解文本并将其转换为图像。 但是&#xff0c;它们在功能、可用性和成本方面存在一些差异。 Midjourney 优势: 可以生成更…

js判断对象是否有某个属性

前端判断后端接口是否返回某个字段的时候 <script>var obj { name: "John", age: 30 };console.log(obj.hasOwnProperty("name")); // 输出 trueconsole.log(obj.hasOwnProperty("email")); // 输出 falselet obj11 { name: "Joh…

9. 编程常见错误归类

编程常见错误归类 9.1 编译型错误9.2 链接型错误9.3 运行时错误 9.1 编译型错误 编译型错误⼀般都是语法错误&#xff0c;这类错误⼀般看错误信息就能找到⼀些蛛丝马迹的&#xff0c;双击错误信息也能初步的跳转到代码错误的地方或者附近。编译错误&#xff0c;随着语言的熟练…