MySQL快速對比數(shù)據(jù)技巧
在MySQL運(yùn)維中,研發(fā)同事想對比下兩個(gè)不同實(shí)例上的數(shù)據(jù)并找出差異,除主鍵外還需要對比每一個(gè)字段,如何做呢?
第一種方案,寫程序?qū)蓚€(gè)實(shí)例上的每一行數(shù)據(jù)取出來進(jìn)行對比,理論可行,但是對比時(shí)間較長。
第二種方案,對每一行數(shù)據(jù)所有字段合并起來,取checksum值,再按照checksum值對比,看著可行,嘗試下。
首先要合并所有字段的值,選用MySQL提供的CONCAT函數(shù),如果CONCAT函數(shù)中包含NULL值,會導(dǎo)致最終結(jié)果為NULL,因此需要使用IFNULL函數(shù)來替換NULL值,如:
CONCAT(IFNULL(C1,''),IFNULL(C2,''))
加入表有很多行,手動拼個(gè)腳本比較累,別急,可以使用information_schema.COLUMNS來處理:
## 獲取列名的拼接串 SELECT GROUP_CONCAT('IFNULL(',COLUMN_NAME,','''')') FROM information_schema.COLUMNS WHERE TABLE_NAME='table_name';
假設(shè)我們有測試表:
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
在兩個(gè)實(shí)例上執(zhí)行下,然后把結(jié)果使用beyond compare對比下,就很容易找出不相同的行以及主鍵ID
對于數(shù)據(jù)量較大的表,執(zhí)行出來的結(jié)果集也很大,對比起來比較費(fèi)勁,那就先嘗試縮小結(jié)果集,可以將多行記錄的md5值合并起來求MD5值,如果最后MD5值相同,則這些行相同,如果不同,則證明存在差異,再按照這些行進(jìn)行逐行對比。
假設(shè)我們按照1000行一組來進(jìn)行對比,如果需要將分組后的結(jié)果合并,需要使用GROUP_CONCAT函數(shù),注意在GROUP_CONCAT函數(shù)中添加排序保證合并數(shù)據(jù)的順序, 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)
執(zhí)行結(jié)果為:
min_id max_id row_count md5_value 0 999 1000 7d49def23611f610849ef559677fec0c 1000 1999 1000 95d61931aa5d3b48f1e38b3550daee08 2000 2999 1000 b02612548fae8a4455418365b3ae611a 3000 3999 1000 fe798602ab9dd1c69b36a0da568b6dbb
當(dāng)差異數(shù)據(jù)較少時(shí),即使需要對比上千萬數(shù)據(jù),我們可以輕松根據(jù)根據(jù)min_id和max_id來快速定位到哪1000條數(shù)據(jù)里存在差異,再進(jìn)行逐行MD5值對比,最終找到差異行。
最終對比圖:
PS:
在使用GROUP_CONCAT時(shí),需要配置MySQL變量group_concat_max_len,默認(rèn)值為1024,超出部分會被階段。
- mysql 5.7.20常用下載、安裝和配置方法及簡單操作技巧(解壓版免安裝)
- JavaWeb連接數(shù)據(jù)庫MySQL的操作技巧
- 利用tcpdump對mysql進(jìn)行抓包操作技巧
- 30個(gè)mysql千萬級大數(shù)據(jù)SQL查詢優(yōu)化技巧詳解
- Mysql根據(jù)時(shí)間查詢?nèi)掌诘膬?yōu)化技巧
- 提升MYSQL查詢效率的10個(gè)SQL語句優(yōu)化技巧
- MySQL使用的常見問題解決與應(yīng)用技巧匯總
- 5個(gè)保護(hù)MySQL數(shù)據(jù)倉庫的小技巧
- 分享101個(gè)MySQL調(diào)試與優(yōu)化技巧
- MySql Sql 優(yōu)化技巧分享
- MySQL注入繞開過濾的技巧總結(jié)
- MySQL數(shù)據(jù)庫常用操作技巧總結(jié)
相關(guān)文章
MYSQL5.7.24安裝沒有data目錄和my-default.ini及服務(wù)無法啟動的完美解決辦法
這篇文章主要介紹了MYSQL-5.7.24安裝,沒有data目錄和my-default.ini及服務(wù)無法啟動的解決辦法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11window系統(tǒng)mysql無法輸入和無法顯示中文的解決方法
這篇文章主要介紹了window系統(tǒng)mysql無法輸入和無法顯示中文的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06MySQL?數(shù)據(jù)庫?增刪查改、克隆、外鍵?等操作總結(jié)
這篇文章主要介紹了MySQL?數(shù)據(jù)庫?增刪查改、克隆、外鍵?等操作,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05mysql 忘記密碼的解決方法(linux和windows小結(jié))
下面是linux和windows下mysql丟失密碼的解決辦法2008-12-12windows?64位下mysql8.0.25安裝配置教程(最詳細(xì)!)
之前一直在用 5.7 版本,竟然一下子跳到 8.0了,下面這篇文章主要給大家介紹了關(guān)于在windows?64位下mysql8.0.25安裝配置教程,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03