首页 > 数据库 >数据库对比shell脚本

数据库对比shell脚本

时间:2022-12-09 15:01:07浏览次数:48  
标签:脚本 shell NAME -- 数据库 echo FILE DB02 DB01

这是一个通过nacos获取数据库配置然后自动对比数据库和topic区别的工具,头和尾去掉也就是“*********************”前后去掉中间部分是单独的数据库对比脚本,用的时候要注意一下不要粘错。

#!/bin/sh
#sql,mq对比工具

project=要上线的项目名称
dataId=$project

##########生产
yi_token1=`curl -s 'http://nacos的ip地址和端口号/nacos/v1/auth/login' -d 'username=“nacos的用户名”&password=nacos的密码' | awk -F ":" '{print $2}'| awk -F "," '{print $1}'| sed 's/\"//g'`
yi_pinjie1="http://nacos的ip地址和端口号/nacos/v1/cs/configs?accessToken=$yi_token1&dataId=$dataId&group=DEFAULT_GROUP"
yi_pinjie2="curl -X GET $yi_pinjie1"
##########测试
er_token2=`curl -s 'http://nacos的ip地址和端口号/nacos/v1/auth/login' -d 'username=nacos的用户名&password=nacos的密码' | awk -F ":" '{print $2}'| awk -F "," '{print $1}'| sed 's/\"//g'`
er_pinjie1="http://nacos的ip地址和端口号/nacos/v1/cs/configs?accessToken=$er_token2&dataId=$dataId&group=DEFAULT_GROUP"
er_pinjie2="curl -X GET $er_pinjie1"


#生产数据库ip
first_ip=`$yi_pinjie2 | grep mysql | head -n 1 |awk -F"//" '{print $2}' | awk -F ":" '{print $1}'`
#生产数据库的端口号
first_nu=`$yi_pinjie2 | grep mysql | head -n 1 |awk -F":" '{print $5}' | awk -F"/" '{print $1}'`
#生产要对比的库
first_ku=`$yi_pinjie2 | grep mysql | head -n 1 | awk -F"/" '{print $4}' | awk -F"?" '{print $1}'`


#测试数据库ip
second_ip=`$er_pinjie2 | grep mysql | head -n 1 |awk -F"//" '{print $2}' | awk -F ":" '{print $1}'`
#测试数据库的端口号
second_nu=`$er_pinjie2 | grep mysql | head -n 1 |awk -F":" '{print $5}' | awk -F"/" '{print $1}'`
#测试要对比的库
second_ku=`$er_pinjie2 | grep mysql | head -n 1 | awk -F"/" '{print $4}' | awk -F"?" '{print $1}'`


if [ -n "$first_ip" ] && [ -n "$second_ip" ]; then
echo "有数据库相关配置,开始对比数据库"

 

**********************************************************************************************************************************************************************

**********************************************************************************************************************************************************************

如果只是想要一个单独的对比脚本可以粘贴#####内的内容

echo "第一个数据库的连接属性"
DB01_NAME=$first_ku
echo "$DB01_NAME"
DB01_HOST=$first_ip
echo "$DB01_HOST"
DB01_PORT=$first_nu
echo "$DB01_PORT"
DB01_USER=root
DB01_PWD='=$94P^2s4W2j'

echo "第二个数据库的连接属性"
DB02_NAME=$second_ku
echo "$DB02_NAME"
DB02_HOST=$second_ip
echo "$DB02_HOST"
DB02_PORT=$second_nu
echo "$DB02_PORT"
DB02_USER=root
DB02_PWD='=$94P^2s4W2j'

