搜尋
首頁資料庫mysql教程MySQL根據離線binlog快速「閃回」的詳情介紹

昨天突然有個客戶說誤操作,自己刪除了大量數據,CTO直接將我拉到一個討論組裡,說要幫他們恢復數據。他們自己挖的坑,打算讓開發那邊根據業務日誌去恢復,被告知只記錄的刪除主鍵這樣的信息,物理刪除,無能為力。

上伺服器看了下記錄的日誌,發現好幾台上面都有被誤刪的記錄輸出。阿里RDS雖然可以複製一個恢復到刪除時間點前的實例,但這散落的幾萬個id找起來費力,還有就是幾個表之間關聯的資料也要恢復,覺得麻煩。

想到 MySQL 的閃回方案。以前看過好幾篇相關文章,甚至差點自己用python擼一個來解析binlog,反轉得到回滾sql,實在沒空,這下要急用了。趕緊找了下網路「現成的方案」。

正文開始


MySQL(含阿里RDS)快速閃回可以說是對資料庫誤操作的後悔藥,flashback功能可以將資料庫回到誤操作之前。但是即使oracle資料庫也只支援短時間內的閃回。

網路上現有開源的MySQL閃回實現,原理都是解析binlog,生成反向sql: (必須為row模式)

  1. 對於delete 操作,生成insert (DELETE_ROWS_EVENT)

  2. 對於update 操作,交換binlog裡面值的順序(UPDATE_ROWS_EVENT)

  3. #對於insert 操作,反向產生delete ( WRITE_ROWS_EVENT)

  4. 對於多個event,要逆向產生sql

上面兩種實作方式,都是透過python-mysql-replication 套件,模擬出原庫的一個從庫,然後show binary logs 來取得binlog,發起同步binlog的請求,再解析EVENT。但阿里雲 RDS 的binlog在同步給從函式庫之後, 很快就被 purge 掉了 。如果要恢復 昨天 部分資料 ,兩個方案都是拿不到binlog的。也就是閃回的時間有限。

還有一些比較簡單的實現,就是解析 binlog 物理文件,實現回滾,如 binlog-rollback.pl ,試過,但是速度太慢。

為了不影響速度,又想使用比較成熟的閃回方案,我們可以這樣做:

  1. 借助一個自建的mysqld 實例,將已purge掉的binlog拷貝到該實例的目錄下

  2. 在自建實例裡,提前創建好需要恢復的表(結構),因為工具需要連接上來從information_schema.columns 取得元資料資訊

  3. 拷貝的時候,可以替換掉mysql實例自己的binlog檔名,保持連續

  4. ##可能要修改

    mysql-bin.index,確保檔名還能被mysqld辨識到

  5. 重啟mysql實例,

    show binary logs 看一下是否在清單裡面

  6. 接下來就可以使用上面任何一種工具,模擬從庫,指定一個binlog文件,開始時間,結束時間,得到回滾SQL

  7. #再根據業務邏輯,篩選出需要的sql

總之就是藉助另外一個mysql,把binlog event傳輸過來。溫馨提示:

  1. 兩個實例間版本不要跨度太大

  2. #注意檔案權限

  3. 如果原庫開啟了gtid,這個自建實例也要開啟gtid

範例:

python mysqlbinlog_back.py --host="localhost" --username="ecuser" --password="ecuser" --port=3306 \
--schema=dbname --tables="t_xx1,t_xx2,t_xx3" -S "mysql-bin.000019" -E "2017-03-02 13:00:00" -N "2017-03-02 14:09:00" -I -U

===log will also  write to .//mysqlbinlog_flashback.log===
parameter={'start_binlog_file': 'mysql-bin.000019', 'stream': None, 'keep_data': True,
 'file': {'data_create': None, 'flashback': None, 'data': None}, 'add_schema_name': False, 'start_time': None, 
 'keep_current_data': False, 'start_to_timestamp': 1488430800,
 'mysql_setting': {'passwd': 'ecuser', 'host': 'localhost', 'charset': 'utf8', 'port': 3306, 'user': 'ecuser'},
 'table_name': 't_xx1,t_xx2,t_xx3', 'skip_delete': False, 'schema': 'dbname', 'stat': {'flash_sql': {}},
 'table_name_array': ['t_xx1', 't_xx2', 't_xx3'],
 'one_binlog_file': False, 'output_file_path': './log', 'start_position': 4, 'skip_update': True,
 'dump_event': False, 'end_to_timestamp': 1488434940, 'skip_insert': True, 'schema_array': ['dbname']
}
scan 10000 events ....from binlogfile=mysql-bin.000019,timestamp=2017-03-02T11:42:14
scan 20000 events ....from binlogfile=mysql-bin.000019,timestamp=2017-03-02T11:42:29
...

