分享一个使用get_hash_value比对数据脚本

使用get_hash_value获取每个字段的值,再sum起来比对,如果表有lob字段,则会先排除掉lob字段再比对其它字段

这个脚本有两个问题:

1.如果字段所有的值长度加起来超过4000会报错,比对不了,这种情况一般比较少

2.二进制数据不支持,例如blob

脚本需要修改:

1.DS_CONNECT 和DT_CONNECT配置为需要比对的源端和目标端的连接串

2.COMP_TYPE如果是1则是比对用户,你将需要比对的用户写到COMP_USER中

如果是2则是比对指定表,你需要手工将 用户名.表名 写入到tab.txt中

3.FLAG配置一下比对的标识符,随便写,标识比对的哪个库

4.配置一下NLS_LANG防止有中文表或者中文字段

其它:

比对的结果会在当前目录下,tab.info.xxx是详细结果  tab.err.xxx是比对不一致的表 tab.ok.xxx是比对一致的表,上次比对的结果保存在history目录下

如果比对过程中出现报错,可以检查.c.done和.c.done.bak这两个个隐藏文件

.hash.sql和.hash.sql.bak是具体执行的sql语句

#!/bin/bash
. ~/.bash_profile

##### ERROR:: integer expression expected : table no columns without unsupport datatype columns
##### ERROR:: ORA-01489                   : column values concat larger then 40000, unsupport

export WORKDIR=$(cd `dirname $0`/; pwd)                 

##modify
##USER and PWD
export FLAG=wzjj_lob
export DS_CONNECT=xx/xxxx@source
export DT_CONNECT=xx/xxxx@target
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

###COMP_TYPE:1-user 2-table
###if COMP_TYPE=1,please modify COMP_USER
###if COMP_TYPE=2,plase write OWNER.TABLE_NAME to $TABLE_FILE
export COMP_TYPE=1
export COMP_USER="('BUSINESS_QRY','TEST')"
export TABLE_FILE=$WORKDIR/tab.txt


####init tab.txt
if [ $COMP_TYPE -eq 1 ]
then

sqlplus -S $DS_CONNECT <<EOF >$WORKDIR/tab.txt
set pagesize 0 feedback off verify off heading off echo off long 9999 longchunksize 9999 line 5000
select owner||'.'||table_name from dba_tables where owner in $COMP_USER
/
EOF
fi



########
LOGFILE_OPERTIME=`date +%Y%m%d%H%M`

ALL_ROW=`cat $TABLE_FILE |wc -l`

####check oracle version
VERSION=`sqlplus -S $DS_CONNECT <<EOF
set pagesize 0 feedback off verify off heading off echo off long 9999 longchunksize 9999 line 5000
select substr(value,1,instr(value,'.')-1) from  v\\\$parameter where name='compatible'
/
EOF
`
#echo $VERSION

if [ $VERSION -gt 11 ]
then
	TSQL=TSQL12C
else
	TSQL=TSQL11G
fi

#####################################################################################

TSQL11G(){
EXEC_SQL=`sqlplus -S $DS_CONNECT <<EOF
set pagesize 0 feedback off verify off heading off echo off long 9999 longchunksize 9999 line 5000
select 'select nvl(sum(dbms_utility.get_hash_value('||replace(to_char(
wm_concat(
decode(data_type,'LONG','','LONG RAW','','BLOB','','CLOB','','NCLOB','''0''','"'||COLUMN_NAME||'"')
)),',','||')
||',0,power(2,30))),0) from "'||owner||'"."'||table_name||'";'
from dba_tab_columns where owner||'.'||table_name='$1'  group by owner,table_name
/
EOF
`
echo "$EXEC_SQL" >$WORKDIR/.hash.sql
}

TSQL12C(){
EXEC_SQL=`sqlplus -S $DS_CONNECT <<EOF
set pagesize 0 feedback off verify off heading off echo off long 9999 longchunksize 9999 line 5000
select 'select nvl(sum(dbms_utility.get_hash_value('||to_char(listagg(
decode(data_type,'LONG','','LONG RAW','','BLOB','','CLOB','','NCLOB','''0''','"'||COLUMN_NAME||'"')
,'||'))
||',0,power(2,30))),0) from "'||owner||'"."'||table_name||'";'
from dba_tab_columns where owner||'.'||table_name='$1'  group by owner,table_name
/
EOF
`
echo "$EXEC_SQL" >$WORKDIR/.hash.sql
}

SOURCE_COUNT(){
SOURCE_NUM=`sqlplus -S $DS_CONNECT <<EOF
set pagesize 0 feedback off verify off heading off echo off numf 999999999999999999999999999999999
@$WORKDIR/.hash.sql
EOF
`
echo s $SOURCE_NUM >> $WORKDIR/.c.done
}

TARGET_COUNT(){
TARGET_NUM=`sqlplus -S $DT_CONNECT <<EOF
set pagesize 0 feedback off verify off heading off echo off numf 9999999999999999999999999999999999
@$WORKDIR/.hash.sql
EOF
`
echo t $TARGET_NUM >> $WORKDIR/.c.done
}

