婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL閃回(flashback)原理與實戰(zhàn)

MySQL閃回(flashback)原理與實戰(zhàn)

熱門標簽:地圖簡圖標注 南通電銷外呼系統(tǒng)哪家強 手機外呼系統(tǒng)違法嗎 谷歌地圖標注位置圖解 如何選擇優(yōu)質(zhì)的外呼系統(tǒng) 東莞外呼企業(yè)管理系統(tǒng) 清遠申請400電話 桂林云電銷機器人收費 沈陽智能外呼系統(tǒng)供應(yīng)商

DBA或開發(fā)人員,有時會誤刪或者誤更新數(shù)據(jù),如果是線上環(huán)境并且影響較大,就需要能快速回滾。傳統(tǒng)恢復(fù)方法是利用備份重搭實例,再應(yīng)用去除錯誤sql后的binlog來恢復(fù)數(shù)據(jù)。此法費時費力,甚至需要停機維護,并不適合快速回滾。也有團隊利用LVM快照來縮短恢復(fù)時間,但快照的缺點是會影響mysql的性能。

MySQL閃回(flashback)利用binlog直接進行回滾,能快速恢復(fù)且不用停機。本文將介紹閃回原理,給出筆者的實戰(zhàn)經(jīng)驗,并對現(xiàn)存的閃回工具作比較。

開胃菜

某天,小明因種種原因,誤刪了大批線上用戶表的數(shù)據(jù)。他急忙找到公司DBA請求幫助,“客服電話已被打爆,大量用戶投訴無法登陸,領(lǐng)導(dǎo)非常惱火。請問多久能恢復(fù)數(shù)據(jù)?”DBA一臉懵逼,沉默十秒后,伸出一根手指。“你的意思是一分鐘就能恢復(fù)?太好了。”小明終于有些放松,露出了一絲笑容。“不,我們中有個人將會離開公司。”DBA沉痛的說道。

勿讓悲劇發(fā)生,盡早將此文轉(zhuǎn)給公司DBA。

閃回原理

binlog概述

MySQL binlog以event的形式,記錄了MySQL server從啟用binlog以來所有的變更信息,能夠幫助重現(xiàn)這之間的所有變化。MySQL引入binlog主要有兩個目的:一是為了主從復(fù)制;二是某些備份還原操作后需要重新應(yīng)用binlog。

有三種可選的binlog格式,各有優(yōu)缺點:

  1. statement:基于SQL語句的模式,binlog數(shù)據(jù)量小,但是某些語句和函數(shù)在復(fù)制過程可能導(dǎo)致數(shù)據(jù)不一致甚至出錯;
  2. row:基于行的模式,記錄的是行的完整變化。很安全,但是binlog會比其他兩種模式大很多;
  3. mixed:混合模式,根據(jù)語句來選用是statement還是row模式;

利用binlog閃回,需要將binlog格式設(shè)置為row。row模式下,一條使用innodb的insert會產(chǎn)生如下格式的binlog:

# at 1129
#161225 23:15:38 server id 3773306082 end_log_pos 1197     Query  thread_id=1903021    exec_time=0   error_code=0
SET TIMESTAMP=1482678938/*!*/;
BEGIN
/*!*/;
# at 1197
#161225 23:15:38 server id 3773306082 end_log_pos 1245     Table_map: `test`.`user` mapped to number 290
# at 1245
#161225 23:15:38 server id 3773306082 end_log_pos 1352     Write_rows: table id 290 flags: STMT_END_F

BINLOG '
muJfWBPiFOjgMAAAAN0EAAAAACIBAAAAAAEABHRlc3QABHVzZXIAAwMPEQMeAAAC
muJfWB7iFOjgawAAAEgFAAAAACIBAAAAAAEAAgAD//gBAAAABuWwj+i1tVhK1hH4AgAAAAblsI/p
krFYStYg+AMAAAAG5bCP5a2ZWE/onPgEAAAABuWwj+adjlhNeAD4BQAAAAJ0dFhRYJM=
'/*!*/;
# at 1352
#161225 23:15:38 server id 3773306082 end_log_pos 1379     Xid = 5327954
COMMIT/*!*/;

閃回原理

既然binlog以event形式記錄了所有的變更信息,那么我們把需要回滾的event,從后往前回滾回去即可。

對于單個event的回滾,我們以表test.user來演示原理

mysql> show create table test.user\G
*************************** 1. row ***************************
    Table: user
Create Table: CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

