Oracle-记OGG迁移项目问题与优化(5-6月)

news2024/11/16 3:15:54

背景:

        5-6月使用ogg+expdp将两套Oracle 11g从AIX7.1迁移到redhat7.9,数据量接近3T,本文主要记录ogg迁移过程中遇到的问题以及优化方法,希望对读者有所帮助

问题一:OGG数据一致性校验

        使用OGG数据迁移,需要面对的一个大问题就是如何进行源端和目标端的数据校验,数据校验可以从表的3个方面进行校验

        1 表的列数量是否一致

        2 表的行数是否一致

        3 表的字段存放数据是否一致,主要通过比较数据的hash值,而受制于查询语句对大字段的操作支持以及数据比较时间,LOB字段以及超过2000的varchar2字段暂时无法进行数据校验,要从校验的数据里面排除

        如何校验在线实时同步的数据,由于源库通常是24小时在线的业务系统,加上ogg同步存在的一定延时,在不停源库业务的情况下,源端和目标端在同一个时间点基本是无法做到完全的一致,虽然有些OGG商业软件可以做到对源端和目标端的在线数据校验,但在这种单次的OGG迁移项目以及存在大量不规范的表(表无主键以及没有记录最新的行操作时间)的情况下,很难使用OGG商业软件进行数据校验

        所以,我在本次的OGG数据迁移校验计划了两种方案进行在线的数据校验

        1 通过shell脚本的方式实现自动对表进行列,行数以及字段数据hash值的比较,并将源端,目标端结果按表进行比对,将不一致的表输出到结果文件,减少人为操作带来的比较时间误差,并在业务的空闲时间执行脚本进行比对,只要表的数据差距控制在10行以内,hash值基本一致,按照OGG的迁移经验,基本就可以确定源端和目标端的表数据一致

        2 OGG从源端的备库拉起数据进行同步,在进行数据校验时,暂停备库的日志应用,让备库处于数据静止状态,这时源端和目标端就具备数据完全一致的条件,在进行数据比较,这么做最好是重新从主库在拉一个备库出来或者是备库无业务使用

        最终根据当前的迁移环境以及现有资源,我们选择了方案一通过shell脚本方式实现源端和目标端的表自动数据校验

        这是脚本实现的输出截图,YES为一致的表,而对于NO不一致的表将会输出到结果文件,通过检查这个结果文件是否有表,就可以确认数据是否一致

问题二:OGG软件版本与操作系统不兼容

        在源端AIX安装ogg191004软件成功后,使用ggsci工具时,出现依赖库包的版本错误,由于操作系统版本与ogg版本不兼容导致,最终使用了ogg 11.2.1.0.32版本才可以

        OGG版本的与操作系统的兼容性,可以通过OGG的官方文档查看

        https://www.oracle.com/a/ocom/docs/ogg-19c-cert-matrix.xlsx

        当时下载11G版本的OGG花费了很长时间寻找,最终发现在mos上面可以通过Patches&Updates下载各个OGG版本的安装包补丁,而11.2.1.0.32版本的安装补丁包包含完整的安装软件,直接解压就可以使用,解决了下载问题

问题三:LOB大字段表导出慢

       在进行OGG数据初始化的时候,使用expdp导出全量的初始化数据,发现存在大量的LOB大字段表,单个lob字段100G以上,由于expdp无法使用并行对lob字段进行导出,加上lob字段使用的是basicfile的存储导致导出速度缓慢,并且很容易触发lob undo过旧

        针对LOB字段导出过慢的问题,采用的优化方式是通过rowid获取行所在的数据块,然后按并行度进行切块多个impdp并行导出,通过这种方式可以大大提升了导出的速度,原来单个lob字段的导出时间从10小时+减少到1小时以内

        导出脚本案例

#!/bin/bash
​
export ORACLE_SID=
#expdp parfile 存放路径
parfile_path=/databackup/source_parfile
#切割的并行度
parallel=16
for_step=$(( ${parallel}-1 ))
#导出表的用户名,表名
table_owner=''
table_name=''
#导出dmp,logfile的日期
current_date=`date "+%Y%m%d"`
#导出的dmp,logfile存放目录
directory='expdpdump'
datapump_path='/databackup/datapump'
nohup_path='/databackup/datapump'
#导出的时间点scn
FLASHBACK_SCN=
 
