MySQL使用MyFlash快速恢復(fù)誤刪除和修改的數(shù)據(jù)
一、MyFlash
MyFlash
是由美團(tuán)點(diǎn)評(píng)公司技術(shù)工程部開發(fā)并維護(hù)的一個(gè)開源工具,主要用于MySQL
數(shù)據(jù)庫的DML
操作的回滾。這個(gè)工具通過解析binlog
日志,幫助用戶高效、方便地進(jìn)行數(shù)據(jù)恢復(fù)。MyFlash
的優(yōu)勢(shì)在于它提供了更多的過濾選項(xiàng),使得回滾操作變得更加容易。與其他數(shù)據(jù)恢復(fù)工具相比,MyFlash
無需將binlog
解析成文本再進(jìn)行轉(zhuǎn)換,而是提供了基于庫、表、SQL
類型、位置、時(shí)間等多種過濾方式。
GitHub
地址如下:
本文將實(shí)驗(yàn)通過 MyFlash
工具快速恢復(fù)誤刪除 或 誤修改的數(shù)據(jù)。
注意:要使用 MyFlash
,前提需要將 MySQL
的 binlog
格式改為row
,且 binlog_row_image=full
,所以在下面實(shí)驗(yàn)前,請(qǐng)確保 MySQL
開啟了 binlog
,并且 binlog
的格式正確:
show variables like 'log_bin';
SHOW VARIABLES LIKE 'binlog_row_image';
二、MyFlash 部署
安裝依賴環(huán)境:
yum install gcc glib2-devel -y
下載 MyFlash
項(xiàng)目:
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ù)庫名。多個(gè)數(shù)據(jù)庫可以用
,
隔開。如果不指定該參數(shù),相當(dāng)于指定了所有數(shù)據(jù)庫。 - tableNames:指定需要回滾的表名。多個(gè)表可以用
,
隔開。如果不指定該參數(shù),相當(dāng)于指定了所有表。 - start-position:指定回滾開始的位置。如不指定,從文件的開始處回滾。請(qǐng)指定正確的有效的位置,否則無法回滾。
- stop-position:指定回滾結(jié)束的位置。如不指定,回滾到文件結(jié)尾。請(qǐng)指定正確的有效的位置,否則無法回滾。
- start-datetime:指定回滾的開始時(shí)間。注意格式必須是
%Y-%m-%d %H:%M:%S
。如不指定,則不限定時(shí)間。 - stop-datetime:指定回滾的結(jié)束時(shí)間。注意格式必須是
%Y-%m-%d %H:%M:%S
。如不指定,則不限定時(shí)間。 - sqlTypes:指定需要回滾的
sql
類型。目前支持的過濾類型是INSERT
,UPDATE
,DELETE
。多個(gè)類型可以用,
隔開。 - maxSplitSize:指定解析分割后文件最大大小,單位為
M
。 - binlogFileNames:指定需要回滾的
binlog
文件,如有多個(gè),用,
隔開。 - outBinlogFileNameBase:指定輸出的
binlog
文件前綴,如不指定,則默認(rèn)為binlog_output_base.flashback
。 - logLevel:指定輸出的日志級(jí)別,可選級(jí)別有
debug
,warning
,error
,默認(rèn)級(jí)別為error
級(jí)別。 - include-gtids:指定需要回滾的
gtid
,支持gtid
的單個(gè)和范圍兩種形式,如有多種形式,用,
隔開。 - exclude-gtids:指定不需要回滾的
gtid
,支持gtid
的單個(gè)和范圍兩種形式,如有多種形式,用,
隔開。
三、測(cè)試環(huán)境構(gòu)建
創(chuàng)建測(cè)試庫:
create database testdb;
use testdb;
創(chuàng)建測(cè)試表:
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;
寫入測(cè)試數(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;
先生成一個(gè)新的 binlog
文件,讓后面的操作記錄在新的 binlog
文件中:
flush logs;
使用 MyFlash
反向解析剛才的 mysql-bin.000004
文件,這個(gè)可以根據(jù)時(shí)間范圍定位,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í)行后可以看到生成了一個(gè) user.sql.flashback
回滾文件,可以使用 mysqlbinlog
進(jìn)行查看:
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ù)時(shí)忘了加 where
條件,導(dǎo)致所有數(shù)據(jù)都被誤修改:
update user set age = 99;
下面做法和上面相似,首先查看當(dāng)前 binlog
名稱:
show master status;
同樣生成一個(gè)新的 binlog
文件,讓后面的操作記錄在新的 binlog
文件中:
flush logs;
使用 MyFlash
反向解析剛才的 mysql-bin.000005
文件,這個(gè)還是根據(jù)時(shí)間范圍定位,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í)行后可以看到生成了一個(gè) user1.sql.flashback
回滾文件,使用 mysqlbinlog
進(jìn)行查看:
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ù)的詳細(xì)內(nèi)容,更多關(guān)于MySQL MyFlash恢復(fù)誤刪除數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 一步步教你利用Mysql存儲(chǔ)過程造百萬級(jí)數(shù)據(jù)
- MySQL數(shù)據(jù)庫10秒內(nèi)插入百萬條數(shù)據(jù)的實(shí)現(xiàn)
- MySQL 百萬級(jí)數(shù)據(jù)的4種查詢優(yōu)化方式
- MySQL百萬級(jí)數(shù)據(jù)量分頁查詢方法及其優(yōu)化建議
- MySQL百萬級(jí)數(shù)據(jù)分頁查詢優(yōu)化方案
- java中JDBC實(shí)現(xiàn)往MySQL插入百萬級(jí)數(shù)據(jù)的實(shí)例代碼
- MySQL單表百萬數(shù)據(jù)記錄分頁性能優(yōu)化技巧
- MySQL數(shù)據(jù)庫刪除數(shù)據(jù)后自增ID不連續(xù)的問題及解決
- MySQL BinLog如何恢復(fù)誤更新刪除數(shù)據(jù)
- 使用 SQL 快速刪除數(shù)百萬行數(shù)據(jù)的實(shí)踐記錄
相關(guān)文章
MySQL刪除數(shù)據(jù)Delete與Truncate語句使用比較
在MySQL數(shù)據(jù)庫中,DELETE語句和TRUNCATE TABLE語句都可以用來刪除數(shù)據(jù),但是這兩種語句還是有著其區(qū)別的,下文就為您介紹這二者的差別所在2012-09-09mysql exists與not exists實(shí)例詳解
這篇文章主要介紹了mysql exists與not exists實(shí)例詳解的相關(guān)資料,鑒于 not exists 的效率往往要高于 not in , 所以一般情況下會(huì)使用前者替代后者,需要的朋友可以參考下2017-07-07mysql導(dǎo)入csv的4種報(bào)錯(cuò)的解決方法
這篇文章主要介紹了mysql導(dǎo)入csv的4種報(bào)錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12利用MySQL加密函數(shù)保護(hù)Web網(wǎng)站敏感數(shù)據(jù)的方法分享
如果您正在運(yùn)行使用MySQL的Web應(yīng)用程序,那么它把密碼或者其他敏感信息保存在應(yīng)用程序里的機(jī)會(huì)就很大2012-03-03MySQL敏感數(shù)據(jù)進(jìn)行加密的幾種方法小結(jié)
本文介紹了在MySQL中對(duì)敏感數(shù)據(jù)進(jìn)行加密的幾種方法,每種方法都有其適用場(chǎng)景和特點(diǎn),可以根據(jù)具體需求選擇合適的方法來保護(hù)數(shù)據(jù)安全,感興趣的可以了解一下2024-11-11mysqld-nt: Out of memory (Needed 1677720 bytes)解決方法
這篇文章主要介紹了mysqld-nt: Out of memory (Needed 1677720 bytes)解決方法,需要的朋友可以參考下2014-12-12php下巧用select語句實(shí)現(xiàn)mysql分頁查詢
mysql分頁查詢是我們經(jīng)常見到的問題,那么應(yīng)該如何實(shí)現(xiàn)呢?下面就教您一個(gè)實(shí)現(xiàn)mysql分頁查詢的好方法,供您參考學(xué)習(xí)。2010-12-12mysql導(dǎo)入sql文件報(bào)錯(cuò) ERROR 2013 2006 2002
今天在做項(xiàng)目的時(shí)候遇到個(gè)問題,就是往mysql里導(dǎo)入sql文件的時(shí)候總是報(bào)ERROR 2013 2006 2002,研究了一番才找到解決辦法,這里記錄下來分享給大家2014-11-11