echo "###########################################"
#临时文件目录
BASE_DIR=./tmp
DB01_FILE=${BASE_DIR}/db01_result.txt
DB02_FILE=${BASE_DIR}/db02_result.txt
RESULT_FILE=${BASE_DIR}/compare_result.txt
SAME_TABLES=${BASE_DIR}/same_tables.txt
#检查文件或者文件夹是否存在,如果不存在,则创建
# $1--需要检查的文件
function checkFileExists(){
if [ ! -e ${1} ]; then
parentDir=`dirname ${1}`
mkdir -p ${parentDir}
touch ${1}
fi
}
#通过数据库名称该库中所有表
# $1--数据库名称 $2--用户名 $3--密码
# $4--主机地址 $5--端口号 $6--查询结果输出文件
function getTablesByDbName(){
sql="select a.TABLE_NAME from information_schema.TABLES a where a.TABLE_SCHEMA='${1}'"
mysql -u${2} -p${3} -h${4} -P${5} -e"${sql}">${6}
#查询结果第一行是TABLE_NAME,此处需要删除
sed -i 1d ${6}
}
#读取某个文件中所有内容并且输出
# $1--需要读取的文件路径 $2--需要输出的文件路径
function readFileContent(){
while read line
do
echo ${line}>>${2}
done<${1}
}
#比较两个文件,输出不同内容,选择性记录相同内容
# $1--是否记录相同内容:yes/no $2--需要循环比对的基准文件 $3--需要被比对的文件
# $4--不同内容输出文件路径 $5--相同内容输出文件路径
function compareTwoFile(){
while read line
do
matchLine=`grep -i -w "${line}" ${3}`
if [[ -z ${matchLine} ]]; then
echo ${line}>>${4}
elif [[ ${matchLine} == ${line} && "yes" == ${1} ]]; then
existLine=`grep -i -w ${line} ${5}`
if [[ -z ${existLine} ]]; then
echo ${line}>>${5}
fi
fi
done<${2}
}
#按照库名和表名,查询某个表的表结构
# $1--库名 $2--表名 $3--用户名 $4--密码
# $5--主机 $6--端口号 $7--输出文件名
function queryTableInfo(){
sql="desc ${1}.${2}"
mysql -u${3} -p${4} -h${5} -P${6} -e"${sql}">${7}
}
function main(){
echo "开始比较..."
echo "开始查询生产${DB01_NAME}库和测试${DB02_NAME}库的所有表名..."
checkFileExists "${DB01_FILE}"
checkFileExists "${DB01_FILE}"
checkFileExists "${SAME_TABLES}"
checkFileExists "${RESULT_FILE}"
getTablesByDbName "${DB01_NAME}" "${DB01_USER}" "${DB01_PWD}" "${DB01_HOST}" "${DB01_PORT}" "${DB01_FILE}"
getTablesByDbName "${DB02_NAME}" "${DB02_USER}" "${DB02_PWD}" "${DB02_HOST}" "${DB02_PORT}" "${DB02_FILE}"
echo "开始找出生产${DB01_NAME}库和测试${DB02_NAME}库中不同的表以及相同的表..."
echo "##################">${RESULT_FILE}
echo "# 表名称对比结果 #">>${RESULT_FILE}
echo "##################">>${RESULT_FILE}
#如果某个库里边的表数量为0,则说明另外一个库中的表都是和这个库不同的表
db01_table_count=`wc -l ${DB01_FILE}|awk -F " " '{print $1}'`
db02_table_count=`wc -l ${DB02_FILE}|awk -F " " '{print $1}'`
if [[ ${db01_table_count} -eq 0 && ${db02_table_count} -gt 0 ]]; then
echo "以下表在生产${DB01_NAME}中不存在:">>${RESULT_FILE}
readFileContent "${DB02_FILE}" "${RESULT_FILE}"
elif [[ ${db02_table_count} -eq 0 && ${db01_table_count} -gt 0 ]]; then
echo "以下表在测试${DB02_NAME}中不存在:">>${RESULT_FILE}
readFileContent "${DB01_FILE}" "${RESULT_FILE}"
elif [[ ${db02_table_count} -eq 0 && ${db01_table_count} -eq 0 ]]; then
echo "数据库生产${DB01_NAME}和测试${DB02_NAME}中的表均为空"|tee ${RESULT_FILE}
else
echo "以下表在测试${DB02_NAME}中不存在:">>${RESULT_FILE}
compareTwoFile "yes" "${DB01_FILE}" "${DB02_FILE}" "${RESULT_FILE}" "${SAME_TABLES}"
echo "以下表在生产${DB01_NAME}中不存在:">>${RESULT_FILE}
compareTwoFile "yes" "${DB02_FILE}" "${DB01_FILE}" "${RESULT_FILE}" "${SAME_TABLES}"
fi
echo "开始对比相同表的表结构"
echo "##################">>${RESULT_FILE}
echo "# 表结构对比结果 #">>${RESULT_FILE}
echo "##################">>${RESULT_FILE}
while read line
do
tableName=${line}
queryTableInfo ${DB01_NAME} ${line} ${DB01_USER} ${DB01_PWD} ${DB01_HOST} ${DB01_PORT} ${DB01_FILE}
queryTableInfo ${DB02_NAME} ${line} ${DB02_USER} ${DB02_PWD} ${DB02_HOST} ${DB02_PORT} ${DB02_FILE}
echo "以下表字段及属性在,生产${DB01_NAME}.${tableName}中是唯一的:">>${RESULT_FILE}
compareTwoFile "no" "${DB01_FILE}" "${DB02_FILE}" "${RESULT_FILE}"
echo "以下表字段及属性在,测试${DB02_NAME}.${tableName}中是唯一的:">>${RESULT_FILE}
compareTwoFile "no" "${DB02_FILE}" "${DB01_FILE}" "${RESULT_FILE}"
done<${SAME_TABLES}
echo "比较完成,比较结果文件路径:${RESULT_FILE}"
}
main