對于delete操作,我們從binlog提取出delete信息,生成的回滾語句是insert。(注:為了方便解釋,我們用binlog2sql將原始binlog轉(zhuǎn)化成了可讀SQL)

 原始:DELETE FROM `test`.`user` WHERE `id`=1 AND `name`='小趙';
 回滾:INSERT INTO `test`.`user`(`id`, `name`) VALUES (1, '小趙');


對于insert操作,回滾SQL是delete。

 原始:INSERT INTO `test`.`user`(`id`, `name`) VALUES (2, '小錢');
 回滾:DELETE FROM `test`.`user` WHERE `id`=2 AND `name`='小錢';


對于update操作,回滾sql應(yīng)該交換SET和WHERE的值。

 原始:UPDATE `test`.`user` SET `id`=3, `name`='小李' WHERE `id`=3 AND `name`='小孫';
 回滾:UPDATE `test`.`user` SET `id`=3, `name`='小孫' WHERE `id`=3 AND `name`='小李';

閃回實戰(zhàn)

真實的閃回場景中,最關(guān)鍵的是能快速篩選出真正需要回滾的SQL。

我們使用開源工具binlog2sql來進行實戰(zhàn)演練。binlog2sql由美團點評DBA團隊(上海)出品,多次在線上環(huán)境做快速回滾。

首先我們安裝binlog2sql:

shell> git clone https://github.com/danfengcao/binlog2sql.git  cd binlog2sql
shell> pip install -r requirements.txt

背景:小明在11:44時誤刪了test庫user表大批的數(shù)據(jù),需要緊急回滾。

test庫user表原有數(shù)據(jù)

mysql> select * from user;
+----+--------+---------------------+
| id | name  | addtime       |
+----+--------+---------------------+
| 1 | 小趙  | 2013-11-11 00:04:33 |
| 2 | 小錢  | 2014-11-11 00:04:48 |
| 3 | 小孫  | 2016-11-11 20:25:00 |
| 4 | 小李  | 2013-11-11 00:00:00 |
.........
+----+--------+---------------------+
16384 rows in set (0.04 sec)

11:44時,user表大批數(shù)據(jù)被誤刪除。與此同時,正常業(yè)務(wù)數(shù)據(jù)是在繼續(xù)寫入的

mysql> delete from user where addtime>'2014-01-01';
Query OK, 16128 rows affected (0.18 sec)

mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
|   261 |
+----------+

恢復(fù)數(shù)據(jù)步驟:

登錄mysql,查看目前的binlog文件

mysql> show master logs;
+------------------+-----------+
| Log_name     | File_size |
+------------------+-----------+
| mysql-bin.000053 | 168652863 |
| mysql-bin.000054 |  504549 |
+------------------+-----------+

最新的binlog文件是mysql-bin.000054。我們的目標是篩選出需要回滾的SQL,由于誤操作人只知道大致的誤操作時間,我們首先根據(jù)時間做一次過濾。只需要解析test庫user表。(注:如果有多個sql誤操作,則生成的binlog可能分布在多個文件,需解析多個文件)

shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -tuser --start-file='mysql-bin.000054' --start-datetime='2016-12-26 11:44:00' --stop-datetime='2016-12-26 11:50:00' > /tmp/raw.sql
raw.sql 輸出:
DELETE FROM `test`.`user` WHERE `addtime`='2014-11-11 00:04:48' AND `id`=2 AND `name`='小錢' LIMIT 1; #start 257427 end 265754 time 2016-12-26 11:44:56
DELETE FROM `test`.`user` WHERE `addtime`='2015-11-11 20:25:00' AND `id`=3 AND `name`='小孫' LIMIT 1; #start 257427 end 265754 time 2016-12-26 11:44:56
...
DELETE FROM `test`.`user` WHERE `addtime`='2016-12-14 23:09:07' AND `id`=24530 AND `name`='tt' LIMIT 1; #start 257427 end 504272 time 2016-12-26 11:44:56
INSERT INTO `test`.`user`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 32722, '小王'); #start 504299 end 504522 time 2016-12-26 11:49:42
...

根據(jù)位置信息,我們確定了誤操作sql來自同一個事務(wù),準確位置在257427-504272之間(binlog2sql對于同一個事務(wù)會輸出同樣的start position)。再根據(jù)位置過濾,使用 -B 選項生成回滾sql,檢查回滾sql是否正確。(注:真實場景下,生成的回滾SQL經(jīng)常會需要進一步篩選。結(jié)合grep、編輯器等)

shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -tuser --start-file='mysql-bin.000054' --start-position=257427 --stop-position=504272 -B > /tmp/rollback.sql
rollback.sql 輸出:
INSERT INTO `test`.`user`(`addtime`, `id`, `name`) VALUES ('2016-12-14 23:09:07', 24530, 'tt'); #start 257427 end 504272 time 2016-12-26 11:44:56
INSERT INTO `test`.`user`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 24529, '小李'); #start 257427 end 504272 time 2016-12-26 11:44:56
...
INSERT INTO `test`.`user`(`addtime`, `id`, `name`) VALUES ('2014-11-11 00:04:48', 2, '小錢'); #start 257427 end 265754 time 2016-12-26 11:44:56

 shell> wc -l /tmp/rollback.sql
16128 /tmp/rollback.sql

與業(yè)務(wù)方確認回滾sql沒問題,執(zhí)行回滾語句。登錄mysql,確認回滾成功。

 shell> mysql -h127.0.0.1 -P3306 -uadmin -p'admin'  /tmp/rollback.sql

 mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
|  16389 |
+----------+

TIPS

  • 閃回的關(guān)鍵是快速篩選出真正需要回滾的SQL。
  • 先根據(jù)庫、表、時間做一次過濾,再根據(jù)位置做更準確的過濾。
  • 由于數(shù)據(jù)一直在寫入,要確保回滾sql中不包含其他數(shù)據(jù)。可根據(jù)是否是同一事務(wù)、誤操作行數(shù)、字段值的特征等等來幫助判斷。
  • 執(zhí)行回滾sql時如有報錯,需要查實具體原因,一般是因為對應(yīng)的數(shù)據(jù)已發(fā)生變化。由于是嚴格的行模式,只要有唯一鍵(包括主鍵)存在,就只會報某條數(shù)據(jù)不存在的錯,不必擔心會更新不該操作的數(shù)據(jù)。
  • 如果待回滾的表與其他表有關(guān)聯(lián),要與開發(fā)說明回滾和不回滾各自的副作用,再確定方案。
  • 回滾后數(shù)據(jù)變化,可能對用戶和線上應(yīng)用造成困惑(類似幻讀)。

再重復(fù)下最重要的兩點:篩選出正確SQL!溝通清楚!

閃回工具

MySQL閃回特性最早由阿里彭立勛開發(fā),彭在2012年給官方提交了一個patch,并對閃回設(shè)計思路做了說明(設(shè)計思路很有啟發(fā)性,強烈推薦閱讀)。但是因為種種原因,業(yè)內(nèi)安裝這個patch的團隊至今還是少數(shù),真正應(yīng)用到線上的更是少之又少。彭之后,又有多位人員針對不同mysql版本不同語言開發(fā)了閃回工具,原理用的都是彭的思路。

我將這些閃回工具按實現(xiàn)方式分成了三類。

第一類是以patch形式集成到官方工具mysqlbinlog中。以彭提交的patch為代表。

優(yōu)點

上手成本低。mysqlbinlog原有的選項都能直接利用,只是多加了一個閃回選項。閃回特性未來有可能被官方收錄。
支持離線解析。

缺點

  • 兼容性差、項目活躍度不高。由于binlog格式的變動,如果閃回工具作者不及時對補丁升級,則閃回工具將無法使用。目前已有多位人員分別針對mysql5.5,5.6,5.7開發(fā)了patch,部分項目代碼公開,但總體上活躍度都不高。
  • 難以添加新功能,實戰(zhàn)效果欠佳。在實戰(zhàn)中,經(jīng)常會遇到現(xiàn)有patch不滿足需求的情況,比如要加個表過濾,很簡單的一個需求,代碼改動也不會大,但對大部分DBA來說,改mysql源碼還是很困難的事。
  • 安裝稍顯麻煩。需要對mysql源碼打補丁再編譯生成。

這些缺點,可能都是閃回沒有流行開來的原因。

第二類是獨立工具,通過偽裝成slave拉取binlog來進行處理。以binlog2sql為代表。

優(yōu)點

  • 兼容性好。偽裝成slave拉binlog這項技術(shù)在業(yè)界應(yīng)用的非常廣泛,多個開發(fā)語言都有這樣的活躍項目,MySQL版本的兼容性由這些項目搞定,閃回工具的兼容問題不再突出。
  • 添加新功能的難度小。更容易被改造成DBA自己喜歡的形式。更適合實戰(zhàn)。
  • 安裝和使用簡單。

