MySQL通過binlog實現(xiàn)恢復數(shù)據(jù)
一、背景
在MySQL中,如果不小心刪除了數(shù)據(jù),可以利用二進制日志(binlog)來恢復數(shù)據(jù)。
實質(zhì)就是將binlog記錄中的事件再次執(zhí)行一遍。
二、前提條件
啟用二進制日志:確保 MySQL 啟用了二進制日志功能。
有足夠的權(quán)限:確保有權(quán)限訪問和讀取二進制日志文件。
三、恢復步驟
1.找到相關的二進制日志文件:
查看是否開啟二進制日志文件
SHOW VARIABLES LIKE 'log_bin%';
查看二進制日志文件位置
SHOW VARIABLES LIKE 'log_bin_basename';
查看二進制日志文件列表
SHOW BINARY LOGS;
2.使用 mysqlbinlog 工具提取日志:事件位置
先使用show binlog events命令查看binlog記錄,確定事件開始位置和結(jié)束位置。
查看二進制日志記錄
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 為二進制日志文件路徑
修改stop-position和stop-position
替換 username 為MySQL 用戶名,database_name 為數(shù)據(jù)庫名稱。
3.使用 mysqlbinlog 工具提取日志:時間段
使用 mysqlbinlog 提取特定時間段的日志:
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 為二進制日志文件路徑
修改 start-datetime 和 stop-datetime
替換 username 為MySQL 用戶名,database_name 為數(shù)據(jù)庫名稱。
注意事項
備份當前數(shù)據(jù):在進行數(shù)據(jù)恢復操作之前,最好先備份當前數(shù)據(jù)庫,以防止進一步的數(shù)據(jù)丟失。
測試恢復腳本:在生產(chǎn)環(huán)境中執(zhí)行恢復腳本之前,可以先在測試環(huán)境中進行測試,確保恢復操作的正確性。
mysqlbinlog命令只用于恢復,不能用于回滾。適用數(shù)據(jù)遷移,數(shù)據(jù)同步的場景。
四、實操
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恢復刪除的數(shù)據(jù)
找到二進制日志文件:/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)
查看二進制日志記錄,確認事件開始位置(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 恢復數(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恢復刪除的數(shù)據(jù)-- --找到二進制日志文件:/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) --查看二進制日志記錄,確認事件開始位置(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 恢復數(shù)據(jù)-- ? ~ mysqlbinlog /usr/local/mysql/data/binlog.00002 --start-position=13508 --stop-position=14142 | mysql -u root -p ban
到此這篇關于MySQL通過binlog實現(xiàn)恢復數(shù)據(jù)的文章就介紹到這了,更多相關MySQL binlog恢復數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Python MySQL如何通過Binlog獲取變更記錄恢復數(shù)據(jù)
- MySQL通過日志恢復數(shù)據(jù)的操作步驟
- MySQL通過ibd文件恢復數(shù)據(jù)的操作過程
- MySQL開啟配置binlog及通過binlog恢復數(shù)據(jù)步驟詳析
- mysql binlog如何恢復數(shù)據(jù)到某一時刻
- MySQL誤刪后使用binlog恢復數(shù)據(jù)的實現(xiàn)方法
- mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復數(shù)據(jù)庫數(shù)據(jù)
- Mysql如何通過ibd文件恢復數(shù)據(jù)
- mysql如何根據(jù).frm和.ibd文件恢復數(shù)據(jù)表
- 一步步教你如何使用mysql?binlog恢復數(shù)據(jù)
- MySql恢復數(shù)據(jù)方法梳理講解
- Mysql通過ibd文件恢復數(shù)據(jù)的詳細步驟
- MySQL數(shù)據(jù)庫通過Binlog恢復數(shù)據(jù)的詳細步驟
- Mysql如何通過binlog日志恢復數(shù)據(jù)詳解
- mysql5.7使用binlog 恢復數(shù)據(jù)的方法
- MySQL通過binlog恢復數(shù)據(jù)
- mysql8.0無備份通過idb文件恢復數(shù)據(jù)的方法、idb文件修復和tablespace?id不一致處理
相關文章
原來MySQL?數(shù)據(jù)類型也可以優(yōu)化
這篇文章主要介紹了原來MySQL?數(shù)據(jù)類型也可以優(yōu)化,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助2022-08-08mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句
這篇文章主要介紹了mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句,一般在一些統(tǒng)計報表中比較常用這個時間段,需要的朋友可以參考下2014-06-06mysql使用自定義序列實現(xiàn)row_number功能(步驟詳解)
這篇文章主要介紹了mysql使用自定義序列實現(xiàn)row_number功能,本文分步驟通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-12-12