概述
比较两个mysql数据库里面的表是否相同的一个校验脚本
一、原理:采用CRC32算法进行校验。那么什么是CRC32算法呢?CRC32算法 的计算是非常非常非常严格的。严格到什么程度呢?你的程序只要被改动了一个字节(甚至只是大小写的改动),它的值就会跟原来的不同。所以只要给你的“原”程序计算好CRC值,储存在某个地方,然后在程序中随机地再对文件进行CRC校验,接着跟第一次生成并保存好的CRC值进行比较,如果相等的话就说明你的程序没有被修改/破解过,如果不等的话,那么很可能你的程序遭到了病毒的感染,或者被Cracker用16进制工具暴力破解过了。
二、脚本内容
[root@drbd-01 ~]#cat checksum.sh
#!/bin/bash
split=`echo + -{1..86} +| tr -d "[0-9]|"`
echo $split > /home/mysql/checksum/$5.checksum
printf "| %-40s | %-40s| n" TABLE_NAME CHECKSUM >> /home/mysql/checksum/$5.checksum
echo $split >> /home/mysql/checksum/$5.checksum
for table_name in `mysql -u$1 -p$2 -h$3 -P$4 -BNe "select table_name from information_schema.tables where table_schema='$5' and table_type='base table';"`
do
column_name=`mysql -u$1 -p$2 -h$3 -P$4 -BNe "select column_name from information_schema.columns where table_schema='$5' and table_name='$table_name';"|tr 'n' ','|sed 's/,/`,`/g'|sed 's/^/`/'|sed 's/,`$//'`
if_one_column=`echo $column_name|grep ,`
if [ -z $if_one_column ];then
checksum=`mysql -u$1 -p$2 -h$3 -P$4 -BNe "select sql_no_cache COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32($column_name) AS UNSIGNED)), 10, 16)), 0) as checksum from $5.$table_name;"`
else
checksum=`mysql -u$1 -p$2 -h$3 -P$4 -BNe "select sql_no_cache COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('',$column_name)) AS UNSIGNED)), 10, 16)), 0) as checksum from $5.$table_name;"`
fi
printf "| %-40s | %-40s| n" $table_name $checksum >> /home/mysql/checksum/$5.checksum
done
echo $split >> /home/mysql/checksum/$5.checksum
三、执行脚本的方法
sh checksum.sh user passwd localhost 3306 dbname
四、例子
4.1、建立一个如下目录,用来存放校验码:
[root@drbd-01 ~]#mkdir /home/mysql/checksum/
4.2、如下方法执行脚本,用来对db1库里面的表进行校验:
[root@drbd-01 ~]# sh checksum.sh root "123" localhost 3306 db1
4.3、到 /home/mysql/checksum/目录下查看生成的校验值:
[root@drbd-01 ~]# cat /home/mysql/checksum/db1.checksum
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| TABLE_NAME | CHECKSUM |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| t1 | 77073096 |
4.4、重复上述4.2步骤,对其他机器上的数据库也生成校验码;
4.5、对比两个机器生成的校验码,如果值不同,表明对比的两张表数据不一样。
完。
一、原理:采用CRC32算法进行校验。那么什么是CRC32算法呢?CRC32算法 的计算是非常非常非常严格的。严格到什么程度呢?你的程序只要被改动了一个字节(甚至只是大小写的改动),它的值就会跟原来的不同。所以只要给你的“原”程序计算好CRC值,储存在某个地方,然后在程序中随机地再对文件进行CRC校验,接着跟第一次生成并保存好的CRC值进行比较,如果相等的话就说明你的程序没有被修改/破解过,如果不等的话,那么很可能你的程序遭到了病毒的感染,或者被Cracker用16进制工具暴力破解过了。
二、脚本内容
[root@drbd-01 ~]#cat checksum.sh
#!/bin/bash
split=`echo + -{1..86} +| tr -d "[0-9]|"`
echo $split > /home/mysql/checksum/$5.checksum
printf "| %-40s | %-40s| n" TABLE_NAME CHECKSUM >> /home/mysql/checksum/$5.checksum
echo $split >> /home/mysql/checksum/$5.checksum
for table_name in `mysql -u$1 -p$2 -h$3 -P$4 -BNe "select table_name from information_schema.tables where table_schema='$5' and table_type='base table';"`
do
column_name=`mysql -u$1 -p$2 -h$3 -P$4 -BNe "select column_name from information_schema.columns where table_schema='$5' and table_name='$table_name';"|tr 'n' ','|sed 's/,/`,`/g'|sed 's/^/`/'|sed 's/,`$//'`
if_one_column=`echo $column_name|grep ,`
if [ -z $if_one_column ];then
checksum=`mysql -u$1 -p$2 -h$3 -P$4 -BNe "select sql_no_cache COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32($column_name) AS UNSIGNED)), 10, 16)), 0) as checksum from $5.$table_name;"`
else
checksum=`mysql -u$1 -p$2 -h$3 -P$4 -BNe "select sql_no_cache COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('',$column_name)) AS UNSIGNED)), 10, 16)), 0) as checksum from $5.$table_name;"`
fi
printf "| %-40s | %-40s| n" $table_name $checksum >> /home/mysql/checksum/$5.checksum
done
echo $split >> /home/mysql/checksum/$5.checksum
三、执行脚本的方法
sh checksum.sh user passwd localhost 3306 dbname
四、例子
4.1、建立一个如下目录,用来存放校验码:
[root@drbd-01 ~]#mkdir /home/mysql/checksum/
4.2、如下方法执行脚本,用来对db1库里面的表进行校验:
[root@drbd-01 ~]# sh checksum.sh root "123" localhost 3306 db1
4.3、到 /home/mysql/checksum/目录下查看生成的校验值:
[root@drbd-01 ~]# cat /home/mysql/checksum/db1.checksum
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| TABLE_NAME | CHECKSUM |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| t1 | 77073096 |
4.4、重复上述4.2步骤,对其他机器上的数据库也生成校验码;
4.5、对比两个机器生成的校验码,如果值不同,表明对比的两张表数据不一样。
完。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28916011/viewspace-1854138/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28916011/viewspace-1854138/
最后
以上就是秀丽毛巾为你收集整理的比较两个mysql数据库里面的表是否相同的一个校验脚本的全部内容,希望文章能够帮你解决比较两个mysql数据库里面的表是否相同的一个校验脚本所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复