Mysql 如何使用 binlog 日志回滾操作失誤的數據

文章目錄

    • 一、背景
    • 二、準備測試數據
      • 1. 創建測試表
      • 2. 創建測試數據
    • 三、模擬誤操作
    • 四、數據回滾
      • (一)方案一:云數據庫恢復
      • (二)方案二:手動恢復
        • 1. 查詢 binlog 日志
        • 2. 找到刪除語句,手動還原為插入語句
      • (三)方案三: 導入還原的 sql(未測試,慎用)
      • 總結

一、背景

在日常開發運維中,我們可能會出現一些操作失誤的情況,比如使用了錯誤的 sql 語句對 mysql 數據進行了 update、delete 等操作,失誤操作導致數據出現問題,又或者架構設計上沒有使用軟刪除機制,用戶誤刪除了數據需要恢復。

那么如果出現這種情況,應該如何恢復失誤/mysql 誤刪數據時,本文將使用幾種常用方法一步一步帶你回滾誤刪/誤操的數據

二、準備測試數據

1. 創建測試表

create table jxy_pms.test_model
(create_time       bigint unsigned default 0     null,update_time       bigint unsigned default 0     null,delete_time       bigint unsigned default 0     null,test_model_id     varchar(255)                  not nullprimary key,name              varchar(255)                  null,remark            varchar(255)                  null
)collate = utf8mb4_unicode_ci;

2. 創建測試數據

insert into test_model (test_model_id, name, remark)
values ('1','test1','test-1'),('2','test2','test-2'),('3','test3','test-3');select * from test_modeltest_model_id  name   remark
1                 test1    test-1
2              test2    test-2
3                 test3    test-3

三、模擬誤操作

delete from test_model

四、數據回滾

(一)方案一:云數據庫恢復

如果你的 mysql 使用的時云數據庫,比如阿里云、騰訊云,那么你可以到云數據庫的控制臺操作面板進行一鍵數據回滾,一般都可以選擇對應的恢復區間,具體可以咨詢對應的云數據庫提供商,一般都會提供技術支持

優點:

  • 低風險
  • 操作簡單
  • 有云供應商提供技術支持

缺點:

  • 恢復精度較低,沒辦法恢復指定的數據
  • 有可能恢復不全,云數據庫是定期備份,可能還沒來得及備份就被刪了

(二)方案二:手動恢復

通過解讀 binlog 日志內容,進行解析然后回放數據

binlog 日志:大白話:記錄數據庫的每個修改操作 sql

所以我們只需要找到對應的 binlog 日志中我們誤操作的 sql 數據,然后編寫對應的回放sql,就可以回滾數據

實操如下:

1. 查詢 binlog 日志
show binary logs;SHOW MASTER STATUS;mysql-bin.000014    80019706    No
mysql-bin.000015    1326884    No
mysql-bin.000016    3650781    No
mysql-bin.000017    81424072    No
mysql-bin.000018    46681992    No
mysql-bin.000019    1075    No
mysql-bin.000020    207322979    No

可以看到最新的日志為:mysql-bin.000020

2. 找到刪除語句,手動還原為插入語句
mysqlbinlog --no-defaults --verbose --base64-output=DECODE-ROWS --start-datetime='2025-01-16 15:12:00' --stop-datetime='2025-01-16 15:15:00' /var/lib/mysql/mysql-bin.000027 > /home/DataVolume/rec.sql
  • –base64-output=DECODE-ROWS 生成不加密的 sql 文件
  • –start-datetime 、stop-datetime 數據操作的時間區間

從 rec.sql 中找到對應的表 test_model 的刪除操作,如果找不到,調整下–start-datetime 和 stop-datetime

找到刪除的 sql 語句如下:

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
........
/*!*/;
# at 207319108
#240919 10:58:30 server id 1  end_log_pos 207319202 CRC32 0xe7b80345     Table_map: `jxy_pms`.`asynccron_cron_task` mapped to number 306#240919 10:59:04 server id 1  end_log_pos 207321626 CRC32 0x6b3323a9     Table_map: `jxy_pms`.`test_model` mapped to number 315
# at 207321626
#240919 10:59:04 server id 1  end_log_pos 207321718 CRC32 0xb004dad7     Delete_rows: table id 315 flags: STMT_END_F
### DELETE FROM `jxy_pms`.`test_model`
### WHERE
###   @1='1'
###   @2='test1'
###   @3='test-1'
### DELETE FROM `jxy_pms`.`test_model`
### WHERE
###   @1='2'
###   @2='test2'
###   @3='test-2'
### DELETE FROM `jxy_pms`.`test_model`
### WHERE
###   @1='3'
###   @2='test3'
###   @3='test-3'
# at 207321718
#240919 10:59:04 server id 1  end_log_pos 207321749 CRC32 0x90b858f7     Xid = 7486642
COMMIT/*!*/;

然后寫個腳本,解析這塊 sql,重新翻譯為 insert 語句即可

