MySQL基於binlog恢復資料遇到的問題

2021-10-14 06:05:30 字數 1951 閱讀 4027

一、背景

因為在一次上線的過程中,由於上線給的資料庫表表明相同,而資料庫名不同,由於同事給的sql語句沒有評審,並未給建立資料庫語句,導致已存在生產的資料庫表被重建了,被重建表的資料庫表資料完全丟失。基於這種情況需要緊急恢復資料。但是,鬱悶的是aws的快照在20天前就停止了,最近的資料也只能從20天前資料為基點。恢復過程中,沒有想象的恢復那麼順利,總結如下:

二、方法一 基於通用方法恢復資料

基於下面這些命令,都沒有成功恢復資料。

$> /usr/bin/mysqlbinlog --no-defaults ‐‐stop‐position=123 ‐‐stop‐position="1493923" /db/mysql/mysql-bin.000022|mysql ‐uabc ‐p test
或匯出sql,再匯入到庫。

$> /usr/bin/mysqlbinlog  -v --base64-output=decode-rows \

--start-datetime "2020-12-09 00:00:00" \

--stop-datetime "2020-12-29 00:00:00" \

-vv \

/db/mysql/mysql-bin.000020 >> /home/centos/binlog20-2020-12-29.sql

mysql> source /home/centos/binlog20-2020-12-29.sql;

三、 方法二 從binlog檔案提出標準sql語句

使用binglog2sql前提是mysql必須配置了binlog,並且是row處理如下:

[mysqld]

server_id = 1

log_bin = /db/mysql/mysql-bin.log

max_binlog_size = 1g

binlog_format = row

binlog_row_image = full

3.1、 安裝binlog2sql

shell> git clone  && cd binlog2sql

shell> pip install -r requirements.txt

3.2、使用binlog2sql將binlog日誌生成標準sql語句

shell> python binlog2sql.py -h127.0.0.1 -p3306 -uabc -p'abcdefw' \

--start-datetime='2020-12-15 00:00:00' --stop-datetime='2020-12-18 00:00:00' \

-dtest--start-file='mysql-bin.000020' > bin20-2020-12-18.sql

3.3、 匯入sql

在執行source bin20-2020-12-18.sql;我這裡出現了匯入錯誤,這也是為什麼採用方法一直恢復資料不成功的原因。究竟原因就是匯入sql出現了表字段不對應問題。這是由於當前的表的字段順序,跟當時的binlog儲存的字段順序不一致,究竟原因可能恢復節點的時間後面進行資料庫表字段順序調整引起的。

由於binlog2sql工具執行原理,實際就是兩步:「將binlog檔案翻譯成偽sql」 和 「將偽sql裡面的@序號代表的表欄位名進行替換,比如@ 1 代表欄位name,將name替換@1」。所以,解決辦法,檢視sql,將當前的資料庫表字段順序調整成binlog正確的儲存順序。

調整表字段順序sql例如:

alter table user_profile modify name varchar(10) after uid;
明白了binlog2sql工具原理後,調整表字段順序,重新匯出sql,然後再匯入sql,即可以一步一步完成資料恢復,從20天前的資料恢復,雖然時間比較長,但是這種方式穩妥最佳。

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...

MySQL(二)BinLog恢復資料

有時,我們誤刪了mysql資料庫的一些資料,肯定希望能夠恢復我們誤刪的資料,這是可以解決的。有乙個解決的方案是使用mysql的二進位制日誌,也是我們經常說的binlog,不過前提是,在啟動mysql時已經啟用binlog功能。檢視binlog功能是否啟用 看到第一行的variable name為lo...

MySQL 通過 binlog 恢復資料

通過了解 binlog 日誌的相關配置,簡單掌握通過 binlog 對資料庫進行資料恢復操作 任何成熟軟體都會有一套成熟的日誌系統,當軟體出現問題時,這些日誌就是查詢問題 的寶庫。同樣,mysql 也不例外,也會有一系列日誌記錄 mysql 的執行狀態。mysql 主要有以下幾種日誌 這些日誌均需要...