ITPub博客

首页 > 数据库 > MySQL > 比较两个mysql数据库里面的表是否相同的一个校验脚本

比较两个mysql数据库里面的表是否相同的一个校验脚本

原创 MySQL 作者:czxin788 时间:2015-12-05 20:21:56 0 删除 编辑
比较两个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、对比两个机器生成的校验码,如果值不同,表明对比的两张表数据不一样。


完。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28916011/viewspace-1854138/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-06-03

  • 博文量
    185
  • 访问量
    584540