優點:

  • 適合一些少量數據的還原
  • 能準確還原指定的數據,操作簡單
  • 重新執行的 sql,不會對已有的數據造成其他損壞

缺點:

  • 不適合一些大量數據的還原
  • 比較復雜,需要解讀 binlog 日志,并且需要編寫腳本

(三)方案三: 導入還原的 sql(未測試,慎用)

如果你的數據庫不是用的云數據庫,沒有一鍵恢復功能,然后你又不想用方案二,覺得太復雜,你可以直接將 binlog 日志直接全部還原

  • 先導出 binlog 日志

    mysqlbinlog --no-defaults --verbose --base64-output=DECODE-ROWS --start-datetime='2025-01-16 15:12:00' --stop-datetime='2025-01-16 15:15:00' /var/lib/mysql/mysql-bin.000027 > /home/DataVolume/rec.sql
    

    這里會導出 rec.sql 文件

  • 導入 sql

    mysql -u root -p test < rec.sql
    

優點

  • 相比較方案二簡單一些
  • 適合范圍恢復

缺點

  • 恢復精度較低,比如你可能只需要恢復 2025-01-16 15:12:00 這個點的某條錯誤sql,但是這個點可能還有其他操作sql也會被一起恢復,
  • 恢復期間的操作數據可能存在丟失

??????:本方案沒有實際驗證過,請自行測試

總結

如果你用的是云數據庫,并且恢復的數據量比較大,推薦【方案一】使用云數據庫提供的恢復功能(非常適用那么刪庫跑路的恢復,哈哈哈哈)

如果你只是想要恢復某個個點、某些錯誤sql,那么可以使用【方案二】

原文地址

Mysql 如何使用 binlog 日志回滾操作失誤的數據

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92424.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wodpress結構化數據對SEO的作用

在 WordPress 網站中&#xff0c;結構化數據對 SEO 的作用主要體現在以下幾個方面&#xff1a; 1. 提升搜索結果的可見性 結構化數據能夠幫助搜索引擎更好地理解網頁內容&#xff0c;從而以更精準的方式展示搜索結果。通過添加結構化數據&#xff0c;網頁可以在搜索結果中顯示…

講一講@ImportResource

題目詳細答案ImportResource是 Spring 框架中的一個注解&#xff0c;用于將傳統的 XML 配置文件導入到基于 Java 配置的 Spring 應用程序中。它允許開發者在使用 Java 配置的同時&#xff0c;繼續利用現有的 XML 配置文件。這樣可以逐步遷移舊的 XML 配置&#xff0c;或者在某些…

解決 Nginx 反代中 proxy_ssl_name 環境變量失效問題:網頁能打開但登錄失敗

前言&#xff1a;在現代企業架構中&#xff0c;多域名反向代理是實現業務隔離、品牌獨立的常見方案。然而&#xff0c;看似簡單的Nginx配置背后&#xff0c;隱藏著與TLS協議、后端認證邏輯深度綁定的細節陷阱。本文將從原理到實踐&#xff0c;詳解為何在多域名場景下&#xff0…

三步完成,A100本地vLLM部署gpt-oss,并啟動遠程可訪問api

A100本地vLLM部署gpt-oss&#xff0c;并啟動遠程可訪問api GPT-oss試用 gpt-oss有兩個原生配置是目前&#xff08;2025-8-8&#xff09;Ampere系列顯卡不支持的&#xff0c;分別是默認的MXFP4量化&#xff0c;以及Flash-attn V3。官方給出的vllm教程也是默認使用的是H系列顯卡…

【華為機試】63. 不同路徑 II

文章目錄63. 不同路徑 II題目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解題思路核心思想&#xff1a;動態規劃&#xff08;避開障礙&#xff09;算法流程復雜度分析邊界與細節方法對比代碼實現Go 實現&#xff08;含二維DP / 一維DP / 記憶化&#xff09;測試…

C++ 模擬實現 map 和 set:掌握核心數據結構

C 模擬實現 map 和 set&#xff1a;掌握核心數據結構 文章目錄C 模擬實現 map 和 set&#xff1a;掌握核心數據結構一、set 和 map 的結構1.1 set的結構1.2 map的結構二、對紅黑樹的改造2.1 改造紅黑樹的節點2.2 改造紅黑樹2.2.1 仿函數的使用2.2.2 插入函數的改造2.2.3 刪除函…

根據ASTM D4169-23e1標準,如何選擇合適的流通周期進行測試?

根據ASTM D4169-23e1標準及行業實踐&#xff0c;選擇流通周期&#xff08;DC&#xff09;需綜合以下因素&#xff1a;一、核心選擇依據?產品屬性與包裝形式??重量體積?&#xff1a;輕小包裹&#xff08;<4.53kg且<0.056m&#xff09;適用DC2/3/4/6/9/13-17等周期&…

MySQL的觸發器:

目錄 觸發器的概念&#xff1a; 創建觸發器&#xff1a; 查看觸發器&#xff1a; 查看當前數據庫的所有觸發器的定義&#xff1a; 查看當前數據中某個觸發器的定義&#xff1a; 從系統information_schema的TRIGGERS表中查詢"salary_check_trigger"觸發器的信息…

