最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中閃回功能的方案討論及實(shí)現(xiàn)

 更新時(shí)間:2025年03月21日 10:59:34   作者:丁林.tb  
Oracle有一個(gè)閃回(flashback)功能,能夠用戶恢復(fù)誤操作的數(shù)據(jù),這篇文章主要來和大家討論一下MySQL中支持閃回功能的方案,有需要的可以了解下

Oracle有一個(gè)閃回(flashback)功能,能夠用戶恢復(fù)誤操作的數(shù)據(jù)。本文討論MySQL中支持閃回的方案。

1、 閃回的目標(biāo)

即使為了數(shù)據(jù)安全,我們搭建了主從。但實(shí)時(shí)主從備份只能防止硬件問題,比如主庫(kù)的硬盤損壞。但對(duì)于誤操作,則無能為力。比如在主庫(kù)誤刪一張表,或者一個(gè)update語句沒有指定where條件,導(dǎo)致全表被更新。當(dāng)操作被同步到從庫(kù)上后,則主從都“回天無力”。

線上或者測(cè)試環(huán)境經(jīng)常出現(xiàn)的誤操作總是讓DBA同學(xué)那么鬧心。

閃回的目的是要讓數(shù)據(jù)庫(kù)在commit之后,還能恢復(fù)到之前的某個(gè)狀態(tài),整庫(kù)或指定的表。

這里我們討論用binlog來實(shí)現(xiàn)閃回的方案。

2、 無米無炊一

恢復(fù)到之前的某個(gè)狀態(tài),是需要數(shù)據(jù)的。這數(shù)據(jù)可以是 a) 回滾步驟 或者 b) 操作之前的數(shù)據(jù)狀態(tài)原文。

但我們知道,若使用statement,并沒有上述需要的數(shù)據(jù)。試想binlog中記錄了一句update t set f1=3 where id=3。怎么恢復(fù)呢?

因此,我們的第一個(gè)“米”,就是binlog必須是row based的。在row base下,binlog同時(shí)記錄了更新前后的整行記錄。

a)單個(gè)語句的閃回

了row base的binlog后,我們來分析一下怎么實(shí)現(xiàn)閃回。平時(shí)的DML無非三種操作,增刪改,先說三種操作的日志格式。

一個(gè)語句分成兩個(gè)event (實(shí)際上不止,其他可以忽略), 一個(gè)table_map event 和 一個(gè)Rows_log_event。Table_map event是一樣的,主要看Rows_log_event。

每個(gè)Rows_log_event中包含event_type, 可選值為WRITE_ROWS_EVENT、UPDATE_ROWS_EVENT、DELETE_ROWS_EVENT。從宏名字就能看出用途。

對(duì)于insert和delete,event中包含了插入/刪除的記錄的所有字段的值(太爽了。。)

對(duì)于update操作,event中依次記錄舊行, 新行的值。

因此我們看到,這些信息足夠讓我們對(duì)單個(gè)操作實(shí)現(xiàn)“逆操作”。

i. 對(duì)于insert操作,只需要把event_type改成DELETE_ROWS_EVENT;對(duì)于delete操作,改成WRITE_ROWS_EVENT

ii.  對(duì)于update操作,只需要把event中的舊行和新行值對(duì)調(diào)即可。

b)binlog的閃回

我們只需要把binlog文件反向執(zhí)行,每個(gè)操作都執(zhí)行逆操作即可。當(dāng)然也不是所有的event都反轉(zhuǎn)。Table_map event必須還是在Rows_log_event每個(gè)操作之前。目前的方案是用mysqlbinlog工具,增加一個(gè)flashback參數(shù),輸出結(jié)果為一個(gè)新的binlog文件――姑且叫做flashbacklog,這個(gè)flashbacklog順序執(zhí)行,可制定某張表和執(zhí)行到哪個(gè)pos,來實(shí)現(xiàn)數(shù)據(jù)庫(kù)的閃回。 

3、 無米無炊二

上面我們說了DML的閃回方案。但對(duì)于DDL卻無能為力,對(duì)于大多數(shù)的ddl,即使是row base格式,binlog中仍只記錄語句本身。對(duì)于刪表操作,只記錄一個(gè)語句drop table t。僅憑這句話,無法還原表的數(shù)據(jù)。

雖然可以將一個(gè)drop table語句轉(zhuǎn)換成先delete再刪表,性能卻會(huì)降低很多。這里我們用上面說道的另外一種可用數(shù)據(jù):“操作前數(shù)據(jù)備份”。

按順序我們先討論怎么保存數(shù)據(jù),再討論怎么閃回。

保存數(shù)據(jù)

先說DDL的分類。有一類DDL,是不需要重建表的,比如加非聚簇索引。這類操作其實(shí)不會(huì)丟數(shù)據(jù),也是在原表上直接操作,對(duì)于我們“以恢復(fù)數(shù)據(jù)為目的”的閃回,是可以先忽略的。 另外一類,則是會(huì)影響到表數(shù)據(jù)的操作。比如