提示:

binlog為ROW格式,dml影響的每一行都會記錄兩個event:Table_map和Row_log。而table_map裡面的table_id並不會影響它在哪個實例上應用,這個id可以認為是邏輯上,記錄表結構版本的機制- 當它在table_definition_cache 沒有找到表定義時,id自增1,分配給要記錄到binlog的表。

mysqlbinlog_back.py 使用經驗

  • #務必指定庫名、表明,開始的binlog檔名,起始時間,結束時間。可以加快scan的速度。

  • 根據恢復的需要,選擇 -I, -U, -D,指定回滾哪些類型的操作。

  • 如果只是恢復部分錶資料(非完全閃回),做不到關聯表的正確恢復。例如需要恢復delete數據,但無法恢復業務裡因為delete引起其它表

    更新的數據,除非完全閃回。

  • 不支援表格欄位是 enum 類型的,例如 t_xx3 的f_do_type欄位。可以把自建實例上的enum定義改成int。

  • #

以上是MySQL根據離線binlog快速「閃回」的詳情介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
MySQL的許可與其他數據庫系統相比如何?MySQL的許可與其他數據庫系統相比如何?Apr 25, 2025 am 12:26 AM

MySQL使用的是GPL許可證。 1)GPL許可證允許自由使用、修改和分發MySQL,但修改後的分發需遵循GPL。 2)商業許可證可避免公開修改,適合需要保密的商業應用。

您什麼時候選擇InnoDB而不是Myisam,反之亦然?您什麼時候選擇InnoDB而不是Myisam,反之亦然?Apr 25, 2025 am 12:22 AM

選擇InnoDB而不是MyISAM的情況包括:1)需要事務支持,2)高並發環境,3)需要高數據一致性;反之,選擇MyISAM的情況包括:1)主要是讀操作,2)不需要事務支持。 InnoDB適合需要高數據一致性和事務處理的應用,如電商平台,而MyISAM適合讀密集型且無需事務的應用,如博客系統。

在MySQL中解釋外鍵的目的。在MySQL中解釋外鍵的目的。Apr 25, 2025 am 12:17 AM

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

MySQL中有哪些不同類型的索引?MySQL中有哪些不同類型的索引?Apr 25, 2025 am 12:12 AM

MySQL中有四種主要的索引類型:B-Tree索引、哈希索引、全文索引和空間索引。 1.B-Tree索引適用於範圍查詢、排序和分組,適合在employees表的name列上創建。 2.哈希索引適用於等值查詢,適合在MEMORY存儲引擎的hash_table表的id列上創建。 3.全文索引用於文本搜索,適合在articles表的content列上創建。 4.空間索引用於地理空間查詢,適合在locations表的geom列上創建。

您如何在MySQL中創建索引?您如何在MySQL中創建索引?Apr 25, 2025 am 12:06 AM

toCreateAnIndexinMysql,usethecReateIndexStatement.1)forasingLecolumn,使用“ createIndexIdx_lastNameEnemployees(lastName); 2)foracompositeIndex,使用“ createIndexIndexIndexIndexIndexDx_nameOmplayees(lastName,firstName,firstName);” 3)forauniqe instex,creationexexexexex,

MySQL與Sqlite有何不同?MySQL與Sqlite有何不同?Apr 24, 2025 am 12:12 AM

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是什麼?它們如何提高性能?MySQL中的索引是什麼?它們如何提高性能?Apr 24, 2025 am 12:09 AM

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

說明如何使用MySQL中的交易來確保數據一致性。說明如何使用MySQL中的交易來確保數據一致性。Apr 24, 2025 am 12:09 AM

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具