您好,登錄后才能下訂單哦!
小編給大家分享一下MySQL快速對比數據技巧的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
在MySQL運維中,研發同事想對比下兩個不同實例上的數據并找出差異,除主鍵外還需要對比每一個字段,如何做呢?
第一種方案,寫程序將兩個實例上的每一行數據取出來進行對比,理論可行,但是對比時間較長。
第二種方案,對每一行數據所有字段合并起來,取checksum值,再按照checksum值對比,看著可行,嘗試下。
首先要合并所有字段的值,選用MySQL提供的CONCAT函數,如果CONCAT函數中包含NULL值,會導致最終結果為NULL,因此需要使用IFNULL函數來替換NULL值,如:
CONCAT(IFNULL(C1,''),IFNULL(C2,''))
加入表有很多行,手動拼個腳本比較累,別急,可以使用information_schema.COLUMNS來處理:
## 獲取列名的拼接串 SELECT GROUP_CONCAT('IFNULL(',COLUMN_NAME,','''')') FROM information_schema.COLUMNS WHERE TABLE_NAME='table_name';
假設我們有測試表:
CREATE TABLE t_test01 ( id INT AUTO_INCREMENT PRIMARY KEY, C1 INT, C2 INT )
我們便可以拼接出下面的SQL:
SELECT id, MD5(CONCAT( IFNULL(id,''), IFNULL(c1,''), IFNULL(c2,''), )) AS md5_value FROM t_test01
在兩個實例上執行下,然后把結果使用beyond compare對比下,就很容易找出不相同的行以及主鍵ID
對于數據量較大的表,執行出來的結果集也很大,對比起來比較費勁,那就先嘗試縮小結果集,可以將多行記錄的md5值合并起來求MD5值,如果最后MD5值相同,則這些行相同,如果不同,則證明存在差異,再按照這些行進行逐行對比。
假設我們按照1000行一組來進行對比,如果需要將分組后的結果合并,需要使用GROUP_CONCAT函數,注意在GROUP_CONCAT函數中添加排序保證合并數據的順序, SQL如下:
SELECT min(id) as min_id, max(id) as max_id, count(1) as row_count, MD5(GROUP_CONCAT( MD5(CONCAT( IFNULL(id,''), IFNULL(c1,''), IFNULL(c2,''), )) ORDER BY id ))AS md5_value FROM t_test01 GROUP BY (id div 1000)
執行結果為:
min_id max_id row_count md5_value 0 999 1000 7d49def23611f610849ef559677fec0c 1000 1999 1000 95d61931aa5d3b48f1e38b3550daee08 2000 2999 1000 b02612548fae8a4455418365b3ae611a 3000 3999 1000 fe798602ab9dd1c69b36a0da568b6dbb
當差異數據較少時,即使需要對比上千萬數據,我們可以輕松根據根據min_id和max_id來快速定位到哪1000條數據里存在差異,再進行逐行MD5值對比,最終找到差異行。
最終對比圖:
PS:
在使用GROUP_CONCAT時,需要配置MySQL變量group_concat_max_len,默認值為1024,超出部分會被階段。
看完了這篇文章,相信你對“MySQL快速對比數據技巧的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。