何时需要校验数据?难道线上业务跑的好好的,我们需要定期校验数据?能在线定期校验数据必然很好,但实际已经提供线上服务了,并且提供服务之前数据和源一样,同步不出错,默认数据一致。当MySQL需要扩容新增从库、从库故障恢复后、MySQL大版本升级或者某个database、表从A导入B,需校验数据一致性。
一、校验数据方法:
1、mysql checksum table
checksum table $tablename;
2、CRC32校验
for one_table in ${tables}
do
col=${mysql_login} -NBe “select COLUMN_NAME from information_schema.columns where table_name=’$one_table’;”
#echo $col
count=0
col_crcs=""
for one_col in $col
do
if [ ${count} -eq 0 ]
then
col_crcs="${col_crcs}sum(crc32(${one_col}))"
else
col_crcs="${col_crcs},sum(crc32(${one_col}))"
fi
count=$((count+1))
done
sql=“use ${one_DB};select ${col_crcs} from ${one_DB}.${one_table};”
3、pt_sync_check原理校验
for t in ${tables}
do
columns=${log_in} -NBe “select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=’${t}’”
echo $columns
num=0
check_sql=""
for column in $columns
do
if [ $num -eq 0 ]
then
check_sql="’#’"
else
check_sql="${check_sql},${column}"
fi
num=$((num+1))
done
sql=“use ${one_DB};select COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS(${check_sql}) ) AS UNSIGNED)), 10, 16)), 0) AS crc from $t;”
以上三种校验方法适用于同版本mysql。
4、mysqldump出数据
生产环境中,会根据业务场景、mysql性能情况,进行mysql大版本升级;跨版本会出现一些新特性、表字段精度不同等情况;为了保证数据不出错,可是将数据文件全部导出来,源和目标比较文件md5值。
`which mysqldump` --login-path=${name} --default-character-set=$DEFAULT_CHARACTER_SET --compact --skip-set-charset -n -t --tab=${DATA_DIR}/${DATABASE}
${MYSQLDUMP} ${DATABASE} ${TABLE}
md5sum ${DATA_DIR}/${DATABASE}/${TABLE}.txt >> tmp_md5.txt
需要空间保证数据可导出,时间会慢些。
二、怎么算数据一致
如果使用冷备份做新从库,或者停sql_thread 逻辑备份做从库数据,则在均不开启同步时校验一次;第二次校验在 同步一段时间binlog后,分别停同步,落后实例上执行start slave util master_log_file=’’,master_log_pos=;这两个点从两者数据多的一个取。
如果采用热备恢复数据,则使用第二次校验的方法。
选取合适校验方法,结果一致则数据一致;否则需要单独排查哪个表哪一行内容不正确,是版本升级问题还是其他问题。