基于ubuntu搭建gitlab

原文地址&#xff1a;基于ubuntu搭建gitlab – 無敵牛 歡迎參觀我的網站&#xff1a;無敵牛 – 技術/著作/典籍/分享等 之前介紹了一個使用 git openssh-server 搭建一個極簡 git 庫的方法&#xff0c;感興趣可以查看往期文章&#xff1a;手搓一個極簡遠端git庫 – 無敵牛 。…

測試GO前沿實驗室:為水系電池研究提供多維度表征解決方案

測試GO前沿實驗室&#xff1a;為水系電池研究提供多維度表征解決方案隨著全球能源轉型加速&#xff0c;水系電池因其高安全性、低成本和環境友好特性&#xff0c;成為下一代儲能技術的重要發展方向。測試狗前沿實驗室針對水系電池研發中的關鍵科學問題&#xff0c;整合先進表征…

Spring Boot 中 YAML 配置文件詳解

Spring Boot 中 YAML 配置文件詳解 在 Spring Boot 項目中&#xff0c;配置文件是不可或缺的一部分&#xff0c;用于自定義應用行為、覆蓋默認設置。除了傳統的 properties 文件&#xff0c;Spring Boot 對 YAML&#xff08;YAML Ain’t Markup Language&#xff09;格式提供了…

Milvus安裝可視化工具,attu,保姆級

安裝包鏈接&#xff1a;GitHub - zilliztech/attu: Web UI for Milvus Vector Databasehttps://github.com/zilliztech/attu?tabreadme-ov-file 下滑 舉例&#xff1a;windows&#xff1a;下載安裝&#xff0c;然后就可以連接了&#xff08;安裝完打開后如果需要輸入用戶名密碼…

避免“卡脖子”!如何減少內存I/O延遲對程序的影響?

單來說&#xff0c;內存 IO 就像是計算機的 “數據高速公路”&#xff0c;負責在內存和其他設備&#xff08;如硬盤、CPU 等&#xff09;之間傳輸數據。它的速度和效率直接影響著計算機系統的整體性能。 你有沒有想過&#xff0c;當你點擊電腦上的一個應用程序&#xff0c;它是…

V4L2攝像頭采集 + WiFi實時傳輸實戰全流程

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry V4L2攝像頭采集 WiFi實時傳輸實戰全流程 1. 實戰場景概述 目標&#xff1a; 嵌入式設備&#xff08;如RK3588/正點原子開發…

Java 之 設計模式

1.單例模式1. ??餓漢式&#xff08;Eager Initialization&#xff09;????核心原理??&#xff1a;類加載時立即創建實例&#xff0c;通過靜態變量直接初始化。??代碼示例??&#xff1a;public class Singleton {private static final Singleton INSTANCE new Sing…

[激光原理與應用-185]:光學器件 - BBO、LBO、CLBO晶體的全面比較

一、相同點非線性光學晶體屬性BBO、LBO、CLBO均為非中心對稱晶體&#xff0c;具備非線性光學效應&#xff0c;廣泛應用于激光頻率轉換&#xff08;如倍頻、三倍頻、和頻、差頻&#xff09;、光學參量振蕩&#xff08;OPO&#xff09;及電光調制等領域。寬透光范圍三者均覆蓋紫外…

Android APN加載耗時優化可行性分析

背景 根據Android系統底層機制和行業實踐,本文討論 APN 加載耗時從4.2s降至0.8s的數據合理性和技術可行性,需結合具體優化手段和硬件環境綜合分析。 以下是關鍵判斷依據及行業參考: ?? 一、APN加載耗時基準參考 未優化場景的典型耗時 首次開機或重置后:APN需從apns-con…

mysql進階-sql調優

概述優化索引在MySQL初階的課程中已經介紹了索引&#xff0c;我們知道InnoDB存儲引擎使?B樹作為索引默認的數據結構來組織數據&#xff0c;為頻繁查詢的列建?索引可以有效的提升查詢效率&#xff0c;那么如何利?索引編寫出?效的SQL查詢語句&#xff1f;以及如何分析某個查詢…

海量數據處理問題詳解

1.從a&#xff0c;b兩個文件各存放50億個url&#xff08;每個url大小為64B&#xff09;&#xff0c;如何在內存為4G中查找a&#xff0c;b中相同的url 計算各文件存放大小&#xff1a;50億*64B 大約為320G&#xff0c;而內存只有4G&#xff0c;顯然存放不下&#xff0c;此時我們…

AI 記憶管理系統:工程實現設計方案

本文檔為《從“健忘”到“懂我”&#xff1a;構建新一代AI記憶系統》中所述理念的詳細工程實現方案。它將聚焦于技術選型、模塊設計、數據流轉和核心算法&#xff0c;為開發團隊提供清晰的落地指引。 1. 系統架構與技術選型 為實現分層記憶與讀寫分離的設計理念&#xff0c;我們…