mysql checksum用法_MySQL checksum理解_mysql
mysql checksum了解
在主從復(fù)制中Checksum常常需要對某些重要的表進(jìn)行一致性檢查。
Checksum Table在邏輯備份時候前后是否可以用于驗(yàn)證數(shù)據(jù)一致性。擴(kuò)展一下發(fā)現(xiàn)有一些有趣的問題,比如數(shù)據(jù)插入順序不同、表引擎不同、操作系統(tǒng)位數(shù)不同等。
插入順序不同是否有影響
我們知道全表掃描是可以有很多種順序的,尤其當(dāng)表里面出現(xiàn)過delete動作以后,邏輯導(dǎo)出再導(dǎo)入另外一個表后,兩個表的全表掃描結(jié)果可能不同。
Checksum table計(jì)算返回值的邏輯大致如下:
ha_checksum crc= 0; foreach(row in table) { row_crc= get_crc(row); crc+= row_crc; } return crc;
可以看到只要總行數(shù)以及行內(nèi)容相同,與讀取行的順序無關(guān)。
從這個邏輯還能得到一下幾個結(jié)論:
1)與使用的引擎無關(guān),也就是說即使主備不用同一個引擎,checksum也可用于檢查。雖然InnoDB有隱藏行,但這里無視。
2)與是否有索引無關(guān)。row_crc只用行本身的數(shù)據(jù)來計(jì)算,并不包括索引數(shù)據(jù)。
也就是說如果能夠保證兩個表里面的數(shù)據(jù)一樣,表結(jié)構(gòu)(列內(nèi)容和順序一樣),操作系統(tǒng)一樣,MySQL版本一致,是能夠保證checksum的結(jié)果的。
字段順序不同是否有影響
在個row計(jì)算row_crc時,是每個字段依次計(jì)算的。但計(jì)算過程中會將上一個字段的結(jié)果作為計(jì)算下一個值的輸入。
switch (f->type()) { case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_GEOMETRY: case MYSQL_TYPE_BIT: { String tmp; f->val_str(&tmp); row_crc= my_checksum(row_crc, (uchar*) tmp.ptr(), tmp.length()); break; } default: row_crc= my_checksum(row_crc, f->ptr, f->pack_length()); break; }
因此字段順序會影響結(jié)果。
字段長度不同是否有影響
即使看到相同的內(nèi)容,也有可能得到不同的checksum。
從上面計(jì)算每個field的crc上看,若為變長字段(varchar等),由于用于計(jì)算的是實(shí)際長度,因此不會影響。比如將表的varchar(20)字段改成varchar(25),不會改變checksum的值。
但若將char(20)改成char(25),或者int改成bigint,則會改變checksum。
操作系統(tǒng)位數(shù)不同
因?yàn)榉祷刂凳莡nsigned long,我們就擔(dān)心32位和64位機(jī)器的溢出問題。所幸在計(jì)算過程中的ha_myisam直接定義為uint32,只是在返回的時候才轉(zhuǎn)成unsigned long,因此無影響。
字符集不同
這個問題其實(shí)一直比較含糊。實(shí)際上與輸入字符集有關(guān)。但有一個結(jié)論是肯定的:若表里面字段的unhex()值相同,得到的checksum即相同。
通過下面的代碼進(jìn)行對表進(jìn)行檢查 返回一個唯一值
mysql > checksum table test ;
歡迎大家閱讀《MySQL checksum理解_mysql》,跪求各位點(diǎn)評,by 搞代碼
微信 賞一包辣條吧~
支付寶 賞一聽可樂吧~
總結(jié)
以上是生活随笔為你收集整理的mysql checksum用法_MySQL checksum理解_mysql的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHM源功能模块
- 下一篇: 基于stm32电子时钟设计