MySQL使用MyFlash快速恢復(fù)誤刪除和修改的數(shù)據(jù)
一、MyFlash
MyFlash 是由美團點評公司技術(shù)工程部開發(fā)并維護的一個開源工具,主要用于MySQL數(shù)據(jù)庫的DML操作的回滾。這個工具通過解析binlog日志,幫助用戶高效、方便地進行數(shù)據(jù)恢復(fù)。MyFlash的優(yōu)勢在于它提供了更多的過濾選項,使得回滾操作變得更加容易。與其他數(shù)據(jù)恢復(fù)工具相比,MyFlash無需將binlog解析成文本再進行轉(zhuǎn)換,而是提供了基于庫、表、SQL類型、位置、時間等多種過濾方式。
GitHub 地址如下:
本文將實驗通過 MyFlash 工具快速恢復(fù)誤刪除 或 誤修改的數(shù)據(jù)。
注意:要使用 MyFlash ,前提需要將 MySQL 的 binlog格式改為row,且 binlog_row_image=full,所以在下面實驗前,請確保 MySQL 開啟了 binlog ,并且 binlog 的格式正確:
show variables like 'log_bin';

SHOW VARIABLES LIKE 'binlog_row_image';

二、MyFlash 部署
安裝依賴環(huán)境:
yum install gcc glib2-devel -y
下載 MyFlash 項目:
wget https://github.com/Meituan-Dianping/MyFlash/archive/master.zip
解壓:
unzip master.zip
編譯源文件:
cd MyFlash-master
gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback
查看 flashback 命令:
./binary/flashback -h

解釋如下:
- databaseNames:指定需要回滾的數(shù)據(jù)庫名。多個數(shù)據(jù)庫可以用
,隔開。如果不指定該參數(shù),相當(dāng)于指定了所有數(shù)據(jù)庫。 - tableNames:指定需要回滾的表名。多個表可以用
,隔開。如果不指定該參數(shù),相當(dāng)于指定了所有表。 - start-position:指定回滾開始的位置。如不指定,從文件的開始處回滾。請指定正確的有效的位置,否則無法回滾。
- stop-position:指定回滾結(jié)束的位置。如不指定,回滾到文件結(jié)尾。請指定正確的有效的位置,否則無法回滾。
- start-datetime:指定回滾的開始時間。注意格式必須是
%Y-%m-%d %H:%M:%S。如不指定,則不限定時間。 - stop-datetime:指定回滾的結(jié)束時間。注意格式必須是
%Y-%m-%d %H:%M:%S。如不指定,則不限定時間。 - sqlTypes:指定需要回滾的
sql類型。目前支持的過濾類型是INSERT,UPDATE,DELETE。多個類型可以用,隔開。 - maxSplitSize:指定解析分割后文件最大大小,單位為
M。 - binlogFileNames:指定需要回滾的
binlog文件,如有多個,用,隔開。 - outBinlogFileNameBase:指定輸出的
binlog文件前綴,如不指定,則默認為binlog_output_base.flashback。 - logLevel:指定輸出的日志級別,可選級別有
debug,warning,error,默認級別為error級別。 - include-gtids:指定需要回滾的
gtid,支持gtid的單個和范圍兩種形式,如有多種形式,用,隔開。 - exclude-gtids:指定不需要回滾的
gtid,支持gtid的單個和范圍兩種形式,如有多種形式,用,隔開。
三、測試環(huán)境構(gòu)建
創(chuàng)建測試庫:
create database testdb;
use testdb;
創(chuàng)建測試表:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
寫入測試數(shù)據(jù):
INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (1, '張三', 16); INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (2, '趙六', 17); INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (3, '李四', 18); INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (4, '小明', 19); INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (5, '小李', 20);
四、數(shù)據(jù)誤刪除恢復(fù)
假設(shè)不小心刪除了 age > 17 的數(shù)據(jù):
delete from user where age > 17;

查看當(dāng)前 binlog 名稱:
show master status;

先生成一個新的 binlog 文件,讓后面的操作記錄在新的 binlog 文件中:
flush logs;

使用 MyFlash 反向解析剛才的 mysql-bin.000004 文件,這個可以根據(jù)時間范圍定位,sqlTypes 為 DELETE 類型:
./binary/flashback --databaseNames="testdb" --tableNames="user" --start-datetime="2024-06-15 14:35:30" --stop-datetime="2024-06-15 14:41:30" --sqlTypes="DELETE" --binlogFileNames=/var/lib/mysql/mysql-bin.000004 --outBinlogFileNameBase=user.sql

