比較兩個mysql資料庫裡面的表是否相同的一個校驗指令碼
比較兩個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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 比較兩個table是否相同
- 輸入兩個長度相同的字串,比較兩個數在相同位置的字元是否相同字串字元
- 比較兩個物件是否相同,輸出不同的屬性值(一)物件
- 如何比較兩個資料庫表結構的不同資料庫
- 比較兩個TABLE的資料是否完全一致
- 比較兩個表的資料差別
- 比較兩個資料庫的差異資料庫
- 比較兩個資料庫的表結構差異(轉)資料庫
- Same Tree 比較兩個二叉樹是否完全相同二叉樹
- PostgreSQL如何比較兩個表的定義是否一致SQL
- .NET CORE下最快比較兩個檔案內容是否相同的方法
- oracle資料庫兩表資料比較Oracle資料庫
- 比較兩個陣列是否相等陣列
- shell比較兩個字串是否相等字串
- 一個比較好的shell指令碼指令碼
- python如何比較兩個字串是否相等Python字串
- Oracle dblink比較兩個庫中的表欄位Oracle
- mysql比較兩個日期間隔MySql
- shell指令碼——比較兩個檔案大小、許可權指令碼
- lisp 裡的相等(相同)的比較Lisp
- 比較兩個的表結構差異
- 一套較全面的oracle資料庫監控管理指令碼Oracle資料庫指令碼
- 同一張表的兩個欄位比較查詢
- 一個比較完整的Inno Setup 安裝指令碼指令碼
- 關於資料庫物件版本比較的指令碼資料庫物件指令碼
- efcore 跨表查詢,實現一個介面內查詢兩個不同資料庫裡各自的表資料資料庫
- 在ABAP裡取得一個資料庫表記錄數的兩種方法資料庫
- 比較檔案是否相同,(比較MD5值)
- 一個比較float是否相等的工具類
- 我的一套較全面的oracle資料庫監控管理指令碼Oracle資料庫指令碼
- 用VBS比較兩個Excel檔案的資料Excel
- MySQL 一種比較經濟的資料庫MySql資料庫
- mysql 對比兩個表的一致性MySql
- python指令碼完成資料庫的一個表一個表的遷移到另一臺伺服器Python指令碼資料庫伺服器
- 技術分享 | 兩個單機 MySQL 該如何校驗資料一致性MySql
- 一個命令,生成資料庫物件的指令碼資料庫物件指令碼
- pg 資料庫HA 啟動指令碼的兩個假設資料庫指令碼
- Js 比較兩個物件的鍵名與鍵值是否相等JS物件