i=0
while(($i<${parallel}))
do
    parfile="${parfile_path}/e_${table_name}_${current_date}_${i}.par"
    dumpfile=${table_name}_${current_date}_${i}.dmp
    logfile="e_${table_name}_${current_date}_${i}.log"
    if [[ -f ${parfile} ]] || [[ -f ${datapump_path}/${dumpfile} ]] || [[ -f ${datapump_path}/${logfile} ]];then
        echo " ${parfile} or ${datapump_path}/${dumpfile} or ${datapump_path}/${logfile}  is exist;Please delete and execute again "
    exit 0
    fi 
    echo "-----start write parfile:${i}-${parfile}"
    echo 'userid="/ as sysdba"'>>${parfile}
    echo "directory=${directory}">>${parfile}
    echo "dumpfile=${dumpfile}">>${parfile}
    echo "FLASHBACK_SCN=${FLASHBACK_SCN}">>${parfile}
    echo "TABLES=${table_owner}.${table_name}">>${parfile}
    echo "QUERY=${table_owner}.${table_name}:\"where mod(dbms_rowid.rowid_block_number(rowid), ${parallel}) = ${i}\"">>${parfile}
    echo "logfile=${logfile} ">>${parfile}
    echo "cluster=n">>${parfile}
    echo "-----start expdp parallel:${i}"
    nohup expdp  parfile=${parfile}  >${nohup_path}/e_${table_name}_${current_date}_${i}.out &
    i=$(($i+1))
    sleep 10
done

         导入脚本案例,注意导入要指定DATA_OPTIONS=DISABLE_APPEND_HINT采用非APPEND导入,采用append导入会出现锁表,导致其他导入进程进行锁等待

#!/bin/bash
​
export ORACLE_SID=
#impdp parfile 存放路径
parfile_path=/databackup/target_parfile
#导入的并行度,与导出的并行度保持一致
parallel=16
for_step=$(( ${parallel}-1 ))
#导入的用户名,表名
table_owner=''
table_name=''
#导入dmp的日期与导出的dmp日期一致
current_date=''
#导入dmp,logfile的路径
directory='impdpdump'
datapump_path='/databackup/datapump'
nohup_path='/databackup/datapump'
​
for ((i=0;i<=${for_step};i++));
do
  parfile="${parfile_path}/i_${table_name}_${current_date}_${i}.par"
  dumpfile=${table_name}_${current_date}_${i}.dmp
  logfile="i_${table_name}_${current_date}_${i}.log"
  if [[ -f ${parfile} ]] || [[ -f ${datapump_path}/${logfile} ]];then
    echo " ${parfile} or ${datapump_path}/${logfile}  is exist;Please delete and execute again "
  exit 0
  fi
  if [[ -f ${datapump_path}/${dumpfile} ]];then
    echo "-----start write parfile:${i}-${parfile}"
    echo 'userid="/ as sysdba"'>>${parfile}
    echo "directory=${directory}">>${parfile}
    echo "dumpfile=${dumpfile}">>${parfile}
    echo "content=data_only">>${parfile}
    echo "DATA_OPTIONS=DISABLE_APPEND_HINT">>${parfile}
    echo "TABLES=${table_owner}.${table_name}">>${parfile}
    echo "logfile=${logfile} ">>${parfile}
    echo "cluster=n">>${parfile}
    echo "-----start impdp parallel:${i}"
    nohup impdp  parfile=${parfile}  >${nohup_path}/i_${table_name}_${current_date}_${i}.out &
    sleep 10
  else
    echo " ${datapump_path}/${dumpfile} is not exist;"
    exit 0
  fi   
done

问题四:非LOB字段表导出慢

        同样是在做数据导出的时候,出现一个小于10G的没有LOB的表导出异常慢接近2个小时,后面分析是表是宽表存在大量的行链接触发了Bug 17293498 - BAD EXPDP PERFORMANCE WITH ACCESS_METHOD=DIRECT_PATH + CHAINED ROWS,最后对单表expdp采用access_method=external_table方式,expdp通过映射外部表从SQL层导出的方式规避了该问题,导出时间从2小时缩短至28分钟

问题五:用户统计信息收集过慢

        在进行用户统计信息收集时,发现用户统计信息收集的时间过长,即使使用了大量的并行速度依然提升不明显,这是因为统计信息收集的并行度只是对于单个表,如果用户的表数量多,越往后加大并行度其实速度都差不多

        这时候可以优化的就是将用户下的表按批并行进行收集,而不是对整个用户进行收集,可以通过shell脚本去实现对同一个用户下的表同时进行批量表统计信息收集,整体统计信息的收集时间可以提高5倍以上

