电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

瀏覽:131日期:2022-06-14 17:36:07

由于運(yùn)維、DBA的誤操作或是業(yè)務(wù)bug,我們?cè)诓僮髦袝r(shí)不時(shí)會(huì)出現(xiàn)誤刪除數(shù)據(jù)情況。早期要想恢復(fù)數(shù)據(jù),只能讓業(yè)務(wù)人員根據(jù)線(xiàn)上操作日志,構(gòu)造誤刪除的數(shù)據(jù),或者DBA使用binlog和備份的方式恢復(fù)數(shù)據(jù),不管那種,都非常費(fèi)時(shí)費(fèi)力,而且容易出錯(cuò)。直到彭立勛首次在MySQL社區(qū)為mysqlbinlog擴(kuò)展了閃回功能。

在美團(tuán)點(diǎn)評(píng),我們也遇到過(guò)研發(fā)人員誤刪主站的配置信息,從而導(dǎo)致主站長(zhǎng)達(dá)2個(gè)小時(shí)不可用的情況。DBA同學(xué)當(dāng)時(shí)使用了技術(shù)團(tuán)隊(duì)自研的binlog2sql完成了數(shù)據(jù)恢復(fù),并多次挽救了線(xiàn)上誤刪數(shù)據(jù)導(dǎo)致的嚴(yán)重故障。不過(guò),binlog2sql在恢復(fù)速度上不盡如人意,因此我們開(kāi)發(fā)了一個(gè)新的工具——MyFlash,它很好地解決了上述痛點(diǎn),能夠方便并且高效地進(jìn)行數(shù)據(jù)恢復(fù)。

現(xiàn)在該工具正式開(kāi)源,開(kāi)源地址為: https://github.com/Meituan-Dianping/MyFlash 。

閃回工具現(xiàn)狀

先來(lái)看下目前市面上已有的恢復(fù)工具,我們從實(shí)現(xiàn)角度把它們劃分成如下幾類(lèi)。

① mysqlbinlog工具配合sed、awk。該方式先將binlog解析成類(lèi)SQL的文本,然后使用sed、awk把類(lèi)SQL文本轉(zhuǎn)換成真正的SQL。

優(yōu)點(diǎn):當(dāng)SQL中字段類(lèi)型比較簡(jiǎn)單時(shí),可以快速生成需要的SQL,且編程門(mén)檻也比較低。 缺點(diǎn):當(dāng)SQL中字段類(lèi)型比較復(fù)雜時(shí),尤其是字段中的文本包含HTML代碼,用awk、sed等工具時(shí),就需要考慮極其復(fù)雜的轉(zhuǎn)義等情況,出錯(cuò)概率很大。

② 給數(shù)據(jù)庫(kù)源碼打patch。該方式擴(kuò)展了mysqlbinlog的功能,增加Flashback選項(xiàng)。

優(yōu)點(diǎn):復(fù)用了MySQL Server層中binlog解析等代碼,一旦穩(wěn)定之后,無(wú)須關(guān)心復(fù)雜的字段類(lèi)型,且效率較高。 缺點(diǎn):在修改前,需要對(duì)MySQL的復(fù)制代碼結(jié)構(gòu)和細(xì)節(jié)需要較深的了解。版本比較敏感,在MySQL 5.6上做的patch,基本不能用于MySQL 5.7的回滾操作。升級(jí)困難,因?yàn)閜atch的代碼是分布在MySQL的各個(gè)文件和函數(shù)中,一旦MySQL代碼改變,特別是復(fù)制層的重構(gòu),升級(jí)的難度不亞于完全重新寫(xiě)一個(gè)。

③ 使用業(yè)界提供的解析binlog的庫(kù),然后進(jìn)行SQL構(gòu)造,其優(yōu)秀代表是binlog2sql。

優(yōu)點(diǎn):使用業(yè)界成熟的庫(kù),因此穩(wěn)定性較好,且上手難度較低。 缺點(diǎn):效率往往較低,且實(shí)現(xiàn)上受制于binlog庫(kù)提供的功能。