a)  Drop/truncate table

這兩個(gè)操作直接把表數(shù)據(jù)清空。

b)   Alter table add、drop、change column

這類操作的執(zhí)行過程是,1) 按照新的表定義建立一個(gè)臨時(shí)表tmpa,2) 將原表數(shù)據(jù)拷貝到臨時(shí)表,3)將原始表改名tmpb,4)將tmpa改名為原表名,5)將tmpb刪除。

我們分析上面的兩個(gè)操作,都有一個(gè)“刪除數(shù)據(jù)”的過程。

因此我們的保存數(shù)據(jù)方法就是:在刪除的動(dòng)作開始之前,把表數(shù)據(jù)備份起來,然后留一個(gè)空表,在空表上執(zhí)行“刪除”操作。

用一個(gè)庫(kù) #bak_database存放這些歷史數(shù)據(jù)。

閃回

有了數(shù)據(jù)以后,我們就要想一個(gè)比較統(tǒng)一的方法來閃回。上面我們說了對(duì)于DML操作,可以通過反向執(zhí)行所有逆操作來實(shí)現(xiàn),對(duì)于語句里面的DDL,只能直接跳過。原因是一個(gè)DDL不一定有直接的逆操作。

因此我們的方案中要構(gòu)造這種逆操作。Event_type增加一種FLASHBACK_EVENT。這類操作形式與Query_Event相同,都是簡(jiǎn)單的SQL語句,只是包含了將數(shù)據(jù)恢復(fù)的操作。

舉例:

a)   對(duì)于altert table t add column 操作。

我們?cè)诓僮鞯倪^程中將臨時(shí)表tmpb,不刪除,而是保存到 #bak_database.#bak_table_xxxxx (后綴用于去重),在我的patch中用當(dāng)前的時(shí)刻(微秒)。

對(duì)于這個(gè)語句,我們生成兩條FLASHBACK_EVENT,分別是 alter table `#bak_database`.`#bak_table_xxxxx` rename to `my_db`.`my_tbl`; 和 drop table  `my_db`.`my_tbl`;

這里的my_db和my_tbl分別為原來的庫(kù)名和表名。

所以mysqlbinlog工具怎么處理FLASHBACK_EVENT這類event呢,直接執(zhí)行就行了。(注意這兩個(gè)event也是反向執(zhí)行的,所以在恢復(fù)的時(shí)候是先刪除`my_db`.`my_tbl`,再?gòu)?bak_database恢復(fù)回來)

b)對(duì)于drop table操作

由于實(shí)際操作會(huì)把這個(gè)表刪,只需要一個(gè)alter table `#bak_database`.`#bak_table_xxxxx` rename to `my_db`.`my_tbl`; 即可。

4、 演示

初始狀態(tài)我們庫(kù)中只有一個(gè)表 test.tb,兩行