缺點

必須開啟MySQL server。

第三類是簡單腳本。先用mysqlbinlog解析出文本格式的binlog,再根據(jù)回滾原理用正則進行匹配并替換。

優(yōu)點

  • 腳本寫起來方便,往往能快速搞定某個特定問題。
  • 安裝和使用簡單。
  • 支持離線解析。

缺點

  • 通用性不好。
  • 可靠性不好。

就目前的閃回工具而言,線上環(huán)境的閃回,筆者建議使用binlog2sql,離線解析使用mysqlbinlog。

關(guān)于DDL的flashback

本文所述的flashback僅針對DML語句的快速回滾。但如果誤操作是DDL的話,是無法利用binlog做快速回滾的,因為即使在row模式下,binlog對于DDL操作也不會記錄每行數(shù)據(jù)的變化。要實現(xiàn)DDL快速回滾,必須修改MySQL源碼,使得在執(zhí)行DDL前先備份老數(shù)據(jù)。目前有多個mysql定制版本實現(xiàn)了DDL閃回特性,阿里林曉斌團隊提交了patch給MySQL官方,MariaDB預(yù)計在不久后加入包含DDL的flashback特性。DDL閃回的副作用是會增加額外存儲。考慮到其應(yīng)用頻次實在過低,本文不做詳述,有興趣的同學(xué)可以自己去了解,重要的幾篇文章我在參考資料中做了引用。

有任何問題,或有mysql閃回相關(guān)的優(yōu)秀工具優(yōu)秀文章遺漏,煩請告知。

您可能感興趣的文章:
  • 在MySQL中使用mysqlbinlog flashback的簡單教程
  • Oracle 11g 新特性 Flashback Data Archive 使用實例
  • oracle中誤刪除表后恢復(fù)語句(FLASHBACK)