上述幾種實(shí)現(xiàn)方式,主要是提供的過(guò)濾選項(xiàng)較少,比如不能提供基于SQL類(lèi)型的過(guò)濾,需要回滾一個(gè)delete語(yǔ)句,導(dǎo)致在回滾時(shí),需要結(jié)合awk、sed等工具進(jìn)行篩選。

總結(jié)了上述幾種工具的優(yōu)缺點(diǎn),我認(rèn)為理想的閃回工具需要有以下特性。

a. 無(wú)需把binlog解析成文本,再進(jìn)行轉(zhuǎn)換。

b. 提供原生的基于庫(kù)、表、SQL類(lèi)型、位置、時(shí)間等多種過(guò)濾方式。

c. 支持MySQL多個(gè)版本。

d. 對(duì)于數(shù)據(jù)庫(kù)的代碼重構(gòu)不敏感,利于升級(jí)。

e. 自主掌控binlog解析,提供盡可能靈活的方式。

在這些特性中,binlog的解析是一切工作的基礎(chǔ)。接下來(lái)我會(huì)介紹binlog的基本結(jié)構(gòu)。

binlog格式初探 binlog格式概覽

一個(gè)完整的binlog文件是由一個(gè)format description event開(kāi)頭,一個(gè)rotate event結(jié)尾,中間由多個(gè)其他event組合而成。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

binlog文件實(shí)例:

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

每個(gè)event都是由event header 和event data組成。下面簡(jiǎn)單介紹下幾種常見(jiàn)的binlog event。

① formart description event

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

表達(dá)的含義是:

170905 01:59:33 server id 10 end_log_pos 123 CRC32 0xed1ec563 Start: binlog v 4, server v 5.7.18-log created 170905 01:59:33

② table map event

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

表達(dá)的含義是:

170905 01:59:33 server id 10 end_log_pos 339 CRC32 0x3de40c0d Table_map: `test`.`test4` mapped to number 238

③ update row event

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

表達(dá)的含義是:

170905 01:59:33 server id 10 end_log_pos 385 CRC32 0x179ef6dd Update_rows: table id 238 flags: STMT_END_F UPDATE `test`.`test4` WHERE @1=3 SET @1=13; binlog event回滾

根據(jù)上面的binlog介紹,可以看到每個(gè)binlog event中event header有個(gè)type_code,其中insert為30,update為31,delete為32。對(duì)于insert和delete兩個(gè)相反的操作,只需把type_code互換,則在binlog event級(jí)別完成回滾。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

而對(duì)于update操作,其格式如下。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

其中,BI是指before image,AI是指after image。

我們只需依次遍歷修改前的數(shù)據(jù)和修改后的數(shù)據(jù),并一一互換即可。因此整個(gè)回滾操作的難點(diǎn)在于回滾update語(yǔ)句,而update語(yǔ)句回滾的核心在于計(jì)算出每個(gè)AI、BI的長(zhǎng)度。下面介紹下長(zhǎng)度以及部分字段的計(jì)算方法。

鏡像長(zhǎng)度計(jì)算

鏡像是由一個(gè)個(gè)字段組成的,根據(jù)字段類(lèi)型的不同,其計(jì)算長(zhǎng)度的方法也不一樣。

只與字段類(lèi)型相關(guān)。比如int占用4個(gè)字節(jié),bingint占用8個(gè)字節(jié)。其中類(lèi)型信息可以從table map event中獲取。

與字段類(lèi)型及其參數(shù)相關(guān)。比如decimal(18,9),占用9個(gè)字節(jié),參數(shù)信息在table map event中。

與字段類(lèi)型、參數(shù)以及實(shí)際存儲(chǔ)的值相關(guān)。比如varchar(10),有1個(gè)字節(jié)表示長(zhǎng)度,之后的字節(jié)才表示真正的數(shù)據(jù)。比如varchar(280),有2個(gè)字節(jié)表示長(zhǎng)度。實(shí)際的長(zhǎng)度和數(shù)據(jù)在一起。

解析binlog中的若干個(gè)關(guān)鍵點(diǎn)