CREATE TABLE `tb` (
`c` int(11) NOT NULL DEFAULT '0′,
 `d` int(11) DEFAULT NULL,
  PRIMARY KEY (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;mysql> select * from tb;
+——+——+
| c    | d    |
+——+——+
|    1 |   10 |
|    2 |   20 |
+——+——+

模擬一個(gè)DML和一個(gè)DDL

insert into tb values(3,30);
alter table tb drop column d;  

這兩個(gè)操作后在binlog文件中生成的結(jié)果如下

說明:

將mysqlbinloig中的其他信息去掉,其中紅色框中為insert語句產(chǎn)生的binlog,在flashback工具中會(huì)被轉(zhuǎn)化為delete操作。

兩個(gè)藍(lán)色框中的即為我們生成的FLASHBACK_EVENT。除了event_type與普通的query_event不同,還將庫(kù)名+表名放在語句的前面,目的是為了flashback工具執(zhí)行按表閃回的時(shí)候可以直接識(shí)別表名,不需要解析binlog語句。

紫色框中就是那個(gè)真正的DDL操作,在flashback工具中被忽略。

所以上面的binlog被flashback工具解析后的結(jié)果是兩個(gè)DDL語句和一個(gè)delete操作,能夠恢復(fù)到表的初始狀態(tài)。

5、小結(jié)

這里討論了MySQL閃回的一種方案.

增加一種新的event_type, 不會(huì)影響原來mysqlbinlog工具的使用;

備份即將刪除的表,沒有增加額外的操作,不會(huì)對(duì)正常操作性能造成影響(當(dāng)然需要更多的存儲(chǔ)空間)。

實(shí)際上我們上面還留了一個(gè)“空擋”沒有討論,在方案完成后補(bǔ)充。

涉及到MySQL server本身和mysqlbinlog這個(gè)工具兩部分的修改,MySQL工具部分由@plinux同學(xué)實(shí)現(xiàn)。(其實(shí)如果不恢復(fù)DDL,可以只使用這個(gè)工具).  server部分的改動(dòng)可以只部署slave,這樣slave同時(shí)擔(dān)負(fù)備份和閃回準(zhǔn)備的功能。

到此這篇關(guān)于MySQL中閃回功能的方案討論及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL閃回內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL筆記之修改數(shù)據(jù)的解決方法

    MySQL筆記之修改數(shù)據(jù)的解決方法

    本篇文章介紹了,在mysql中修改數(shù)據(jù)的解決方法。需要的朋友參考下
    2013-05-05
  • mysql查詢鎖表方式

    mysql查詢鎖表方式

    在MySQL中,查詢鎖表可以通過多個(gè)命令實(shí)現(xiàn),如show?engine?innodb?status、show?processlist等,用以檢測(cè)和解決表鎖問題,首先通過show?engine?innodb?status查看鎖表情況,接著利用show?processlist找出長(zhǎng)時(shí)間占用的SQL語句
    2024-09-09
  • MySQL存儲(chǔ)過程的優(yōu)化實(shí)例

    MySQL存儲(chǔ)過程的優(yōu)化實(shí)例

    在編寫MySQL存儲(chǔ)過程的過程中,我們會(huì)時(shí)不時(shí)地需要對(duì)某些存儲(chǔ)過程進(jìn)行優(yōu)化,其目的是確保代碼的可讀性、正確性及運(yùn)行性能。本文以作者實(shí)際工作為背景,介紹了對(duì)某一個(gè)MySQL存儲(chǔ)過程優(yōu)化的整個(gè)過程。
    2016-07-07
  • MySQL中binlog2sql實(shí)現(xiàn)數(shù)據(jù)誤刪恢復(fù)工具

    MySQL中binlog2sql實(shí)現(xiàn)數(shù)據(jù)誤刪恢復(fù)工具

    本文介紹了binlog2sql工具的使用,它能從MySQL binlog中解析出SQL語句,用于數(shù)據(jù)回滾、主從切換后的數(shù)據(jù)修復(fù)等場(chǎng)景,通過設(shè)置不同參數(shù),可以獲取原始SQL、回滾SQL等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-09-09
  • 如何清理MySQL中的binlog問題

    如何清理MySQL中的binlog問題

    這篇文章主要介紹了清理MySQL中的binlog問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • MySQL更改數(shù)據(jù)字段的前幾位數(shù)字的方法示例

    MySQL更改數(shù)據(jù)字段的前幾位數(shù)字的方法示例

    本文主要介紹了MySQL更改數(shù)據(jù)字段的前幾位數(shù)字的方法示例,包括使用SUBSTRING函數(shù)、REPLACE函數(shù)、LEFT函數(shù),還是正則表達(dá)式或者CASE語句,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • 親手教你SQLyog12.08安裝詳細(xì)教程

    親手教你SQLyog12.08安裝詳細(xì)教程

    SQLyog?是一個(gè)快速而簡(jiǎn)潔的圖形化管理MYSQL數(shù)據(jù)庫(kù)的工具,它能夠在任何地點(diǎn)有效地管理你的數(shù)據(jù)庫(kù),這篇文章主要介紹了SQLyog12.08安裝詳細(xì)教程,需要的朋友可以參考下
    2023-04-04
  • MySQL ClickHouse不同于SQL的語法介紹

    MySQL ClickHouse不同于SQL的語法介紹

    CloudCanal 近期實(shí)現(xiàn)了 MySQL(RDS) 到 ClickHouse 實(shí)時(shí)同步的能力,功能包含全量數(shù)據(jù)遷移、增量數(shù)據(jù)遷移、結(jié)構(gòu)遷移能力,以及附帶的監(jiān)控、告警、HA等能力
    2022-11-11
  • MYSQL單表操作學(xué)習(xí)之DDL、DML及DQL語句示例

    MYSQL單表操作學(xué)習(xí)之DDL、DML及DQL語句示例

    DML、DDL、DCL和DQL是數(shù)據(jù)庫(kù)中常用的四種語言,分別用于數(shù)據(jù)操作、數(shù)據(jù)定義、數(shù)據(jù)控制和數(shù)據(jù)查詢,下面這篇文章主要給大家介紹了關(guān)于MYSQL單表操作學(xué)習(xí)之DDL、DML及DQL語句的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • mysql 5.7.25 壓縮版安裝配置方法圖文教程

    mysql 5.7.25 壓縮版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.25 壓縮版安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評(píng)論

灵川县| 绥芬河市| 绥中县| 南和县| 博客| 泽州县| 海淀区| 大悟县| 肇庆市| 湖口县| 广德县| 南丹县| 手机| 昌宁县| 威远县| 烟台市| 黔南| 郁南县| 东丽区| 双峰县| 呼和浩特市| 深州市| 易门县| 奉新县| 茌平县| 酉阳| 儋州市| 景谷| 松滋市| 石家庄市| 呈贡县| 南昌县| 涪陵区| 花莲县| 民权县| 阆中市| 嘉峪关市| 遂溪县| 乐业县| 岳阳市| 弥勒县|