MySQL快速對比資料技巧

2022-09-25 14:33:14 字數 1978 閱讀 4719

在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值相同,jbxzgy則這些行相同,如果不同,則證明存在差異,再按照這些行進行逐行對比。

假設我們按照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

當差異資料較少時,即使需要對比上千萬資料,我們可以輕鬆根據根據mi程式設計客棧n_id和max_id來快速定位到哪1000條資料裡存在差異,再進行逐行md5值對比,最終找到差異行。

最終對比圖:

ps:在使用group_concat時,需要配置mysql變數group_concat_max_len,預設值為1024,超出部分會被階段。

本文標題: mysql快速對比資料技巧

本文位址: /shujuku/mysql/219586.html

MySQL 如何快速對比資料

在mysql運維中,研發同事想對比下兩個不同例項上的資料並找出差異,除主鍵外還需要對比每乙個字段,如何做呢?第一種方案,寫程式將兩個例項上的每一行資料取出來進行對比,理論可行,但是對比時間較長。第二種方案,對每一行資料所有字段合併起來,取checksum值,再按照checksum值對比,看著可行,嘗...

MySQL 如何快速對比資料?

我們在mysql中想要對比下兩個不同的例項上的資料並且找出差異,除了主鍵之外我們還要對比每乙個字段,應該怎麼做呢?方案一 寫乙個程式將兩個例項裡面的每一行資料都分別取出來對比,但是耗時我們無法估計,大概天荒地老吧。方案二 對每一行資料所有字段合併起來,取checksum值,再按照checksum值對...

快速對比資料

例項需求 日常工作中經常需要對比資料,例如如下的參會名單,現在需要對比兩屆參會名單的異同,100個人的名單,看得老眼昏花也未必能夠準確的找出差異。strcompare 減少 trim strremove vbnewline 新增 trim stradd endfunction sub demo ms...