#######################################################################################################
##init file & backup file



mkdir -p $WORKDIR/history
mv -f $WORKDIR/tab.info* $WORKDIR/history 2>/dev/null
mv -f $WORKDIR/tab.err* $WORKDIR/history 2>/dev/null
mv -f $WORKDIR/tab.ok* $WORKDIR/history 2>/dev/null

date
> $WORKDIR/tab.ok.$LOGFILE_OPERTIME
> $WORKDIR/tab.err.$LOGFILE_OPERTIME
> $WORKDIR/.c.done.bak
> $WORKDIR/.c.done
> $WORKDIR/.hash.sql.bak

printf "%-12s %-10s %-40s %-18s %-18s %-6s %-20s %-20s\n"  "ID" "FLAG" "OWNER.TABLE" "DS_HASH"  "DT_HASH" "STATUS" "START_TIME" "END_TIME" |tee -a $WORKDIR/tab.info.$LOGFILE_OPERTIME
echo "------------------------------------------------------------------------------------------------------------------------------------------------------------" |tee -a $WORKDIR/tab.info.$LOGFILE_OPERTIME
ID=1

##########################################################for 
while read TABLEINFO 
do
	
	cat $WORKDIR/.c.done >>$WORKDIR/.c.done.bak  2>/dev/null
	cat $WORKDIR/.hash.sql >>$WORKDIR/.hash.sql.bak 2>/dev/null
	> $WORKDIR/.c.done
	
	$TSQL $TABLEINFO
	
	START_OPERTIME=`date +"%Y-%m-%d:%H:%M:%S"`
	SOURCE_COUNT $TABLEINFO &
	TARGET_COUNT $TABLEINFO &
	
#	ALL_ROW=`echo $TABLE_INFO|awk '{print NF}'`
	
	while true
	do
	if [ `cat $WORKDIR/.c.done |wc -l ` -eq 2 ]
	then
		SOURCE_NUM=`cat $WORKDIR/.c.done |awk '$1=="s" {print $2}'`
		TARGET_NUM=`cat $WORKDIR/.c.done |awk '$1=="t" {print $2}'`
		END_OPERTIME=`date +"%Y-%m-%d:%H:%M:%S"`
		if [ $SOURCE_NUM -ne $TARGET_NUM ]
		then
			COMP_STATUS=2
			echo $TABLEINFO >> $WORKDIR/tab.err.$LOGFILE_OPERTIME
		else
			COMP_STATUS=1
			echo $TABLEINFO >> $WORKDIR/tab.ok.$LOGFILE_OPERTIME
		fi
	
		printf "%-12s %-10s %-40s %-18s %-18s %-6s %-20s %-20s\n" [$ID/$ALL_ROW] $FLAG $TABLEINFO $SOURCE_NUM $TARGET_NUM $COMP_STATUS $START_OPERTIME $END_OPERTIME |tee -a $WORKDIR/tab.info.$LOGFILE_OPERTIME
		break
	else
		sleep 0.1
	fi
	done
	ID=$(($ID+1))

done <$TABLE_FILE
date



脚本执行完结果如下:

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

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

相关文章

【gogogo专栏】golang并发编程

golang并发编程 并发编程的工具goroutine介绍协程管理器sync.WaitGroup channel介绍readChannel和writeChannelclose的用法select的用法 通讯示例总结 并发编程的工具 在golang中&#xff0c;并发编程是比较简单的&#xff0c;不像java中那么麻烦&#xff0c;golang天然的支持协…

希尔排序原理

目录&#xff1a; 一、希尔排序与插入排序 1&#xff09;希尔排序的概念 2&#xff09;插入排序实现 二、希尔排序实现 一、希尔排序与插入排序 1&#xff09;希尔排序的概念 希尔排序(Shells Sort)是插入排序的一种又称“缩小增量排序”&#xff08;Diminishing Incremen…

ChineseChess.2023.11.09.01

中国象棋残局模拟器ChineseChess.2023.11.09.01

【PC】特殊空投-2023年11月

亲爱的玩家朋友们&#xff0c;大家好&#xff01; 寒冷的11月&#xff0c;特殊空投活动来袭。从连续签到活动到神秘市场相关活动&#xff0c;我们已经为大家准备好了一切&#xff0c;只为给大家在这寒冷的11月带来一份暖意。还有大量的黑货票劵等着大家&#xff0c;请一定要领取…

C语言-调试文件

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> //读256 a 256 fseek 改文件&#xff0c;用ocd&#xff0c;先搞b5v0 int main(int argc, char **argv) {if (argc ! 2) return -1;char file_buf[256];FILE* file1 fopen(argv[1], …

前后端交互常见的几种数据传输格式 form表单+get请求 form表单+post请求 json键值对格式

目录 1. get请求 query string 2.form表单get请求 3..form表单post请求 4..json格式 5.总结 1. get请求 query string 前端通过get请求携带 query string&#xff08;键值对&#xff09; ,后端通过req.getParameter(key)方法获取数据。如果key不存在&#xff0c;获取到的就…

