mysql誤刪數(shù)據(jù)快速恢復

相信后端研發(fā)的同學在開發(fā)過程經(jīng)常會遇到產(chǎn)品臨時修改線上數(shù)據(jù)的需求雌团,如果手法很穩(wěn)那么很慶幸可以很快完成任務萍恕,很不幸某一天突然手一抖把表里的數(shù)據(jù)修改錯誤或者誤刪了厅须,這個時候你會發(fā)現(xiàn)各種問題反饋接踵而來椿猎。如果身邊有BDA或者有這方面經(jīng)驗的同事那么可以很快解決這個問題硼被,如果沒有那么希望這篇文章可以幫到你示损。

binglog介紹

首先第一步保證mysql已經(jīng)開啟binlog,查看命令:

show variables like '%log_bin%'

mysql binlog分三種格式 :

Statement : 會在binlog中記錄每一條執(zhí)行修改數(shù)據(jù)的sql語句的相關信息嚷硫,優(yōu)點是不需要記錄每一行的變化检访,減少了binlog日志量,節(jié)約了IO
Row : 會在binlog中記錄每一修改語句的詳細信息仔掸,包括數(shù)據(jù)在修改之前和修改之后的數(shù)據(jù)的具體信息脆贵,好處是會清晰記錄每一條修改的詳細信息,不好的地方是會產(chǎn)生大量日志
Mixed :這種格式實際上就是Statement和Row的結(jié)合體起暮,如果遇到表結(jié)構(gòu)變更就會以Statement來記錄丹禀,如果涉及語句修改那么就以Row格式記錄

這里的binlog格式推薦row,my.cnf 的配置可參考 :

server_id = 1001
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
我們來模擬一些數(shù)據(jù):
CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(125) NOT NULL DEFAULT '' COMMENT '名稱',
  `age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年齡',
  `sex` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '性別',
  `deleted` tinyint(4) unsigned DEFAULT '0',
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表測試';
INSERT INTO `user` (`id`, `name`, `age`, `sex`, `deleted`, `created`)
VALUES
    (1, '小王', 21, 1),
    (2, '小張', 22, 1),
    (3, '小紅', 22, 0),
    (4, '小楠', 23, 0),
    (5, '小柱', 25, 1);

然后我們把數(shù)據(jù)全部刪掉

delete from `user`
數(shù)據(jù)恢復方法一 :

使用開源框架binlog2sql : https://github.com/danfengcao/binlog2sql
好處是成熟鞋怀,穩(wěn)定,上手難度比較低且可直接生成可執(zhí)行sql持搜,示例 :

python /binlog2sql/binlog2sql.py --flashback -h127.0.0.1 -P3306 -uroot -p'123456' -dlocal -tuser --start-file='mysql-bin.000038' --sql-type=DELETE --start-datetime='2017-12-17 19:39:33' --stop-datetime='2017-12-17 19:40:01' >/**/data6.sql

解析后的結(jié)果大概是這樣

INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小柱', '2017-12-18 13:21:52', 0, 25, 1, 5); #start 1890 end 2244 time 2017-12-19 09:20:26
INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小楠', '2017-12-18 13:21:52', 0, 23, 0, 4); #start 1890 end 2244 time 2017-12-19 09:20:26
INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小紅', '2017-12-18 13:21:52', 0, 22, 0, 3); #start 1890 end 2244 time 2017-12-19 09:20:26
INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小張', '2017-12-18 13:21:52', 0, 28, 1, 2); #start 1890 end 2244 time 2017-12-19 09:20:26
INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小王', '2017-12-18 13:21:52', 0, 21, 1, 1); #start 1890 end 2244 time 2017-12-19 09:20:26

參數(shù)--sql-type建議加上密似,因為可能會有其他類型語句生成干擾了執(zhí)行結(jié)果
如果是線上阿里云或者其他產(chǎn)品建議先去管理后臺找到事發(fā)時間的binlog日志下載下來,先在測試環(huán)境驗證數(shù)據(jù)回滾結(jié)果.

數(shù)據(jù)恢復方法二:

當線上數(shù)據(jù)出現(xiàn)錯誤的時候首先可以詢問具體操作人記錄時間點葫盼,這個時候可以借助mysql自帶的binlog解析工具mysqlbinlog残腌,具體位置在mysql安裝目錄**/mysql/bin/下,示例:

mysqlbinlog --base64-output=decode-rows -v --start-datetime="2017-12-15 17:48:49" --stop-datetime="2017-12-16 23:59:49" /usr/local/mysql/mysql-bin.000038 >/**/data.sql

如果是阿里云rds或者其他產(chǎn)品可通過遠程方式解析

mysqlbinlog --no-defaults -u賬號 -p密碼 -h ***.rds.aliyuncs.com --read-from-remote-server mysql-bin.000180 --base64-output=decode-rows -v > /data.sql

這里因為binlog文件默認是通過base64編碼過的贫导,所以需要加上--base64-output=decode-rows -v
解析后的格式大概是這樣的 :

### DELETE FROM `local`.`user`
### WHERE
###   @1=1
###   @2='小王'
###   @3=21
###   @4=1
###   @5=0
###   @6='2017-12-18 13:21:52'
### DELETE FROM `local`.`user`
### WHERE
###   @1=2
###   @2='小張'
###   @3=28
###   @4=1
###   @5=0
###   @6='2017-12-18 13:21:52'
....

仔細查看這種格式文件抛猫,發(fā)現(xiàn)這種格式文件并不能直接執(zhí)行,但是在where條件后面記錄了被刪除之前的原始數(shù)據(jù)孩灯,需要借助sed闺金、awk把SQL文本轉(zhuǎn)換成真正的SQL》宓担或者當你在遇到開源框架解決不了的情況下败匹,可以根據(jù)具體場景嘗試手動把這種格式的文件解析成可執(zhí)行的sql語句寨昙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掀亩,隨后出現(xiàn)的幾起案子舔哪,更是在濱河造成了極大的恐慌,老刑警劉巖槽棍,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捉蚤,死亡現(xiàn)場離奇詭異,居然都是意外死亡炼七,警方通過查閱死者的電腦和手機缆巧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來特石,“玉大人盅蝗,你說我怎么就攤上這事∧氛海” “怎么了墩莫?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逞敷。 經(jīng)常有香客問我狂秦,道長,這世上最難降的妖魔是什么推捐? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任裂问,我火速辦了婚禮,結(jié)果婚禮上牛柒,老公的妹妹穿的比我還像新娘堪簿。我一直安慰自己,他們只是感情好皮壁,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布椭更。 她就那樣靜靜地躺著,像睡著了一般蛾魄。 火紅的嫁衣襯著肌膚如雪虑瀑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天滴须,我揣著相機與錄音舌狗,去河邊找鬼。 笑死扔水,一個胖子當著我的面吹牛痛侍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魔市,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼恋日,長吁一口氣:“原來是場噩夢啊……” “哼膀篮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岂膳,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤誓竿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谈截,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筷屡,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年簸喂,在試婚紗的時候發(fā)現(xiàn)自己被綠了毙死。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡喻鳄,死狀恐怖扼倘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情除呵,我是刑警寧澤再菊,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站颜曾,受9級特大地震影響纠拔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泛豪,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一稠诲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诡曙,春花似錦臀叙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荠雕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驶赏,已是汗流浹背炸卑。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煤傍,地道東北人盖文。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像蚯姆,于是被迫代替她去往敵國和親五续。 傳聞我的和親對象是個殘疾皇子洒敏,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容