① length encoded integer

binlog中一個(gè)或者多個(gè)字節(jié)組合,分別表示了不同的含義。比如,timestamp是由固定的4個(gè)字節(jié)組成,event類(lèi)型由一個(gè)字節(jié)表示;數(shù)據(jù)庫(kù)名和表名最長(zhǎng)為64個(gè)字符,即使每個(gè)字符占用3個(gè)字節(jié),那么占用的字節(jié)數(shù)為192<255。因此最多使用一個(gè)字節(jié),就可以完成實(shí)際長(zhǎng)度表示。

然而列的實(shí)際數(shù)量,可能需要超過(guò)1個(gè)字節(jié)、2個(gè)字節(jié)、3個(gè)字節(jié)甚至8個(gè)字節(jié)去表示。如果我們使用最大的8個(gè)字節(jié)去表示,那么在絕大多數(shù)情況下都是浪費(fèi)存儲(chǔ)空間的。針對(duì)這種情況,length encoded integer應(yīng)運(yùn)而生。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

比如在獲取一個(gè)varchar類(lèi)型的長(zhǎng)度時(shí),首先讀取第一個(gè)字節(jié),如果值小于251,那么varchar的長(zhǎng)度就是第一個(gè)字節(jié)表示的長(zhǎng)度。如果第一個(gè)字節(jié)的值為0xFC,那么varchar的長(zhǎng)度是由該字節(jié)之后的后兩個(gè)字節(jié)組成,以此類(lèi)推。

② decimal類(lèi)型

decimal是由整數(shù)部分和小數(shù)部分組成。無(wú)論是整數(shù)還是小數(shù),每9個(gè)數(shù)字,需要4個(gè)字節(jié)。如果不是9的倍數(shù),剩余的小數(shù)位,需要的字節(jié)數(shù)如下,為方便描述,將該關(guān)系定義為函數(shù)Fnum。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

舉例,對(duì)于 decimal(18,10):

整數(shù)部分可展示的為8,用int,即4個(gè)字節(jié)。 小數(shù)部分,需要的字節(jié)數(shù)為 (10 /9)*4+Fnum(10%9)=5。 那么總共加起來(lái)需要4+5=9個(gè)字節(jié)。 閃回工具架構(gòu)

在上面的章節(jié)中,介紹了單個(gè)binlog event的反轉(zhuǎn)方法。在實(shí)踐中,我們往往需要把某個(gè)binlog,按照指定的條件,過(guò)濾出需要的binlog,并進(jìn)行反轉(zhuǎn)。那么MyFlash是如何完成這些目標(biāo)的呢?

解析binlog

首先把binlog文件,解析成多個(gè)event,放入到相關(guān)隊(duì)列中。在實(shí)現(xiàn)上,為了盡可能加快解析速度,可以讓用戶(hù)指定解析的開(kāi)始與結(jié)束位置。把binlog文件解析成binlog event后,再判斷下是否符合指定的時(shí)間條件,若不符合,則丟棄該event。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

注意:用戶(hù)可以不指定位置和時(shí)間,則解析整個(gè)文件。如果只指定時(shí)間,那么也需要從文件開(kāi)始處解析,取出時(shí)間信息,再進(jìn)行判斷。因此,當(dāng)需要回滾的binlog只占整個(gè)binlog的一小部分時(shí),推薦使用指定位置。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

重組event

把binlog event組成最小執(zhí)行單元。在常見(jiàn)的binlog event中table_map event包含了所要了表名、庫(kù)名等元數(shù)據(jù)信息,而row_event(包含write_event、delete_event、update_event)包含了真正的數(shù)據(jù)。因此在設(shè)計(jì)中使用了一個(gè)最小執(zhí)行單元概念。所謂的最小執(zhí)行單元,即least execution event unit,通常包含一個(gè)table_map event和若干個(gè)row_event。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

