MySQL 通過 binlog 恢復資料

2021-09-12 22:05:12 字數 3331 閱讀 7848

通過了解 binlog 日誌的相關配置,簡單掌握通過 binlog 對資料庫進行資料恢復操作;

任何成熟軟體都會有一套成熟的日誌系統,當軟體出現問題時,這些日誌就是查詢問題**的寶庫。同樣,mysql 也不例外,也會有一系列日誌記錄 mysql 的執行狀態。

mysql 主要有以下幾種日誌:

這些日誌均需要在 my.cnf 檔案進行配置,如果不知道 mysql 的配置檔案路徑,可以使用 mysql 命令進行查詢,

mysql --verbose --help|grep -a 1 'default options』 #該命令會羅列出my.cnf 順序查詢的路徑。
binlog 就是 binary log,二進位制日誌檔案,記錄所有資料庫更新語句,包括表更新和記錄更新,即資料操縱語言(dml),binlog 主要用於資料恢復和配置主從複製等;

mysql 按照功能分為服務層模組和儲存引擎層模組,服務層負責客戶端連線、sql 語句處理優化等操作,儲存引擎層負責資料的儲存和查詢;binlog 屬於服務層模組的日誌,即引擎無關性,所有資料引擎的資料更改都會記錄binlog日誌。當資料庫發生崩潰時,如果使用innodb 引擎,binlog 日誌還可以檢驗 innodb 的 redo 日誌的 commit 情況。

1、新增配置

log_bin=on

log_bin_basename=/path/bin-log

log_bin_index=/path/bin-log.index

2、僅僅設定log-bin引數

log-bin=/path/bin-log
當開啟 binlog 日誌之後,mysql 會建立乙個 log_bin_index 指定的 .index 檔案和多個二進位制日誌檔案,index 中按順序記錄了mysql使用的所有 binlog 檔案。binlog 日誌則會以指定的名稱(或預設值) 加自增的數字作為字尾,ex:bin-log.000001,當發生下述三種情況時,binlog 日誌便會進行重建:

檔案大小達到 max_binlog_size 引數的值

執行 flush logs 命令

重啟 mysql 服務

通過引數 binlog_format 引數的值,可以設定 binlog 的格式,可選值有 statement、row、mixed

* statement 格式:記錄資料庫執行的原始 sql 語句

* row 格式:記錄具體的行的修改,這個為目前預設值

* mixed 格式:因為上邊兩種格式各有優缺點,所以就出現了 mixed 格式

因為 binlog 是二進位制檔案,不能像其他檔案一樣,直接開啟檢視。但 mysql 提供了binlog 檢視工具 mysqlbinlog,可以解析二進位制檔案。當然不同格式的日誌解析結果是不一樣的;

1. statement 格式日誌,執行 mysqlbinlog  /path/bin-log.000001,可以直接看到原始執行的 sql 語句

2. row格式日誌,則可讀性沒有那麼好,但仍可通過引數使文件更加可讀 mysqlbinlog -v /path/bin-log.000001

mysqlbinlog兩對非常重要的引數

1. --start-datetime  --stop-datetime 解析某乙個時間段內的binlog;

2. --start-position --stop-position 解析在兩個position之間的binlog;

使用 binlog 恢復資料,本質上就是通過 binlog 找到所有 dml 操作,去掉錯誤的 sql 語句,然後重走一遍長征路,就可以將資料恢復;

建立資料表並插入初始值

create table `users` (

`id` int(11) unsigned not null auto_increment,

`name` varchar(255) default null,

`age` int(8) default null,

primary key (`id`)

) engine=innodb default charset=utf8mb4;

insert into `users` (`id`, `name`, `age`)

values

(null, '姓名一', 5);

mysqldump -uroot -p t > /path/***.sql;   # 備份資料庫

show master status; # 檢視當前的position位置,此時值為154

插入多條記錄

insert into `users` (`id`, `name`, `age`)

values

(null, '姓名二', 13),

(null, '姓名三', 14),

(null, '姓名四', 15),

(null, '姓名五', 16),

(null, '姓名六', 17);

進行誤操作,並且在誤操作之後又插入幾條資料

update users set age = 5;

insert into `users` (`id`, `name`, `age`)

values

(null, '姓名七', 16),

(null, '姓名八', 18);

發現誤操作之後,進行資料恢復,首先停止 mysql 對外的服務,利用備份資料恢復到上次資料;

通過 mysqlbinlog 命令對二進位制檔案進行分析,分析發現

誤操作發生在position為706位置,且上次正常操作的結束位置在513

在1152到結尾位置有正常執行的sql執行

通過 mysqlbinlog 命令從 binlog 日誌中匯出可執行的 sql 檔案,並將資料匯入到mysql

mysqlbinlog --start-position=154  --stop-position=513  bin-log.000001 > /path/bak.sql;

mysql -uroot -p < /path/bak.sql;

跳過錯誤的更新語句,再通過步驟7的邏輯把後續正常語句重新跑一遍,完成資料恢復工作

無論什麼時間,資料庫發生崩潰都會令人愁眉緊鎖,心煩意亂。binlog可以說是在各種情況下,資料庫崩潰、資料丟失之後的一粒後悔藥,本文通過線下環境,簡單的對資料庫進行了一次資料恢復實驗,如有不對,還請指教

MySQL通過bin log恢復資料

binlog是server層實現的二進位制日誌,他會記錄我們的crud操作。因此如果我們誤刪了資料庫,我們可以通過binlog來進行恢復。一 首先,我們需要開啟mysql的binlog功能。binlog預設是關閉的,需要手動開啟 通過以下命令檢視binlog是否開啟 show variables l...

mysql 資料恢復 通過binlog恢復資料

1 首先登入mysql 2 檢視是否開啟bin日誌 show variables like log bin 3 檢視正在被記錄的檔案 show master status 5 篩選出指定表的sql 例如表名為 address list grep address list 1sql basic.sql...

通過binlog恢復mysql備份之前的資料

其中我們提到了的備份資料庫要晚與要恢復的資料庫時間,即要恢復的資料庫在前,而備份的資料庫在後。當時我提到說會單獨寫一篇文章講解這個情況,本篇文章我就來介紹如何通過binlog日誌恢復比備份資料庫早時的資料庫狀態。我們還是以上篇文章的資料及備份檔案為基礎,來進行本篇文章的講解。ailanni資料庫完整...