MySQL通過binlog實現(xiàn)恢復數(shù)據(jù)
一、背景
在MySQL中,如果不小心刪除了數(shù)據(jù),可以利用二進制日志(binlog)來恢復數(shù)據(jù)。
實質就是將binlog記錄中的事件再次執(zhí)行一遍。
二、前提條件
啟用二進制日志:確保 MySQL 啟用了二進制日志功能。
有足夠的權限:確保有權限訪問和讀取二進制日志文件。
三、恢復步驟
1.找到相關的二進制日志文件:
查看是否開啟二進制日志文件
SHOW VARIABLES LIKE 'log_bin%';
查看二進制日志文件位置
SHOW VARIABLES LIKE 'log_bin_basename';
查看二進制日志文件列表
SHOW BINARY LOGS;
2.使用 mysqlbinlog 工具提取日志:事件位置
先使用show binlog events命令查看binlog記錄,確定事件開始位置和結束位置。
查看二進制日志記錄
show binlog events in 'binlog.00001';
再使用 mysqlbinlog 提取開始位置和結束位置的日志:
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ù)丟失。
測試恢復腳本:在生產環(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)和結束位置(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)和結束位置(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ù)內容請搜索腳本之家以前的文章或繼續(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 8.0.18 安裝配置方法圖文教程(linux)
這篇文章主要介紹了linux下mysql 8.0.18 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11

