暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OMS全量校验流程

IT那活儿 2023-11-27
767

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!  


知识点描述
1.1 OMS全量校验
为确保OMS迁移数据的质量问题,以及提前发现OMS迁移是否存在未知异常,OMS全量校验会逐行对表数据进行校验。
注:若源端Oracle存在ADG库,OMS全量校验建议停ADG进行校验。
1.2 OMS全量校验方式
需要在源端不停业务的情况下,进行 OMS 全量校验。
由于 OMS 全量校验采用非表级快照,增量业务数据引发校验结果差异,您可以通过引入 Oracle ADG 备库规避。设置方法如下:
1)搭建 Oracle ADG 备库作为同步源,这样也可以消除 OMS 迁移同步对源端 Oracle 生产库读写压力。

2)OMS 全量校验前,停 Oracle ADG 日志应用,使源端数据处于静态,OMS 追平后再发起全量校验。当采用 ADG 作为同步源时,OMS 增量校验仅解析 ADG 端归档日志。


OMS全量校验流程

2.1 确认版本信息

1)OMS版本 4.1.0
2)OBServer版本 3.2.4.4-104050012023073116
3)迁移类型 Oracle -> OceanBase的Oracle租户

2.2 开启并检查ADG实时应用

开启ADG实时应用:
alter database recover managed standby database using current logfile disconnect;
检查日志应用开启:
注:若open_mode状态为READ ONLY WITH APPLY,则表是开启实时应用。
set line 300 pagesize 5000
select name,db_unique_name,open_mode,database_role,protection_mode,switchover_status from gv$database;

确认ADG库能拉取主库的归档:
set line 500 pagesize 1000
select THREAD#, SEQUENCE#, to_char(FIRST_TIME, 'YYYY-MM-DD HH24:MI:SS'), to_char(COMPLETION_TIME, 'YYYY-MM-DD HH24:MI:SS'), ARCHIVED, APPLIED, DELETED, STATUS from v$archived_log
where status = 'A'
and APPLIED = 'NO'
order by 1 desc, 2;

2.3 Oracle主库交叉切归档,并确认ADG延时追平、归档应用完

切所有实例归档:
alter system archive log current;
alter system archive log current;
alter system archive log current;

确认ADG是否存在延时:
set line 500
select name,value from v$dataguard_stats where name in('apply lag','apply finish time');

确认ADG上应用归档情况:
set line 500 pagesize 1000
select THREAD#, SEQUENCE#, to_char(FIRST_TIME, 'YYYY-MM-DD HH24:MI:SS'), to_char(COMPLETION_TIME, 'YYYY-MM-DD HH24:MI:SS'), ARCHIVED, APPLIED, DELETED, STATUS from v$archived_log
where status = 'A'
and APPLIED = 'NO'
order by 1 desc, 2;

OMS增量迁移会拉取ADG库的已应用归档,而ADG拉取主库归档是实时的,所有会存在停了ADG后仍然未应用完的归档,而这部分归档日志未应用完,OMS不会拉取并应用,导致即使Oracle源端静止,Oracle与OB并非绝对一致。
注:压力越小的Oracle库停完ADG后校验差异越小。

2.4 停ADG实时应用,保持源端静止

停止ADG实时应用:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
注:根据步骤3的情况,选取合适的时间点停止ADG的实时应用(建议在晚上压力最小的时候停)。

2.5 发起OMS全量校验

1)启动全量校验

2)全量校验组件优化

如果是含有大表或LOB 字段类型的表情况,可以通过调小并发和每次查询数据量,同时调大内存的方式来解决。操作如下:
--支持并发的线程数,建议调小,建议值:16
limitator.platform.threads.number
--每次查询的记录数,建议调小,建议值:[100-300]
limitator.select.batch.max
--超时时间,新增参数,建议值: 2000000
limitator.sql.execmax.noactive.time
--表记录差异值,建议尽量调大,根据实际业务量动态调整:
limitator.table.diff.max
--Checker 组件的 JVM 内存参数配置,建议调大,建议值:
-Xms64g -Xmx64g -Xmn32g -Xss512k
task.checker_jvm_param

