記錄一場Mysql刪除重複資料引發的風波

2021-10-06 04:24:52 字數 1178 閱讀 3424

像往常一樣, 韓大大例行處理著產品比巴的需求和資料處理任務。天知道今天怎麼就差點刪庫跑路了,這都是後話。下面進入正題,問題的起源來自乙個去重的任務,某大表中有業務邏輯中判斷為重複的資料 需要後台資料庫直接刪除。

我們用的資料庫是mysql,大表資料大概1000萬,每日凌晨備份,昨天上午10點左右要處理3900個重複資料,像oracle習慣那樣寫了去重sql 執行報錯,因為mysql不支援查詢某錶的同時刪除,所以想到了建立一張臨時表來儲存重複資料唯一主鍵id』,然後通過in id 來刪除。這看似都沒有問題,在資料庫一炮打響,沒有開啟事務的按鈕也就沒用, 天知道這貨居然清空了我的表,1000萬核心資料瞬間乾掉,當時大大心一沉,當然表面沒有變現出來,馬上想解決方案。

我腦子瞬間出現了兩個解決方式:1.恢復凌晨的備份,但是今天新增的23000+資料就會丟失 2.用我博學的知識儲備–baidu找找解決方案,記得有個binlog功能可以通過日誌恢復資料,前提是我們的雲上資料庫開啟了此功能。

顫顫巍巍的找了下,開啟了還好,這裡的linux操作交給了運維。於是我開始去找問題的原因,事故責任人sql如下: delete from score where id in (select id from score_copy); 其中score_copy的內容來自查重後的id,怎麼看都沒有問題,於是我又建了兩個小表新增了幾條資料去測試,沒有問題,證明sql是對的,於是陷入了僵局,此處省略幾個小時的掙扎,其中運維那裡運用binlog也不是很順利,因為binlog只有當前天內的執行指令碼, 所以恢復資料還是要首先恢復前一天的備份,然後log中取出來的sql都是殘疾,例如 update score set status = 然後後面具體的東西都沒了,後來據說是取了2.4g的log 然後連同查詢一起執行了, 整個恢復用時超過8小時。

好繼續**這個sql為什麼為乾掉整張表,偶然實驗中發現,score_copy中沒有資料時,執行刪除會刪除所有資料,但是很奇怪,裡面是有資料的,於是開啟了設計表,發現了字段前面竟然有空格,你沒看錯,欄位出了空格,於是查詢出來是空而不是報錯,真奇葩。附贈罪魁禍首建表sql:

建立中間表

create table score_copy(

id int primary key

)engine=innodb default charset utf8;

好了,如果大家不想痛苦,請謹慎嘗試此建表sql。再贈送乙個msyql恢復資料的部落格:tps: ,使用mysql的朋友一定要記得開啟binlog。

mysql刪除重複資料

最近遇到刪除重複資料的問題,先分享一下解決辦法,如有不完善之處還望包涵!舉例如下 mysql select from table03 id name degree 1 fly 90 2 fly 90 3 fly 90 4 fly 80 5 wang 90 6 wang 90 7 wang 90 8 ...

MySQL 刪除重複資料

建表,插入資料,當然如果你不想測試一下,也可以直接用後面的刪除語句 create table if not exists tb01 id int unsigned primary key auto increment,name varchar 10 not null insert into tb01...

mysql刪除重複資料

id 姓名 課程名稱 分數 1 張三 數學 69 2 李四 數學 89 3 張三 數學 69 刪除除了自動編號不同,其他都相同的學生冗餘資訊 完整的sql語句如下 delete from tablename where id not in select bid from select min id ...