Mysql本身是沒有資料一致性的校正工具的(主要針對於master-slave), master-slave之間很容易出現資料不一致的情況,所以就有人開發出了這樣的工具,比較有名的是maatkit一系列工具,不過後台它貌似不更新了,現在主要由http://www.percona.com/doc/percona-toolkit/2.1/ percona 來維護。
其實maatkit這個工具去年就有瞭解過,因為當時總是覺得master-slave之間的資料有很大的不一致性,但是以前的那個庫主要是Myisam表,就不敢亂動,怕出現大量表死結的情況。
percona這套指令碼裡面有大量的功能,大多是一些統計之類的,但是還有幾個很牛逼的指令碼,簡單的說一下 pt-table-checksum和 pt-table-sync 。 用法自己看文檔就可以了,我主要說一下原理。
pt-table-checksum是檢驗兩個庫資料是否一致性的指令碼(也可以檢驗表)
pt-table-sync 是同步兩個庫(或者表)之間資料差異的指令碼
這兩個指令碼均使用Perl編寫,很長都有1W多行。
pt-table-checksum
pt-table-checksum 檢查資料一致性的方法主要是通過,對一張表按照一個合適的索引進行全表掃描,這個指令碼還是比較只能的,索引不合適他不執行,他會把一張表分為若干個trunk,比如果一張表有300W行,分為100個trunk,那麼每個trunk就是有3W行,他會鎖定這個trunk,進行計算checksum並匹配。
比如: master和slave都有一張表T,運行以下命令:
1 ./pt-table-checksum --create-replicate-table --host=`hostnmae -i` --databases=test --tables=t --port=4331 --explain -uroot -p123
第一次使用的話,這個參數不能少:--create-replicate-table ,因為他主要初始化系統庫。後面加--explain 能列印出更詳細的資訊,比如我這次的test.t表:
1 REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT ?, ?, ?, ?, ?, ?, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `a`, `b`, CONCAT(ISNULL(`a`), ISNULL(`b`)))) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `test`.`t` /*checksum table*/
上面這個語句會在主庫和從庫上都執行一下,通過計算的結果來判斷這個trunk的資料是否是一樣的。
他主要執行的就是這條語句,1W多行的Perl指令碼,就為了執行這個語句,其他的代碼主要是處理一些自適應的工作。
這個SQL看起來非常複雜,解釋一下他的原理吧:
它會把一個trunk裡面的每一行資料所有欄位拼成一個String,然後對String取32位校正碼,然後這個trunk內所有計算好的校正碼進行異或操作,從10進位轉換成16進位。從而主庫和從庫上都會有一個結果,叫做CRC,通過比較這個CRC判斷資料是否一致。雖然操作是一個trunk一個trunk進行的,但是他會對每個trunk 做select for update 主要是擔心做Checksum的時候會有寫入,所以每個Checksum不適合太大,他會等待Slave和Mater完全同步後對這個trunk做一次CheckSum然後把CheckSum的結果存入表中,如果Slave和master 有延遲他會預設等待1S等完全同步再做CheckSum。
我測試了一下,一個50G左右的表,跑一下指令碼,應該在一個小時之內就搞定了。
系統庫裡面有一張表就是專門用來存每一個trunk的校正結果的。
pt-table-sync
pt-table-sync 這個工具和pt-table-checksum原理類似,也是先找資料不一致的trunk,找到以後他會逐行進行比較,如果這張表沒有主鍵的話,這個過程是不能成功的,因為沒有主鍵的話無法判斷資料是否是一樣的,如果兩個trunk之間的資料差異比較小的話,會有update操作搞定他,如果發現不一致的非常多,則就會進行重建從庫上的表。
參考資料:
<a href='http://likydba-wordpress.stor.sinaapp.com/uploads/2012/08/Percona_Toolkit_2_1_2_Operations_Manual.pdf'>Percona_Toolkit_2_1_2_Operations_Manual</a>