*********************************************************************************************************************************************************************************************************

*********************************************************************************************************************************************************************************************************
diyiduan=`cat ./tmp/compare_result.txt | grep "中不存在" | wc -l`
dierduan=`cat ./tmp/compare_result.txt | grep "中是唯一的" | wc -l`
let he=$diyiduan+$dierduan+6;echo $he
total_rows=`cat ./tmp/compare_result.txt | wc -l`
echo $total_rows
if [ "$total_rows" -gt "$he" ] ;then
echo "数据库对比异常";exit
else
echo "数据库对比正常"
fi

##################################################################################
else
echo "没有数据库相关配置,继续对比其他"
fi


###################################################################################
####################################topic对比######################################

topic_value=`$yi_pinjie2 | grep trace-topic: | awk -F ": " '{print $2}'`

if [ ! -n "$topic_value" ]; then
echo "nacos中没有找到rocketmq——topic配置"
else
echo "$topic_value"
rocketmq_topic=`bash /usr/local/rocketmq/bin/mqadmin topicList -n 10.9.40.7:9876 | grep ${topic_value}`
echo "$rocketmq_topic"
if [ ! -n "$rocketmq_topic" ]; then
echo "错误,nacos中有topic相关配置,但rocketmq中没有找到";exit
else
echo "topic匹配成功"
fi
fi
echo "对比过程没有异常"

标签:脚本,shell,NAME,--,数据库,echo,FILE,DB02,DB01
From: https://www.cnblogs.com/gaoqd/p/16968942.html

相关文章

  • 【生产】kafka 统计脚本
    kafka根据时间统计topic是否有数据#!/bin/shforxin`cat/home/kafka/kafka_2.11-1.0.2/bin/topic.list_bak`dobrokers="192.168.27.13:9092"#topic="cmp_ddr_topic"pat......
  • oracle - 数据库版本说明
    1998年Oracle8i:i指internet,表示oracle向互联网发展,8i之前数据库只能对应1个实例2001年Oracle9i:8i的升级,性能更佳,管理更人性化2003年Oracle10g:g指grid,表示采用网格计算的......
  • Linux-jar操作脚本
    service.sh使用说明:./service.shstart./service.shstop#!/bin/bash#这里可替换为你自己的执行程序,其他代码无需更改APP_NAME=mxy_system-0.0.1-SNAPSHOT.jar#she......
  • CentOS7.2 使用Shell安装Oracle12c
    1.操作系统版本2.磁盘分区用量二.安装必要的软件包forpkgin'binutils''compat-libcap1''compat-libstdc++-33''gcc''gcc-c++''glibc''glibc-devel''ksh''lib......
  • (转)如何解决 shell 脚本重复执行的问题
    原文:https://zhuanlan.zhihu.com/p/415818146在开发过程中,经常会使用shell脚本去完成定时备份的任务,普遍的做法是通过系统的定时任务定时执行备份脚本设想这样一种场景,本......
  • 数据库原理 查询优化
    实现查询操作的算法1、选择(1)简单的全表扫描(2)索引扫描算法2、连接(1)嵌套循环算法对外层循环表上的每一个元组,检索其内层循环表中元组,检查其是否相等,满足连接条件输出。......
  • 数据库脚本执行逻辑
    数据库脚本执行顺序:sql脚本命名规范:序号+版本名称+脚本描述+创建者姓名拼音缩写±回滚后缀DBaistock-v4.4.4script1_aistock-v4.4.4_updateTable_bwf-zsz.sql2_aisto......
  • 云数据库技术行业动态:ClickHouse Cloud正式GA或有融资;openGauss社区引入新成员
    行业动态ClickHouseCloud正式GA,同时,B轮融资得到进一步增加这是由ClickHouse官方推出云服务,启用新域名:clickhouse.cloud,类似于MongoDB的Atlas服务。目前支持在AWS构建,从......
  • sqlite3数据库提示database disk image is malformed 解决办法
    在嵌入式产品中,用sqlite3进行数据存储是非常常用且有效的方法。但是最近在项目中遇到了数据库被损坏的情况,具体表现为使用数据库管理软件打开数据库后,使用sql语句对数据进......
  • springboot中数据库批量新增InsertListMapper两种情况
    pom中mybatis的依赖包版本必须高点满足两种情况<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>4.......