執(zhí)行后可以看到生成了一個 user.sql.flashback 回滾文件,可以使用 mysqlbinlog 進行查看:
mysqlbinlog -vv user.sql.flashback

可以看出內(nèi)容是 INSERT 操作,用來恢復(fù)之前誤刪除的數(shù)據(jù),下面可以直接使用 mysqlbinlog 去執(zhí)行其中的內(nèi)容:
mysqlbinlog user.sql.flashback | mysql -uroot -proot

下面查看數(shù)據(jù)是否被恢復(fù):

數(shù)據(jù)成功恢復(fù)!
五、數(shù)據(jù)誤修改恢復(fù)
假設(shè)修改數(shù)據(jù)時忘了加 where 條件,導(dǎo)致所有數(shù)據(jù)都被誤修改:
update user set age = 99;

下面做法和上面相似,首先查看當(dāng)前 binlog 名稱:
show master status;

同樣生成一個新的 binlog 文件,讓后面的操作記錄在新的 binlog 文件中:
flush logs;

使用 MyFlash 反向解析剛才的 mysql-bin.000005 文件,這個還是根據(jù)時間范圍定位,sqlTypes 要改為 UPDATE 類型:
./binary/flashback --databaseNames="testdb" --tableNames="user" --start-datetime="2024-06-15 14:45:30" --stop-datetime="2024-06-15 14:50:30" --sqlTypes="UPDATE" --binlogFileNames=/var/lib/mysql/mysql-bin.000005 --outBinlogFileNameBase=user1.sql

執(zhí)行后可以看到生成了一個 user1.sql.flashback 回滾文件,使用 mysqlbinlog 進行查看:
mysqlbinlog -vv user1.sql.flashback

可以看出是 UPDATE 操作,用來恢復(fù)之前誤修改的數(shù)據(jù),同樣直接使用 mysqlbinlog 去執(zhí)行其中的內(nèi)容:
mysqlbinlog user1.sql.flashback | mysql -uroot -proot

下面查看數(shù)據(jù)是否恢復(fù):

數(shù)據(jù)成功恢復(fù)!
以上就是MySQL使用MyFlash快速恢復(fù)誤刪除和修改的數(shù)據(jù)的詳細內(nèi)容,更多關(guān)于MySQL MyFlash恢復(fù)誤刪除數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL數(shù)據(jù)庫之內(nèi)置函數(shù)和自定義函數(shù) function
這篇文章主要介紹了MySQL數(shù)據(jù)庫之內(nèi)置函數(shù)和自定義函數(shù) function,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-06-06
mysql 導(dǎo)出select語句結(jié)果到excel文件遇到問題及解決方法
這篇文章主要介紹了mysql 導(dǎo)出select語句結(jié)果到excel文件遇到問題及解決方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09
mysql數(shù)據(jù)庫在表中添加數(shù)據(jù)三種操作方式
這篇文章主要介紹了mysql數(shù)據(jù)庫在表中添加數(shù)據(jù)三種方式,首先創(chuàng)建數(shù)據(jù)庫和表,創(chuàng)建完成后就可以進行添加數(shù)據(jù)的操作了,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-08-08
MAC上Mysql忘記Root密碼或權(quán)限錯誤的快速解決方案
這篇文章主要介紹了MAC上Mysql忘記Root密碼或權(quán)限錯誤的快速解決方案的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06
MySQL創(chuàng)建并調(diào)用自定義函數(shù)方式
這篇文章主要介紹了MySQL創(chuàng)建并調(diào)用自定義函數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05
MySQL5.7.44-winx64版本W(wǎng)indows Server下載安裝過程
本文詳細介紹了如何下載、安裝和配置MySQL 5.7.44的步驟,包括設(shè)置環(huán)境變量、修改配置文件和密碼,以及如何修改默認端口2025-12-12
在IDEA的maven項目中連接并使用MySQL8.0的方法教程
這篇文章主要介紹了如何在IDEA的maven項目中連接并使用MySQL8.0,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
Unity連接MySQL并讀取表格數(shù)據(jù)的實現(xiàn)代碼
本文給大家介紹Unity連接MySQL并讀取表格數(shù)據(jù)的實現(xiàn)代碼,實例化的同時調(diào)用MySqlConnection,傳入?yún)?shù),這里的傳入?yún)?shù)個人認為是CMD里面的直接輸入了,string格式直接類似手敲到cmd里面,完整代碼參考下本文2021-06-06