比如在binlog格式概覽一節(jié)中,介紹了table_map_event和update_row_event。如果只有update_row_event,那么我們無(wú)法知道這個(gè)event對(duì)應(yīng)的行記錄變更對(duì)應(yīng)的表。因此一個(gè)完整的最小執(zhí)行單元最少包含一個(gè)table_map_event和write_row_event、update_row_even、delete_row_event中的一個(gè)。

為什么我們需要使用最小執(zhí)行單元?因?yàn)槲覀冊(cè)陂W回操作時(shí),不能簡(jiǎn)單的把每個(gè)event反轉(zhuǎn)之后,然后再將所有event的順序反轉(zhuǎn)過(guò)來(lái)。如果這樣的話(huà),就會(huì)出現(xiàn)table_map event在row event之后,這顯然是違反binlog執(zhí)行邏輯的。

有了最小執(zhí)行單元之后,只需兩步,即可完成反轉(zhuǎn)。

a. 反轉(zhuǎn)最小執(zhí)行單元中的row event。

b. 逆序最小執(zhí)行單元隊(duì)列,即可。

當(dāng)然在反轉(zhuǎn)前,也可以增加過(guò)濾操作。比如過(guò)濾庫(kù)名、表名和SQL類(lèi)型等。

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

生成binlog文件

有了逆序的最小執(zhí)行單元隊(duì)列后,只需把每個(gè)最小執(zhí)行單元依次輸入到文件即可。不過(guò)不要忘了修改每個(gè)binlog event里的next_position,用來(lái)表示下一個(gè)binlog的位置。

性能對(duì)比 測(cè)試場(chǎng)景

使用testFlashback2,插入100萬(wàn)條數(shù)據(jù):

CREATE TABLE `testFlashback2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nameShort` varchar(20) DEFAULT NULL, `nameLong` varchar(260) DEFAULT NULL, `amount` decimal(19,9) DEFAULT NULL, `amountFloat` float DEFAULT NULL, `amountDouble` double DEFAULT NULL, `createDatetime6` datetime(6) DEFAULT NULL, `createDatetime` datetime DEFAULT NULL, `createTimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `nameText` text, `nameBlob` blob, `nameMedium` mediumtext, PRIMARY KEY (`id`)) ENGINE=InnoDBmysql> select count(*) from testFlashback2;+----------+| count(*) |+----------+| 1048576 |+----------+1 row in set (0.16 sec)delete from testFlashback2; 測(cè)試結(jié)果

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

MyFlash——美團(tuán)點(diǎn)評(píng)的開(kāi)源MySQL閃回工具

從上述圖表中可以看出,MyFlash的速度最快。

參考文檔 MySQL官方文檔 1 , 2 , 3 . binlog2sql . mysqlbinlog Flashback for 5.6 . MySQL閃回原理與實(shí)戰(zhàn) .

來(lái)自:https://tech.meituan.com/MySQL_flashback從原理到實(shí)戰(zhàn).html

標(biāo)簽: 美團(tuán)
相關(guān)文章:
主站蜘蛛池模板: 七维官网-水性工业漆_轨道交通涂料_钢结构漆 | UV-1800紫外光度计-紫外可见光度计厂家-翱艺仪器(上海)有限公司 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 电缆桥架生产厂家_槽式/梯式_热镀锌线槽_广东东莞雷正电气 | 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 萃取箱-萃取槽-PVC萃取箱厂家-混合澄清槽- 杭州南方化工设备 | 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 手板_手板模型制作_cnc手板加工厂-东莞天泓 | 商标转让-购买商标专业|放心的商标交易网-蜀易标商标网 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | 智能交通网_智能交通系统_ITS_交通监控_卫星导航_智能交通行业 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 成都租车_成都租车公司_成都租车网_众行宝 | 湖南教师资格网-湖南教师资格证考试网| 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 杭州|上海贴标机-百科| 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 耐火浇注料-喷涂料-浇注料生产厂家_郑州市元领耐火材料有限公司 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 冰晶石|碱性嫩黄闪蒸干燥机-有机垃圾烘干设备-草酸钙盘式干燥机-常州市宝康干燥 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 浙江上沪阀门有限公司 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 制冷采购电子商务平台——制冷大市场 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 |