昨天突然有個客戶說誤操作,自己刪除了大量數據,CTO直接將我拉到一個討論組裡,說要幫他們恢復數據。他們自己挖的坑,打算讓開發那邊根據業務日誌去恢復,被告知只記錄的刪除主鍵這樣的信息,物理刪除,無能為力。
上伺服器看了下記錄的日誌,發現好幾台上面都有被誤刪的記錄輸出。阿里RDS雖然可以複製一個恢復到刪除時間點前的實例,但這散落的幾萬個id找起來費力,還有就是幾個表之間關聯的資料也要恢復,覺得麻煩。
想到 MySQL 的閃回方案。以前看過好幾篇相關文章,甚至差點自己用python擼一個來解析binlog,反轉得到回滾sql,實在沒空,這下要急用了。趕緊找了下網路「現成的方案」。
正文開始
MySQL(含阿里RDS)快速閃回可以說是對資料庫誤操作的後悔藥,flashback功能可以將資料庫回到誤操作之前。但是即使oracle資料庫也只支援短時間內的閃回。
網路上現有開源的MySQL閃回實現,原理都是解析binlog,生成反向sql: (必須為row模式)
對於delete 操作,生成insert (DELETE_ROWS_EVENT)
對於update 操作,交換binlog裡面值的順序(UPDATE_ROWS_EVENT)
#對於insert 操作,反向產生delete ( WRITE_ROWS_EVENT)
對於多個event,要逆向產生sql
上面兩種實作方式,都是透過python-mysql-replication 套件,模擬出原庫的一個從庫,然後show binary logs
來取得binlog,發起同步binlog的請求,再解析EVENT。但阿里雲 RDS 的binlog在同步給從函式庫之後, 很快就被 purge 掉了 。如果要恢復 昨天 的 部分資料 ,兩個方案都是拿不到binlog的。也就是閃回的時間有限。
還有一些比較簡單的實現,就是解析 binlog 物理文件,實現回滾,如 binlog-rollback.pl
,試過,但是速度太慢。
為了不影響速度,又想使用比較成熟的閃回方案,我們可以這樣做:
借助一個自建的mysqld 實例,將已purge掉的binlog拷貝到該實例的目錄下
在自建實例裡,提前創建好需要恢復的表(結構),因為工具需要連接上來從
information_schema.columns
取得元資料資訊拷貝的時候,可以替換掉mysql實例自己的binlog檔名,保持連續
- ##可能要修改
mysql-bin.index
,確保檔名還能被mysqld辨識到
- 重啟mysql實例,
show binary logs
看一下是否在清單裡面
- 接下來就可以使用上面任何一種工具,模擬從庫,指定一個binlog文件,開始時間,結束時間,得到回滾SQL
- #再根據業務邏輯,篩選出需要的sql
總之就是藉助另外一個mysql,把binlog event傳輸過來。溫馨提示:
- 兩個實例間版本不要跨度太大
- #注意檔案權限
- 如果原庫開啟了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中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

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

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具