MySQL通過binlog實(shí)現(xiàn)恢復(fù)數(shù)據(jù)
一、背景
在MySQL中,如果不小心刪除了數(shù)據(jù),可以利用二進(jìn)制日志(binlog)來恢復(fù)數(shù)據(jù)。
實(shí)質(zhì)就是將binlog記錄中的事件再次執(zhí)行一遍。
二、前提條件
啟用二進(jìn)制日志:確保 MySQL 啟用了二進(jìn)制日志功能。
有足夠的權(quán)限:確保有權(quán)限訪問和讀取二進(jìn)制日志文件。
三、恢復(fù)步驟
1.找到相關(guān)的二進(jìn)制日志文件:
查看是否開啟二進(jìn)制日志文件
SHOW VARIABLES LIKE 'log_bin%';
查看二進(jìn)制日志文件位置
SHOW VARIABLES LIKE 'log_bin_basename';
查看二進(jìn)制日志文件列表
SHOW BINARY LOGS;
2.使用 mysqlbinlog 工具提取日志:事件位置
先使用show binlog events命令查看binlog記錄,確定事件開始位置和結(jié)束位置。
查看二進(jìn)制日志記錄
show binlog events in 'binlog.00001';
再使用 mysqlbinlog 提取開始位置和結(jié)束位置的日志:
mysqlbinlog /path/to/binlog.000001 --start-position=13508 --stop-position=14142 | mysql -u username -p database_name
替換 /path/to/binlog.000001 為二進(jìn)制日志文件路徑
修改stop-position和stop-position
替換 username 為MySQL 用戶名,database_name 為數(shù)據(jù)庫(kù)名稱。
3.使用 mysqlbinlog 工具提取日志:時(shí)間段
使用 mysqlbinlog 提取特定時(shí)間段的日志:
mysqlbinlog /path/to/binlog.000001 --start-datetime="YYYY-MM-DD HH:MM:SS" --stop-datetime="YYYY-MM-DD HH:MM:SS" | mysql -u username -p database_name
替換 /path/to/binlog.000001 為二進(jìn)制日志文件路徑
修改 start-datetime 和 stop-datetime
替換 username 為MySQL 用戶名,database_name 為數(shù)據(jù)庫(kù)名稱。
注意事項(xiàng)
備份當(dāng)前數(shù)據(jù):在進(jìn)行數(shù)據(jù)恢復(fù)操作之前,最好先備份當(dāng)前數(shù)據(jù)庫(kù),以防止進(jìn)一步的數(shù)據(jù)丟失。
測(cè)試恢復(fù)腳本:在生產(chǎn)環(huán)境中執(zhí)行恢復(fù)腳本之前,可以先在測(cè)試環(huán)境中進(jìn)行測(cè)試,確?;謴?fù)操作的正確性。
mysqlbinlog命令只用于恢復(fù),不能用于回滾。適用數(shù)據(jù)遷移,數(shù)據(jù)同步的場(chǎng)景。
四、實(shí)操
1.插入數(shù)據(jù)
mysql -u root -p 登陸
? ~ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \\g. Your MySQL connection id is 40 Server version: 8.4.3 MySQL Community Server - GPL
插入兩條數(shù)據(jù)
mysql> use ban; mysql> INSERT INTO t_user (id, name, phone) VALUES ('1', '小明', '110'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t_user (id, name, phone) VALUES ('2', '小紅', '120'); Query OK, 1 row affected (0.00 sec) mysql> select * from t_user; +----+--------+-------+---------------------+---------------------+ | id | name | phone | create_dt | update_dt | +----+--------+-------+---------------------+---------------------+ | 1 | 小明 | 110 | 2025-01-24 15:19:39 | 2025-01-24 15:19:39 | | 2 | 小紅 | 120 | 2025-01-24 15:19:46 | 2025-01-24 15:19:46 | +----+--------+-------+---------------------+---------------------+ 2 rows in set (0.00 sec)
2.刪除數(shù)據(jù)
mysql> delete from t_user where id in(1,2); Query OK, 2 rows affected (0.00 sec) mysql> select * from t_user; Empty set (0.00 sec)
3.通過binlog恢復(fù)刪除的數(shù)據(jù)
找到二進(jìn)制日志文件:/usr/local/mysql/data/binlog.000002
mysql> SHOW VARIABLES LIKE 'log_bin_basename'; +------------------+------------------------------+ | Variable_name | Value | +------------------+------------------------------+ | log_bin_basename | /usr/local/mysql/data/binlog | +------------------+------------------------------+ 1 row in set (0.01 sec) ???????mysql> SHOW BINARY LOGS; +---------------+-----------+-----------+ | Log_name | File_size | Encrypted | +---------------+-----------+-----------+ | binlog.000001 | 668 | No | | binlog.000002 | 14142 | No | | binlog.000003 | 181 | No | | binlog.000004 | 181 | No | | binlog.000005 | 181 | No | +---------------+-----------+-----------+ 5 rows in set (0.01 sec)
查看二進(jìn)制日志記錄,確認(rèn)事件開始位置(13508)和結(jié)束位置(14142)
mysql> show binlog events in 'binlog.00002'; | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | binlog.00002 | 13508 | Anonymous_Gtid | 1 | 13587 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | binlog.00002 | 13587 | Query | 1 | 13669 | BEGIN | binlog.00002 | 13669 | Table_map | 1 | 13734 | table_id: 109 (ban.t_user) | binlog.00002 | 13734 | Write_rows | 1 | 13794 | table_id: 109 flags: STMT_END_F | binlog.00002 | 13794 | Xid | 1 | 13825 | COMMIT /* xid=1058 */ | binlog.00002 | 13825 | Anonymous_Gtid | 1 | 13904 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | binlog.00002 | 13904 | Query | 1 | 13986 | BEGIN | binlog.00002 | 13986 | Table_map | 1 | 14051 | table_id: 109 (ban.t_user) | binlog.00002 | 14051 | Write_rows | 1 | 14111 | table_id: 109 flags: STMT_END_F | binlog.00002 | 14111 | Xid | 1 | 14142 | COMMIT /* xid=1059 */
使用 mysqlbinlog 恢復(fù)數(shù)據(jù)
? ~ mysqlbinlog /usr/local/mysql/data/binlog.00002 --start-position=13508 --stop-position=14142 | mysql -u root -p ban
4.完整示例
--登陸-- ? ~ mysql -u root -p Enter password: --插入數(shù)據(jù)---- mysql> use ban; mysql> INSERT INTO t_user (id, name, phone) VALUES ('1', '小明', '110'); mysql> INSERT INTO t_user (id, name, phone) VALUES ('2', '小紅', '120'); mysql> select * from t_user; +----+--------+-------+---------------------+---------------------+ | id | name | phone | create_dt | update_dt | +----+--------+-------+---------------------+---------------------+ | 1 | 小明 | 110 | 2025-01-24 15:19:39 | 2025-01-24 15:19:39 | | 2 | 小紅 | 120 | 2025-01-24 15:19:46 | 2025-01-24 15:19:46 | +----+--------+-------+---------------------+---------------------+ 2 rows in set (0.00 sec) --刪除數(shù)據(jù)-- mysql> delete from t_user where id in(1,2); mysql> select * from t_user; Empty set (0.00 sec) --通過binlog恢復(fù)刪除的數(shù)據(jù)-- --找到二進(jìn)制日志文件:/usr/local/mysql/data/binlog.000002 mysql> SHOW VARIABLES LIKE 'log_bin_basename'; +------------------+------------------------------+ | Variable_name | Value | +------------------+------------------------------+ | log_bin_basename | /usr/local/mysql/data/binlog | +------------------+------------------------------+ 1 row in set (0.01 sec) mysql> SHOW BINARY LOGS; +---------------+-----------+-----------+ | Log_name | File_size | Encrypted | +---------------+-----------+-----------+ | binlog.000001 | 668 | No | | binlog.000002 | 14142 | No | | binlog.000003 | 181 | No | | binlog.000004 | 181 | No | | binlog.000005 | 181 | No | +---------------+-----------+-----------+ 5 rows in set (0.01 sec) --查看二進(jìn)制日志記錄,確認(rèn)事件開始位置(13508)和結(jié)束位置(14142)-- mysql> show binlog events in 'binlog.00002'; | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | binlog.00002 | 13508 | Anonymous_Gtid | 1 | 13587 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | binlog.00002 | 13587 | Query | 1 | 13669 | BEGIN | binlog.00002 | 13669 | Table_map | 1 | 13734 | table_id: 109 (ban.t_user) | binlog.00002 | 13734 | Write_rows | 1 | 13794 | table_id: 109 flags: STMT_END_F | binlog.00002 | 13794 | Xid | 1 | 13825 | COMMIT /* xid=1058 */ | binlog.00002 | 13825 | Anonymous_Gtid | 1 | 13904 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | binlog.00002 | 13904 | Query | 1 | 13986 | BEGIN | binlog.00002 | 13986 | Table_map | 1 | 14051 | table_id: 109 (ban.t_user) | binlog.00002 | 14051 | Write_rows | 1 | 14111 | table_id: 109 flags: STMT_END_F | binlog.00002 | 14111 | Xid | 1 | 14142 | COMMIT /* xid=1059 */ --使用 mysqlbinlog 恢復(fù)數(shù)據(jù)-- ? ~ mysqlbinlog /usr/local/mysql/data/binlog.00002 --start-position=13508 --stop-position=14142 | mysql -u root -p ban
到此這篇關(guān)于MySQL通過binlog實(shí)現(xiàn)恢復(fù)數(shù)據(jù)的文章就介紹到這了,更多相關(guān)MySQL binlog恢復(fù)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python MySQL如何通過Binlog獲取變更記錄恢復(fù)數(shù)據(jù)
- MySQL通過日志恢復(fù)數(shù)據(jù)的操作步驟
- MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程
- MySQL開啟配置binlog及通過binlog恢復(fù)數(shù)據(jù)步驟詳析
- mysql binlog如何恢復(fù)數(shù)據(jù)到某一時(shí)刻
- MySQL誤刪后使用binlog恢復(fù)數(shù)據(jù)的實(shí)現(xiàn)方法
- mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)
- Mysql如何通過ibd文件恢復(fù)數(shù)據(jù)
- mysql如何根據(jù).frm和.ibd文件恢復(fù)數(shù)據(jù)表
- 一步步教你如何使用mysql?binlog恢復(fù)數(shù)據(jù)
- MySql恢復(fù)數(shù)據(jù)方法梳理講解
- Mysql通過ibd文件恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- MySQL數(shù)據(jù)庫(kù)通過Binlog恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- Mysql如何通過binlog日志恢復(fù)數(shù)據(jù)詳解
- mysql5.7使用binlog 恢復(fù)數(shù)據(jù)的方法
- MySQL通過binlog恢復(fù)數(shù)據(jù)
- mysql8.0無(wú)備份通過idb文件恢復(fù)數(shù)據(jù)的方法、idb文件修復(fù)和tablespace?id不一致處理
相關(guān)文章
MySQL數(shù)據(jù)表使用的SQL語(yǔ)句整理
這篇文章主要介紹了MySQL數(shù)據(jù)表使用的SQL語(yǔ)句整理,文章基于MySQL的相關(guān)資料展開舉例說明,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05MySQL事務(wù)與隔離級(jí)別的使用基礎(chǔ)理論
這篇文章主要介紹了MySQL事務(wù)的隔離級(jí)別詳情,事務(wù)隔離級(jí)別越高,為避免沖突所花費(fèi)的性能也就越多,即效率低。在“可重復(fù)讀”級(jí)別,實(shí)際上可以解決部分的虛讀問題,但是不能防止update更新產(chǎn)生的虛讀問題,要禁止虛讀產(chǎn)生,還是需要設(shè)置串行化隔離級(jí)別2023-02-02關(guān)于MySQL 優(yōu)化的100個(gè)的建議
MYSQL 如此方便和穩(wěn)定,以至于我們?cè)陂_發(fā) WEB 程序的時(shí)候很少想到它。即使想到優(yōu)化也是程序級(jí)別的,比如,不要寫過于消耗資源的 SQL 語(yǔ)句。但是除此之外,在整個(gè)系統(tǒng)上仍然有很多可以優(yōu)化的地方。2016-01-01詳談mysqldump數(shù)據(jù)導(dǎo)出的問題
下面小編就為大家?guī)硪黄斦刴ysqldump數(shù)據(jù)導(dǎo)出的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03原來MySQL?數(shù)據(jù)類型也可以優(yōu)化
這篇文章主要介紹了原來MySQL?數(shù)據(jù)類型也可以優(yōu)化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-08-08mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語(yǔ)句
這篇文章主要介紹了mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語(yǔ)句,一般在一些統(tǒng)計(jì)報(bào)表中比較常用這個(gè)時(shí)間段,需要的朋友可以參考下2014-06-06MySQL按時(shí)間拆分千萬(wàn)級(jí)大表的實(shí)現(xiàn)代碼
這篇文章主要介紹了MySQL按時(shí)間拆分千萬(wàn)級(jí)大表,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09MySQL數(shù)據(jù)庫(kù)本地事務(wù)原理解析
事務(wù)是數(shù)據(jù)庫(kù)系統(tǒng)中的重要概念,了解這一律念是以正確的方式開發(fā)和數(shù)據(jù)庫(kù)交互的應(yīng)用程序的前提,今天通過本文給大家介紹MySQL數(shù)據(jù)庫(kù)本地事務(wù)原理解析,感興趣的朋友一起看看吧2022-01-01mysql使用自定義序列實(shí)現(xiàn)row_number功能(步驟詳解)
這篇文章主要介紹了mysql使用自定義序列實(shí)現(xiàn)row_number功能,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12