#特殊情况:HASH分区表的校验
OMS 分区表全量校验,默认会匹配源端、目标端的分区名称,进行分区内数据校验。由于 Oracle 数据库和 OceanBase 数据库的 Hash 分区存储逻辑差异,相同分区名内存储的数据存在差异,导致校验结果出现误判。误判后,对于不一致的记录,OMS 校验进程会进行重新核对、列出明细等操作,进而出现效率低、资源消耗巨大的现象。
若存在表中HASH分区,需新增如下参数:
--使用如下参数忽略分区,不进行分区内的数据校验,执行全表校验:
limitator.verify.oracle.rowid.querydst.withpartition=false

2.6 全量校验完成,校验结果分析

1)登陆OMS主机,进入OMS Docker容器

--获取oms容器名:
docker ps
--进入oms容器:
docker exec -it <oms容器名> bash

2)切换进校验目录

oms全量校验完会生成两个文件,分别是:
  • diff文件:保存校验不一致的记录明细
    /home/ds/run/{全量校验组件 ID}/verify/{subId}/{dbname}/diff/{table_name}.diff
  • sql文件:存放在目标端执行的订正sql
    /home/ds/run/{全量校验组件 ID}/verify/{subId}/{dbname}/sql/{table_name}.sql
OMS平台查看组件监控获取oms校验组件ID:

3)对OMS校验结果分析

--执行check_diff.sh脚本汇总校验结果:

执行:
nohup sh check_diff.sh > check_diff.sh.out &
注:OMS全量校验差异原因一般为增量延迟、乱码数据、非法时间、DDL操作等,增量延迟为正常情况。如上图查看check_diff.sh.out日志,incr:0表示均为增量延迟导致,否则存在非增量延迟引起的校验不一致。[incr.mis为不一致的记录总数;incr为非增量延迟引起的不一致记录个数]
查看非增量延迟引起的不一致记录:
more diff.sh.log|awk '{if(NF>3){print $0}}'
--total_unincr.txt记录了非增量延迟引起的记录详情。
#查看某个表对应的不一致数据详情:
more total_unincr.txt|sed -ne '/BEGIN: owner.table_name/, /END/p'|grep -Ev "BEGIN|END"
如上图,该表校验不一致是由于乱码数据引起的。
#查看某个表对应的不一致数据的所有源端唯一标识【rowid】:
more total_unincr.txt|sed -ne '/BEGIN: owner.table_name/, /END/p'|grep -i MODIFY|awk -F 'rowid":"' '{print $2}'|awk -F '","' '{print $1}'

2.7 全量校验结果分析脚本

#!/bin/bash

#time时间选取一般为校验发起时间,可以自己根据diff文件选择特定值
time="2023-11-19 16"
base_dir="/home/ds/run/10.***.***.***-9000:90256:0000000042/verify/2"

for owner in $(ls -ltr $base_dir|grep -i drw|grep -Ev "chkbackup|chk"|awk '{print $9}');do

  cd ${owner}/diff/
  for file in $(ls);do
    
    mis_count=$(more $file|grep -i MODIFY|wc -l)
    incr_count=$(more $file|grep -i MODIFY|grep -Ev "$time"|wc -l)
    
    diff_count=$(expr $mis_count - $incr_count)
    
    if [ $incr_count -eq 0 ];then
      echo "$owner.$file incr.mis:$mis_count, incr:$incr_count"
    else
      echo "$owner.$file exit not incr.mis:$mis_count, incr:$incr_count, diff:$diff_count "
      echo "BEGIN: $owner.$file" >> $base_dir/total_unincr.txt
      more $file|grep -i MODIFY|grep -Ev "$time" >> $base_dir/total_unincr.txt
      echo "END" >> $base_dir/total_unincr.txt
    fi
    
  done
  cd ../../

done


END



本文作者:冯俊鸿(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论