校驗原理
1、將每條資料需要比對的欄位拼接成為字串,欄位順序需要一致。
2、使用md5摘要演算法對字串進行轉換,生產該條資料的checksum,大多數情況checksum會比原始字串短,便於使用
3、百萬資料建議使用聚合比對轉步驟4,不使用聚合直接轉步驟6
4、對多條資料進行聚合,生成對對應checksum,用於批次資料校驗,加快校驗速度。
5、比對不同資料來源中的聚合checksum,找出不一樣的批次。
6、逐條比對(不一致批次內的)每一條記錄的checksum,找出不一致的資料
7、對不一致的資料進行同步處理
資料行checksum
1、使用concat函式將需要比對字串拼接成checkString
2、使用ifnull函式,因為當資料為null時,concat不生效
3、使用md5函式生成摘要字串,即checksum
select id,username,phone,sex,
concat(
ifnull(username,''),
ifnull(phone,''),
ifnull(sex,'')
) as check_str,
md5(
concat(
ifnull(username,''),
ifnull(phone,''),
ifnull(sex,'')
)
)
from t_user;
欄位拼接小技巧,快速獲取欄位的拼接sql,注意欄位排序,保證順序一致
select group_concat('ifnull(',column_name,','''')' order by ordinal_position asc )
from information_schema.columns
where table_schema = 'company' and table_name = 't_user'
聚合checksum
按照id大小進行分組統計
對單條checksum生成分組聚合的checksum
顯示每組的最大最小id和記錄數,便於比對和後續處理。
使用div進行分組,根據資料量多少進行調整
如果資料量百億,可以按照該方法進行多級聚合。
select
min(id) as minID,
max(id) as maxID,
count(1) as rowCnt,
md5(
group_concat(
md5(
concat(
ifnull(username,''),
ifnull(phone,''),
ifnull(sex,'')
)
)
order by id asc
)
) as checksum
from t_user
group by (id div 1000)
注意:表為空則不需要進行checksum,先判斷一下。
id必須是主鍵,唯一鍵可能為空。資料判斷可能出錯。
div的除數不能為0
==================== 雲資料庫 校驗方法 ==============
例如:阿里雲RDS,百度雲RDS,騰訊雲RDS,華為雲RDS等。
都有對應的校驗工具。可表結構校驗,全量資料校驗。。