一、前言
在實際工作中,可能有些剛工作不久的同學會誤刪了生產或測試環境的資料
,這時怎麼恢復Mysql中誤刪的資料呢?
大部分同學都知道可以透過binlog來恢復資料,但是具體如何操作可能還不是很清楚,接下來就來介紹下如何透過binlog日誌來恢復資料
二、準備工作
這裡我使用的是windows的Mysql5.7版本
2.1 開啟binlog日誌
首先檢視當前mysql是否已開啟binlog,命令如下
show variables like 'log_bin';
如果未開啟,修改配置檔案my.ini 或 my.cnf,新增開啟binlog配置,如下
[mysqld] log-bin=mysql-bin binlog-format=ROW server_id=1
- 重啟Mysql
2.2 建立測試資料並備份
建立一個資料庫test,並建立table1表,表結構如下
CREATE TABLE `table1` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入5條資料,如下
INSERT INTO `test`.`table1`(`id`, `name`) VALUES (1, '111');
INSERT INTO `test`.`table1`(`id`, `name`) VALUES (2, '222');
INSERT INTO `test`.`table1`(`id`, `name`) VALUES (3, '333');
INSERT INTO `test`.`table1`(`id`, `name`) VALUES (4, '444');
INSERT INTO `test`.`table1`(`id`, `name`) VALUES (5, '555');
OK,到這裡我們的table1表裡已經有5條測試資料了。
現在使用mysqldump工具對test庫進行備份,備份檔名為test.sql,命令如下
mysqldump -uroot -p test --master-data=2 --single-transaction > test.sql
2.3 模擬誤刪操作
接下來繼續往table1表中新增3條資料,如下
INSERT INTO `test`.`table1`(`id`, `name`) VALUES (6, '666');
INSERT INTO `test`.`table1`(`id`, `name`) VALUES (7, '777');
INSERT INTO `test`.`table1`(`id`, `name`) VALUES (8, '888');
這時我們透過清空該表來模擬誤刪操作
truncate table table1;
那麼接下來我們如何來恢復table1表中的資料(8條)?
其實就是透過備份檔案 + binlog的增量資料
的方式來恢復,接下來介紹具體步驟
三、具體步驟
- 首先我們開啟備份檔案test.sql,找到MASTER_LOG_POS字樣,並記住該偏移量799674,如下圖
這說明我們的備份檔案是在這個位置進行備份的 - 在mysql的data目錄下找到對應的binlog檔案,透過mysqlbinlog工具將binlog日誌以明文的方式輸出到test.binlog檔案中,如下
mysqlbinlog --no-defaults ..\data\mysql-bin.000002 -vv>test.binlog
- 開啟test.binlog檔案,找到執行truncate語句的位置並記下來,如下圖
這裡偏移量為800469 繼續使用mysqlbinlog工具,指定起始位置和終止位置,匯出sql語句到inc.binlog檔案中,命令如下
mysqlbinlog --no-defaults --database=test ..\data\mysql-bin.000002 --start-position=799674 --stop-position=800469 -vv >inc.binlog
如果起始位置和終止位置不在同一個binlog中,可以使用如下命令
mysqlbinlog --no-defaults --database=test ..\data\mysql-bin.000002 ..\data\mysql-bin.000003 --start-position=起始位置 --stop-position=終止位置 -vv >inc.binlog
在test資料庫下執行備份檔案test.sql,恢復到備份位置
use test; source E:\mysql\bin\test.sql
再執行inc.binlog,恢復到truncate之前的位置,如下
source E:\mysql\bin\inc.binlog
- 最終資料恢復到truncate之前