|
UPDATE testdb1.student
WHERE
@1=1
@2='a'
@3='1'
@4=45
SET
@1=1
@2='a'
@3='1'
@4=100
UPDATE testdb1.student
WHERE
@1=2
@2='b'
@3='1'
@4=46
SET
@1=2
@2='b'
@3='1'
@4=100
UPDATE testdb1.student
WHERE
@1=3
@2='c'
@3='2'
@4=89
SET
@1=3
@2='c'
@3='2'
@4=100
UPDATE testdb1.student
WHERE
@1=4
@2='d'
@3='2'
@4=90
SET
@1=4
@2='d'
@3='2'
@4=100
UPDATE testdb1.student
WHERE
@1=5
@2='e'
@3='3'
@4=67
SET
@1=5
@2='e'
@3='3'
@4=100
UPDATE testdb1.student
WHERE
@1=6
@2='f'
@3='3'
@4=87
SET
@1=6
@2='f'
@3='3'
@4=100
UPDATE testdb1.student
WHERE
@1=7
@2='g'
@3='4'
@4=77
SET
@1=7
@2='g'
@3='4'
@4=100
UPDATE testdb1.student
WHERE
@1=8
@2='h'
@3='4'
@4=91
SET
@1=8
@2='h'
@3='4'
@4=100
|
|
#!/bin/bash
# by ray
iswhere=1 #判断循环的行的位置,1表示在where后,0表示不再where后
colNum=0 #计算列数,一般在binlog日志内第一列为@1,第二列为@2一次类推
whereNum=0 #判断where后面字段出现的次数,便于拼接字符串,第一次出现不适用都会,第二次以后使用逗号拼接
setNum=0 #判断set后面字段出现的次数,便于拼接字符串,第一次出现不适用都会,第二次以后使用逗号拼接
replaceColumn(){ #把@开头的列替换为列配置文件内的列,安配置文件的顺序执行
cat $1 | while read line
do
colNum=$[${colNum}+1]
sed -i "s/@${colNum}/${line}/g" ./execSQL.sql #替换列
done
}
getSQL(){ #获取sql
sql1=''
sql_result=''
sql_condition=''
while read line #读取处理过的binlog日志
do
if [[ ${line} =~ 'UPDATE' ]];then #匹配是否update
if [ "${sql1}" != "" ];then
echo ${sql1}' '${sql_result}' '${sql_condition}';' >> ./execSQL.sql #打印sql
sql1=''
sql_result=''
sql_condition=''
whereNum=0
setNum=0
fi
sql1=${line} #拼接sql字符串,获取update
elif [[ ${line} =~ 'WHERE' ]];then
sql_condition=${line} #拼接字符串,把binlog日志内where后面内容
iswhere=1 #判断是否为where,因为要把where和set后面的内容互换
elif [[ ${line} =~ 'SET' ]];then
sql_result=' SET '${sql_result} #拼接字符串
iswhere=0
elif [[ ${iswhere} -eq 1 ]];then #1为where后面,把binlog日志where后面的内容拼接到sql的set后
if [[ ${whereNum} -eq 0 ]];then #判断where字符串后的字符串是否一次出现
sql_result=${sql_result}' '${line}
whereNum=1 #设置为1,表示不是第一次出现
elif [[ ${whereNum} -eq 1 ]];then
sql_result=${sql_result}', '${line}
fi
elif [[ ${iswhere} -eq 0 ]];then #判断是否为set后面的字符串
if [[ ${setNum} -eq 0 ]];then #判断set字符串后的字符串是否一次出现
sql_condition=${sql_condition}' '${line}
setNum=1 #设置为1,表示不是第一次出现
elif [[ ${setNum} -eq 1 ]];then
sql_condition=${sql_condition}' and '${line}
fi
fi
done < $1 #把文件用while循环读取每一行
echo ${sql1}' '${sql_result}' '${sql_condition}';' >> ./execSQL.sql #最后一行退出循环,所以要打印最后一行
echo "commit;" >> ./execSQL.sql
replaceColumn $2
}
#脚本的入口,调用函数获取内容
if [ -e $1 ];then #判断第一个参数是否为文件
getSQL $1 $2
else
echo $1' is not a file!!'
fi
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29734436/viewspace-2152513/ ,如需转载,请注明出处,否则将追究法律责任。