有時候我們可能因為手抖或者粗心,執行了一條delete語句,導致正常的業務數據被刪除了。
別慌,也先別跑路。
有很多種方式可以恢復回來,這一篇文章就來聊聊使用my2sql工具解析出delete語句的回滾操作(也就是insert),來恢復delete誤刪除的數據。
my2sql工具Github地址:https://github.com/liuhr/my2sql
不過要想使用my2sql恢復數據,需要注意這些:
- binlog格式必須為row,且binlog_row_image=full(表示記錄的二進制日志將包含所有列的值,包括舊值和新值)
- 只能回滾DML, 不能回滾DDL
- 8.0 用戶密碼認證必須是MySQL_native_password才能解析
我們通過一個實驗來模擬誤操作,并進行恢復。
一、新建測試表和測試用戶
創建測試表并寫入數據:
create database d_recover;
use d_recover;
CREATE TABLE del_t1 (
id int NOT NULL AUTO_INCREMENT,
a int NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB CHARSET=utf8mb4;
insert into del_t1 values (1,1),(2,2);
創建恢復用戶:
CREATE USER `u_rollback`@`127.0.0.1` IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'IgdI8G_aUU';
GRANT SELECT, REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO `u_rollback`@`127.0.0.1`;
二、安裝Binlog解析工具my2sql
下載my2sql:
mkdir /data/backup/rollback -p
cd /data/backup/rollback
wget https://github.com/liuhr/my2sql/blob/master/releases/centos_release_7.x/my2sql
三、模擬誤操作
delete from d_recover.del_t1;
四、把誤操作事務所在的Binlog復制到新目錄
mkdir /data/backup/rollback
cp /data/mysql/binlog/mysql-bin.000012 /data/backup/rollback
五、查看誤操作事務開始和結束的位點
解析誤操作期間的Binlog,預估誤操作大概的起止時間,范圍可以稍微大一點。
cd /data/backup/rollback
mysqlbinlog mysql-bin.000012 --start-datetime='2023-06-21 01:20:00' --stop-datetime='2023-06-21 01:40:00' ---output=decode-rows -v > operation.sql
找到誤操作的Binlog,并確定開始和結束的位點:
比如上面解析出的Binlog,誤操作開始的位點可以認為是3556,結束的位點是3719
六、生成回滾SQL
/data/backup/rollback
./my2sql -user u_rollback -password 'IgdI8G_aUU' -host 127.0.0.1 -databases d_recover -tables del_t1 -work-type rollback -start-file mysql-bin.000012 -start-pos 3556 -stop-pos 3719 -output-dir recover_01
查看并確認回滾SQL:
cat recover_01/rollback.12.sql
七、導入回滾的SQL
如果確定回滾的SQL沒問題,把回滾SQL導入到誤操作的庫里:
mysql -uroot -p <recover_01/rollback.12.sql
再進行數據確認:
select * from d_recover.del_t1;
如果一切順利,那誤刪除的數據(1,1),(2,2)就已經恢復回來了。
當然,數據恢復還有其他的一些方式,比如:全備+Binlog、延遲從庫(主庫有誤操作,從庫同步到誤操作前一個事務)、新建從庫同步到誤操作前一個事務等等,后面會找時間分享這些恢復方式。
作者丨馬聽
來源丨公眾號:MySQL數據庫聯盟(ID:gh_fbfc36d26181)