標簽:天津 常德 貴州 重慶 湖州 臨沂 成都 內(nèi)蒙古

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MySQL閃回(flashback)原理與實戰(zhàn)》,本文關(guān)鍵詞  MySQL,閃回,flashback,原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL閃回(flashback)原理與實戰(zhàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL閃回(flashback)原理與實戰(zhàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕av资源一区| 欧美在线观看一区二区| 亚洲国产另类av| 亚洲午夜电影在线| 豆国产96在线|亚洲| www.在线成人| 日韩欧美国产精品一区| 日本特黄久久久高潮| 色视频一区二区| 国产精品白丝jk白祙喷水网站 | 亚洲国产毛片aaaaa无费看| 午夜精品久久久久久久| 91小宝寻花一区二区三区| 日韩毛片视频在线看| 欧美精品一区二区三区很污很色的 | 亚洲国产精品综合小说图片区| 国产乱国产乱300精品| 91精品国产一区二区三区蜜臀| 中文字幕第一区| 国产一区二区0| 国产三级欧美三级日产三级99| 色噜噜狠狠色综合欧洲selulu| 日韩欧美在线123| 性欧美疯狂xxxxbbbb| 成人高清视频在线| 国产精品久久久久三级| av在线不卡电影| 亚洲色欲色欲www| 色域天天综合网| 精品1区2区3区| 久久er99热精品一区二区| 国产午夜久久久久| 亚洲人妖av一区二区| 欧美色区777第一页| 天天色综合成人网| 精品毛片乱码1区2区3区| 首页亚洲欧美制服丝腿| 在线不卡中文字幕| 国产传媒欧美日韩成人| 国产精品视频yy9299一区| 成人午夜短视频| 精品国产免费久久| 国产香蕉久久精品综合网| 9191久久久久久久久久久| 亚洲国产日韩a在线播放性色| 国产福利91精品| 久久久精品欧美丰满| 国产精品12区| 久久精品亚洲麻豆av一区二区| 看国产成人h片视频| 7777精品久久久大香线蕉 | 精品国产91乱码一区二区三区| 亚洲同性同志一二三专区| 成人毛片老司机大片| 国产精品久久久久久久久免费樱桃| 成人激情动漫在线观看| 夜夜亚洲天天久久| 日韩一卡二卡三卡国产欧美| 日韩高清一区在线| 日韩欧美一二区| 懂色av一区二区在线播放| 日韩电影免费在线| 不卡一区在线观看| 日本中文字幕一区| 国产精品久久久久久福利一牛影视| 在线日韩av片| 亚洲免费毛片网站| 欧美一二三在线| 91日韩在线专区| 亚洲国产精品综合小说图片区| 国产精品九色蝌蚪自拍| 欧美大尺度电影在线| 日本韩国欧美在线| 国产成人免费在线观看| 亚洲另类在线一区| 欧美一区2区视频在线观看| 亚洲二区在线视频| 欧美α欧美αv大片| 色综合中文字幕国产 | 裸体在线国模精品偷拍| 国产精品入口麻豆九色| 色偷偷一区二区三区| www久久久久| 国产午夜精品一区二区三区嫩草| 51精品国自产在线| 欧美成人一区二区三区| 国产乱对白刺激视频不卡| www.99精品| 日韩精品1区2区3区| 精品成人私密视频| 国产人成亚洲第一网站在线播放| 成人午夜在线视频| 国产剧情av麻豆香蕉精品| 日韩亚洲欧美成人一区| 制服丝袜亚洲精品中文字幕| 99久久国产综合精品色伊 | 韩国欧美国产1区| 日本一道高清亚洲日美韩| 日韩一区中文字幕| 99久久99久久精品国产片果冻| 加勒比av一区二区| 在线不卡中文字幕播放| 蜜桃91丨九色丨蝌蚪91桃色| 毛片av一区二区三区| 色综合久久综合网| 日韩黄色免费电影| 五月天亚洲婷婷| 亚洲在线视频免费观看| 国产激情一区二区三区| 男男视频亚洲欧美| 成人精品免费网站| 欧美人牲a欧美精品| 91极品美女在线| 久久精品一级爱片| 盗摄精品av一区二区三区| 亚洲已满18点击进入久久| 日韩av不卡一区二区| 日韩午夜电影av| 欧美一区二区在线免费观看| 国产大陆精品国产| 欧美在线视频全部完| 欧亚一区二区三区| 国产精品亲子伦对白| 国产精品毛片久久久久久久| 久久久不卡影院| 国内精品伊人久久久久av影院| 一区二区三区日本| 亚洲高清在线视频| 成人av在线资源网站| 国产一区二区按摩在线观看| 一本久久综合亚洲鲁鲁五月天| 91精品国产综合久久福利软件| 美女视频网站久久| 丁香婷婷综合网| 欧美在线不卡视频| 亚洲综合色在线| 激情综合色综合久久| 精品国产91九色蝌蚪| 亚洲一区二区三区影院| 99久久精品情趣| 欧美精品一区二区三区蜜臀 | 不卡区在线中文字幕| 日本精品裸体写真集在线观看| 国产亚洲精品7777| 午夜视频在线观看一区二区| 一本大道久久a久久综合 | 99久久久免费精品国产一区二区| 日韩精品一区二区三区蜜臀 | 亚洲一级片在线观看| 成人sese在线| 国产色综合一区| 欧美性大战久久久久久久蜜臀| 国产精品福利一区| 成人h精品动漫一区二区三区| 一区二区三区在线影院| 成人亚洲精品久久久久软件| 日韩欧美www| 91丨国产丨九色丨pron| 欧美大胆一级视频| 亚洲一区日韩精品中文字幕| 91麻豆文化传媒在线观看| 国产亚洲欧美在线| 亚洲一区在线视频观看| 国产欧美一区二区三区鸳鸯浴| 狠狠色综合播放一区二区| 一本一本大道香蕉久在线精品 | 爽爽淫人综合网网站| 91成人看片片| 日韩美女精品在线| 蜜桃av一区二区三区| 天涯成人国产亚洲精品一区av| 欧美理论在线播放| 亚洲va欧美va人人爽| 日韩欧美一级二级| 欧美xxxx在线观看| 国产精品久久久久影视| 美女一区二区久久| av在线播放不卡| 韩国视频一区二区| 五月激情六月综合| 国产精品国产自产拍高清av| 福利一区二区在线| 在线观看视频91| 日韩主播视频在线| 成人精品免费网站| 久久嫩草精品久久久精品一| 欧美成人精品3d动漫h| 日本免费新一区视频| 成人天堂资源www在线| 精品国产自在久精品国产| 国产成人一区二区精品非洲| 国产精品成人网| 国产成人a级片| 亚洲免费观看高清完整版在线观看| 日韩激情一二三区| 欧美色成人综合| 国产精品高潮久久久久无| 91久久精品日日躁夜夜躁欧美| 亚洲h在线观看| 欧美激情一区二区三区全黄|