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

本文主要是介绍配置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;

这篇关于配置OGG 如何批量修改源端及目标端序列值_满足客户变态需求学会这招你就赚了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824038

相关文章

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

springboot的controller中如何获取applicatim.yml的配置值

《springboot的controller中如何获取applicatim.yml的配置值》本文介绍了在SpringBoot的Controller中获取application.yml配置值的四种方式,... 目录1. 使用@Value注解(最常用)application.yml 配置Controller 中

springboot中配置logback-spring.xml的方法

《springboot中配置logback-spring.xml的方法》文章介绍了如何在SpringBoot项目中配置logback-spring.xml文件来进行日志管理,包括如何定义日志输出方式、... 目录一、在src/main/resources目录下,也就是在classpath路径下创建logba

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

pandas批量拆分与合并Excel文件的实现示例

《pandas批量拆分与合并Excel文件的实现示例》本文介绍了Pandas中基于整数位置的iloc和基于标签的loc方法进行数据索引和切片的操作,并将大Excel文件拆分合并,具有一定的参考价值,感... 目录一、Pandas 进行索引和切编程片的iloc、loc方法二、Pandas批量拆分与合并Exce

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

前端Visual Studio Code安装配置教程之下载、汉化、常用组件及基本操作

《前端VisualStudioCode安装配置教程之下载、汉化、常用组件及基本操作》VisualStudioCode是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,... 目录一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2