柚子快報(bào)邀請(qǐng)碼778899分享:Mysql 恢復(fù)誤刪庫(kù)表數(shù)據(jù)
柚子快報(bào)邀請(qǐng)碼778899分享:Mysql 恢復(fù)誤刪庫(kù)表數(shù)據(jù)
一、前提
? ? ? ? 1、如果你的數(shù)據(jù)庫(kù)有備份文件,自己還原即可。
? ? ? ? 2、如果沒(méi)有備份文件,那首先檢查下你的 binlog 是否開(kāi)啟。如果未開(kāi)啟,那你就不用往下看了。如果開(kāi)啟了,可以往下看看。
1.1 查看位置
? ? ? ? 可以通過(guò)以下的命令查看是否開(kāi)啟了 binlog?以及它的存儲(chǔ)路徑,mysql8.0 版本是默認(rèn)開(kāi)啟的。
show variables like '%log_bin%'
二、簡(jiǎn)單場(chǎng)景演示
2.1 背景
? ? ? ? 此時(shí)演示的數(shù)據(jù)庫(kù)版本是 Mysql 8.0。且創(chuàng)建表、插入數(shù)據(jù)和刪除表都是在一個(gè) binlog 里面完成的。
2.2 創(chuàng)建數(shù)據(jù)庫(kù)
? ? ? ? 確認(rèn)?binlog 是開(kāi)啟狀態(tài)之后,創(chuàng)建測(cè)試數(shù)據(jù)庫(kù),在測(cè)試數(shù)據(jù)庫(kù)中創(chuàng)建測(cè)試表,并寫入數(shù)據(jù),腳本如下:
create database if EXISTS itcast;
use itcast;
create table tb_user(
id int(11) not null,
name varchar(50) not null,
sex varchar(1),
primary key (id)
)engine=innodb default charset=utf8;
insert into tb_user(id,name,sex) values(1,'Tom','1');
insert into tb_user(id,name,sex) values(2,'Trigger','0');
insert into tb_user(id,name,sex) values(3,'Dawn','1');
2.3 刪除數(shù)據(jù)庫(kù)
? ? ? ? 執(zhí)行下面的語(yǔ)句將數(shù)據(jù)庫(kù)刪除掉。
drop DATABASE itcast;
2.4 創(chuàng)建新文件
????????當(dāng)需要恢復(fù)數(shù)據(jù)時(shí),為了防止恢復(fù)數(shù)據(jù)后影響最新業(yè)務(wù),需要執(zhí)行下面的命令產(chǎn)生一個(gè)新的 binlog 文件,如下,此時(shí)舊的 binlog 文件不會(huì)再有寫入操作了。
flush logs;
2.5 查看具體文件
? ? ? ? 執(zhí)行下面的命令,看下系統(tǒng)有多少個(gè) binlog 文件
show master logs;
????????由于我們執(zhí)行 flush logs 命令新生了一個(gè)文件,所以我們執(zhí)行的刪除的命令應(yīng)該在 binlog.000017 文件里面。
2.6 查看具體的命令行
? ? ? ? 執(zhí)行下面的命令,查看具體操作的開(kāi)始和結(jié)束的位置
show binlog events in 'binlog.000017';
? ? ? ? 得到數(shù)據(jù)恢復(fù)的起始位置為 125,結(jié)束位置為 1750,
2.7?mysqlbinlog
????????接下來(lái)使用 mysqlbinlog 命令執(zhí)行?binlog 文件,恢復(fù)數(shù)據(jù),命令如下:
mysqlbinlog -v /var/lib/mysql/binlog.000017 --start-position=125 --stop-position=1750 | mysql -uroot -p1234
? ? ? ? ?數(shù)據(jù)就被恢復(fù)成功了。
三、復(fù)雜場(chǎng)景演示
????????先通過(guò)下面的命令查看下 binlog 是否開(kāi)啟,以及日志存儲(chǔ)的位置
show variables like '%log_bin%'
3.1 背景
? ? ? ? 1、此時(shí)演示的數(shù)據(jù)庫(kù)版本是 Mysql 8.0。
? ? ? ? 2、創(chuàng)建表、插入數(shù)據(jù)和刪除表不是在一個(gè) binlog 里面完成的。
? ? ? ? 3、binlog 里面存儲(chǔ)了不止一個(gè)數(shù)據(jù)庫(kù)的日志。
3.2 現(xiàn)狀
? ? ? ? 此時(shí)我們有一個(gè)庫(kù),里面有三張表,如下,具體什么時(shí)候創(chuàng)建的,不記得了,現(xiàn)在我們把他刪除掉,看看能不能給還原回去。
3.3?刪除數(shù)據(jù)庫(kù)
? ? ? ? 執(zhí)行下面的語(yǔ)句將數(shù)據(jù)庫(kù)刪除掉。
drop DATABASE itcast;
3.4 數(shù)據(jù)復(fù)原
? ? ? ? 1、執(zhí)行?flush logs 命令,使其產(chǎn)生一個(gè)新的 binlog 文件
? ? ? ? 2、執(zhí)行下面的命令,看下系統(tǒng)有多少個(gè) binlog 文件。
show master logs;
????????3、挨個(gè)遍歷,執(zhí)行下面的命令,挨個(gè) binlog 日志去查看
show binlog events in 'DESKTOP-B0B82CP-bin.000001';
show binlog events in 'DESKTOP-B0B82CP-bin.000002';
show binlog events in 'DESKTOP-B0B82CP-bin.000003';
show binlog events in 'DESKTOP-B0B82CP-bin.000004';
show binlog events in 'DESKTOP-B0B82CP-bin.000005';
show binlog events in 'DESKTOP-B0B82CP-bin.000006';
show binlog events in 'DESKTOP-B0B82CP-bin.000007';
? ? ? ? 1、發(fā)現(xiàn)第一個(gè)有關(guān)于 itcast 的日志位置,如下
? ? ? ? 把涉及到的這幾個(gè) binlog 日志都拷貝到另外的文件夾里面去,因?yàn)?MySQL Server 8.0 這個(gè)目錄識(shí)別不了,真坑爹。?
?
?? ? ? ? 拷貝完成后,執(zhí)行下面的語(yǔ)句:
mysqlbinlog -v C:/1/DESKTOP-B0B82CP-bin.000003 --start-position=424 --stop-position=543 | mysql -uroot -p123456
? ? ? ? 執(zhí)行成功后,可以看到,數(shù)據(jù)庫(kù)被恢復(fù)成功了,不過(guò)現(xiàn)在只是個(gè)空庫(kù),如下圖:
????????2、繼續(xù)向下搜尋有關(guān) itcast 的 binlog 日志,如下圖,又在 binlog 里面發(fā)現(xiàn)了有關(guān) itcast 的日志,
mysqlbinlog -v C:/1/DESKTOP-B0B82CP-bin.000005 --start-position=125 --stop-position=9655 | mysql -uroot -p123456
? ? ? ? 繼續(xù)找,繼續(xù)還原。?
mysqlbinlog -v C:/1/DESKTOP-B0B82CP-bin.000005 --start-position=11607 --stop-position=12344 | mysql -uroot -p123456
? ? ? ? 繼續(xù)找,繼續(xù)還原。
mysqlbinlog -v C:/1/DESKTOP-B0B82CP-bin.000005 --start-position=14152 --stop-position=14742 | mysql -uroot -p123456
????????到此為止,就都找全了,數(shù)據(jù)也都恢復(fù)回來(lái)了。
柚子快報(bào)邀請(qǐng)碼778899分享:Mysql 恢復(fù)誤刪庫(kù)表數(shù)據(jù)
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。