暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL数据校验方法

原创 小气鬼 2022-07-05
1630

何时需要校验数据?难道线上业务跑的好好的,我们需要定期校验数据?能在线定期校验数据必然很好,但实际已经提供线上服务了,并且提供服务之前数据和源一样,同步不出错,默认数据一致。当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=;这两个点从两者数据多的一个取。

如果采用热备恢复数据,则使用第二次校验的方法。

选取合适校验方法,结果一致则数据一致;否则需要单独排查哪个表哪一行内容不正确,是版本升级问题还是其他问题。

最后修改时间:2022-07-06 13:24:53
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论