问题六:新环境性能测试

       新环境的性能测试,除了使用常规的SPA进行目标端的SQL回放之外,用户还想模拟应用高频语句在新环境的高并发执行,而常见的性能测试工具sysbench,swingbench都是使用样例做的基准测试,没办法定义自己执行的语句

        最后选择的方式是,通过写python脚本,模拟应用的连接池执行高频语句,模拟了对新环境的性能压测,

总结:

        虽然之前已经做过好几次的OGG迁移项目,但本次由于项目时间紧,1个月内需要完成二轮测试+正式迁移,停机窗口时间少,所以在本次项目里面使用了较多的脚本去提升数据测试和迁移的速度,这也是与以往迁移项目所不同的

        希望这些问题以及方法对读者有所帮助,里面部分涉及的脚本由于代码行数偏多,不方便进行展示,后续会单独再更新出现(*^_^*)。

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

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

相关文章

Java 实现关注微信公众号动态获取验证码

大家好&#xff0c;我是程序猿小张 前言 个人博客今天上线一个文章私密的功能&#xff0c;该功能需要通过关注公众号来获取验证码&#xff0c;通过正确的验证码才能来查阅文章&#xff0c;具体效果如下图。 我感觉还蛮有意思的就决定把这个写出来&#xff0c;供大家去使用&…

Web3.0数字货币有哪些?

Web3.0的到来为数字货币带来了全新的发展机遇&#xff0c;它不仅仅是加密货币的进化版&#xff0c;更是一种去中心化、可编程性和自治性的数字资产。 在这个新的数字经济时代&#xff0c;Web3.0数字货币成为了金融革命的核心。本文将介绍一些重要的Web3.0数字货币&#xff0c;…

基于SpringBoot+vue的新生宿舍管理系统设计与实

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

基于Servlet的CRM客户关系管理系统

1.需求分析 客户是公司最宝贵的资源&#xff0c;为了更好的发掘老客户的价值,并开发更多新客户,公司实施客户关系管理系统。系统的功能是:通过这个系统完成对员工基本信息、客户基本信息、交往信息、客户服务信息的充分共享和规范化管理;通过对销售机会、客户开发过程的追踪和…

服务器配置静态IP

服务器配置静态IP 一、前期准备二、配置静态IP 将服务器配置为使用静态IP地址。这将使服务器拥有一个永久的IP地址&#xff0c;而不会在每次启动时更改。为此&#xff0c;您需要编辑网络配置文件并将服务器的IP地址添加到其中。详细步骤如下&#xff1a; 一、前期准备 请在配置…

Docter容器

轻量&#xff0c;高效&#xff0c;敏捷 本质是进程&#xff0c;所以才轻量&#xff0c;namespace隔离资源&#xff0c;cgroups资源限制 namespace 运行容器&#xff0c;100个容器争夺资源&#xff0c; 给每个容器分配多少资源 审计&#xff1a;你利用多少资源&#xff1f;技…

免费的CRM软件都有哪些功能?

有哪些免费好用的CRM软件推荐&#xff1f;Zoho CRM是免费的CRM客户管理软件。虽然限制了部分功能&#xff0c;但是依然可以管理客户关系&#xff0c;提高销售效率&#xff0c;实现快速增长。 联系人管理&#xff1a; 创建和管理联系人&#xff0c;记录他们的基本信息、交易历…

阿里云短信平台收费标准价格表

阿里云短信服务平台&#xff0c;阿里云短信0.032元一条&#xff0c;阿里云短信&#xff1f;阿里云短信怎么收费&#xff1f;阿里云短信多少钱一条&#xff0c;阿里云短信0.032元一条。新用户购买阿里云短信套餐包6.9元200条起&#xff0c;费用0.032元/条&#xff0c;阿里云短信…

轻量级的CRM系统有哪些优势

市面上的CRM客户管理系统多种多样&#xff0c;但并不是所有的CRM系统都适合您的企业——有些CRM过于复杂和昂贵&#xff0c;初创或小型企业无法负担。那么&#xff0c;有哪些好用的轻量级在线CRM系统&#xff1f; Zoho Bigin是初创或小型企业设计的轻量级在线CRM系统&#xff…