pyspark将数据多次插入表的时候报错

代码 报错信息 py4j.protocol.Py4JJavaError: An error occurred while calling o129.sql. : org.apache.spark.sql.catalyst.parser.ParseException: mismatched input INSERT expecting <EOF>(line 12, pos 0) 原因 插入语句结束后没有加&#xff1b;结尾 把两个&am…

ROS学习笔记(6):ros_control

1.ros_control简介 ros_control - ROS Wiki ros_control是为ROS提供的机器人控制包&#xff0c;包含一系列控制器接口、传动装置接口、控制器工具箱等,有效帮助机器人应用功能包快速落地&#xff0c;提高开发效率。 2.ros_control框架 ros_control总体框架&#xff1a; 针对…

python连接mysql进行查询

pymysql连接工具类 import pymysql 数据库连接工具类 class MySQLConnection:def __init__(self, host, port, user, password, database):self.host hostself.port portself.user userself.password passwordself.database databaseself.conn Noneself.cursor None# …

广域网加速的作用:企业为什么需要广域网加速?

由于局域网与广域网之间巨大的带宽鸿沟&#xff0c;通过增加带宽来满足膨胀的流量需求是不切实际的。 并且广域网带宽成本较高&#xff0c;增加广域网带宽对任何企业都意味着巨大的成本负担。这些使得控制 管理广域网带宽使用成为必需。 企业为什么要加速广域网? 对重要的企…

微信小程序案例3-2 计算器

文章目录 一、运行效果二、知识储备&#xff08;一&#xff09;data-*自定义属性&#xff08;二&#xff09;模块 三、实现步骤&#xff08;一&#xff09;准备工作&#xff08;二&#xff09;实现页面结构&#xff08;三&#xff09;实现页面样式&#xff08;四&#xff09;实…

Debian12换镜像源

0 背景 用docker运行了一个node容器&#xff0c;发现连vim也没有&#xff0c;所以打算安一个vim 1 查看操作系统 find / -name *release* #查看release信息2 更换镜像源 2.1 从网上找个国内镜像源 确定好操作系统版本后&#xff0c;从网上搜一下对应的数据源。这里提供一个…

Ubuntu20.0工作区(workspace)介绍,切换工作区方式和快捷键

Ubuntu20.0工作区&#xff08;workspace&#xff09;介绍&#xff0c;切换工作区方式和快捷键 先修改一下ubuntu截屏的快捷键查看工作区新建工作区工作区切换 先修改一下ubuntu截屏的快捷键 修改为 查看工作区 按下Super键&#xff08;即Windows键&#xff09;&#xff0c;可…

动态壁纸软件Live Wallpaper HD mac中文版功能特色

Live Wallpaper HD mac提供了一系列美丽的主题场景&#xff0c;将为您的桌面增添活力。从城市景观、日落到遥远的星系&#xff0c;每个屏幕都有特别的触感&#xff0c;可以定制您的天气小部件和时钟样式&#xff0c;并使用您喜爱的图片创建您自己的个性化壁纸。 Living Wallpap…

安装dubbo-admin报错node版本和test错误

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;dubbo-admin安装 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0…

5G毫米波通信中的关键技术

随着5G技术的快速发展&#xff0c;毫米波通信作为其中的一项重要技术&#xff0c;在高速数据传输、低延迟通信和大规模连接等方面具有显著的优势。本文将探讨5G毫米波通信中的关键技术&#xff0c;包括毫米波频段的选择、信号处理技术和MIMO技术等。 一、毫米波频段的选择 毫米…

Selenium alert 弹窗处理!

页面弹窗有 3 种类型&#xff1a; alert&#xff08;警告信息&#xff09;confirm&#xff08;确认信息&#xff09;prompt&#xff08;提示输入&#xff09; 对于页面出现的 alert 弹窗&#xff0c;Selenium 提供如下方法&#xff1a; 序号方法/属性描述1accept()接受2dismis…

查分小程序,教学大作用

数字化时代&#xff0c;技术已经深深的改变了我们的生活和工作方式。当然&#xff0c;教育领域也不例外。如果你是一位老师&#xff0c;你可能会想知道如何利用这些技术工具来提高学生的学习体验和成绩。今天&#xff0c;我们就来聊聊如何用各种代码、Excel等工具&#xff0c;打…

systemd-journald日志管理服务详解

journald参考文档&#xff1a; journald.confhttps://www.freedesktop.org/software/systemd/man/latest/journald.conf.html Amazonlinux2023系统默认不再安装rsyslog&#xff0c;因此在amazonlinux2中的诸多日志文件例如/var/log/message默认不可用。 AWS官方文档建议使用sys…

在Kotlin中设置User-Agent以模拟搜索引擎爬虫

前言 随着双十一电商活动的临近&#xff0c;电商平台成为了狂欢的中心。对于商家和消费者来说&#xff0c;了解市场趋势和竞争对手的信息至关重要。在这个数字时代&#xff0c;爬虫技术成为了获取电商数据的有力工具之一。本文将以亚马逊为例&#xff0c;介绍如何使用Kotlin编…