联想小新电脑无法启动怎么办?

1&#xff0c;电脑启动不了 2&#xff0c;强制断电3次开机后&#xff0c;Win11进入高级启动模式 &#xff08;注意每次强制关机要按住15秒左右&#xff09; 3&#xff0c;选择疑难解答 4&#xff0c;选择高级选项 5&#xff0c;卸载更新 6&#xff0c;卸载最新的质量更新 7&am…

Spring Boot 中的 Spring Cloud Feign

Spring Boot 中的 Spring Cloud Feign Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了很多工具和组件来简化 Web 应用程序的开发。其中&#xff0c;Spring Cloud Feign 是 Spring Boot 中的一个非常重要的组件&#xff0c;它可以帮助我们实现声明式的 R…

Git构建和Github的ssh配置

由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的&#xff0c;所以我们需要配置验证信息 ssh-keygen -t rsa -C "youremailexample.com" your_emailyouremail.com 改为你在 Github 上注册的邮箱&#xff0c;之后会要求确认路径和输入密码&#xff0c…

计算机网络(谢希仁版)基础期末复习

一、前言 该篇文章是对计算机网络&#xff08;谢希仁版&#xff09;常考的期末复习知识点进行的总结&#xff0c;可以供大家进行简单的复习&#xff0c;适用于网络工程、计算机网络类专业的同学进行复习使用。其他对计算机网络感兴趣的同学、相关专业人士也可进行阅读。 二、第…

arcpy调用系统自带工具箱、检测文件是否存在、获取要素文件的属性(名称类型)、列出数据函数的使用

前言 前言其实我也不知道说什么&#xff0c;以往说的都是&#xff1b;垃圾话&#xff0c;现在垃圾话也说不出了&#xff0c;但是这是必不可少的内容&#xff01; 一、调用系统工具箱 我在这里以裁剪工具为例&#xff0c;其他的工具类似。 那么我们怎么知道我想使用的工具在…

【如何用大语言模型快速深度学习系列】从n-gram到TFIDF

感谢上一期能够进入csdn“每日推荐看”&#xff0c;那必然带着热情写下第二期《从n-gram到TFIDF》&#xff0c;这里引入一本《Speach and Language Processing》第三版翻译版本&#xff08;语音与语言处理(SLP)&#xff09;&#xff0c;前半部分写的很好&#xff01;里面连编辑…

软件测试的概念与过程---项目启动与需求评审

软件测试的概念与过程---项目启动与需求评审 1、项目启动参加的人员成员组成 2、需求评审 1、项目启动参加的人员 成员组成 项目经理: 为项目的成功策划和执行负总责的人产品经理: 根据市场的需求制定需求分析研发组长: 1.负责本小组的安全工作和日常研发工作 2.对组内人员…

High Performance Visual Tracking with Siamese Region Proposal Network(SiamRPN)

High Performance Visual Tracking with Siamese Region Proposal Network&#xff08;SiamRPN&#xff0c;CVPR2018&#xff09; 主要贡献&#xff1a; 提出了SiamRPN跟踪器&#xff0c;首次将端到端的离线训练方式&#xff0c;应用到了大尺度的图像跟踪任务上在在线跟踪过程…

Elasticsearch 分词器切词器分析器

normalization : 文档规范化 先切词,然后规范化. 规范化要规范哪些内容? 大小写; 标点符号; 时态; 复数; 规范化主要是为了匹配更精准 character filter : 字符过滤器. 标点符号 分词之前的预处理&#xff0c;过滤无用字符 HTML Strip Character Filter &#xff1a;htm…

【C3】内核模块,设备号,字符驱动,设备节点

文章目录 1.内核模块&#xff1a;必须包含module.h2.内核模块参数&#xff1a;权限位是用在sysfs文件系统里&#xff0c;只读权限用S_IRUGO设置2.1 extern&#xff1a;声明来自另一个模块 3.设备号&#xff1a;主设备号对应驱动程序&#xff0c;具有相同主设备号设备使用相同驱…

Android Studio Bot 下载使用

Android Studio Bot 下载使用 本文最新更新地址 https://gitee.com/chenjim/chenjimblog 下载 Android Studio Hedgehog 当前的新版本是 2023.1.1 Canary 10找到Studio Bot: View->Tool Windows->Studio Bot&#xff0c;或者下图 登录 Google 账号&#xff0c;注意当前限…