Mysql使用mysqlbinlog恢復數據

一、關於mysqlbinlog

mysqlbinlog是數據庫的二進制文件,開啓mysqlbinlog日誌後,平時我們操作的sql語句例如增刪改查,都會被記錄到日誌文件中,如果我們誤刪某條記錄數據表數據庫,只要我們合理的使用mysqlbinlog,都能對其進行恢復。

二、開啓mysqlbinlog

2.1 查看是否開始mysqlbinlog
mysql> show variables like 'log_%';
+----------------------------------------+----------------------------------+
| Variable_name                          | Value                            |
+----------------------------------------+----------------------------------+
| log_bin                                | ON                               |
| log_bin_basename                       | /www/server/data/mysql-bin       |
| log_bin_index                          | /www/server/data/mysql-bin.index |
| log_bin_trust_function_creators        | OFF                              |
| log_bin_use_v1_row_events              | OFF                              |
| log_error                              | ./VM_0_10_centos.err             |
| log_output                             | FILE                             |
| log_queries_not_using_indexes          | OFF                              |
| log_slave_updates                      | OFF                              |
| log_slow_admin_statements              | OFF                              |
| log_slow_slave_statements              | OFF                              |
| log_throttle_queries_not_using_indexes | 0                                |
| log_warnings                           | 1                                |
+----------------------------------------+----------------------------------+
13 rows in set (0.00 sec)

2.2 開啓mysqlbinlog

windows開啓方式:

mysql配置文件中新增

log-bin=D:\phpStudy\PHPTutorial\MySQL\data    //這是保存mysqlbinlog日誌的路徑
binlog-format=mixed  

linux開啓方式:

mysql配置文件中新增

log-bin=mysql-bin
binlog_format=mixed

其中,mysqlbinlog的三個參數及含義:

參數名 含義
Row 日誌中會記錄成每一行數據被修改的形式,會產生大量的日誌數據
Statement 日誌中每條數據被修改後就纔會被記錄到日誌裏 ,彌補了Row的不足
mixed 兩者相結合的形式,根據實際場景來進行相應的記錄,減少I/O消耗,增加性能

mysqlbinlog三個參數更詳細的介紹

2.3 重啓mysql服務

三、恢復數據前的數據準備

3.1 選擇一個數據庫
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| RedLetter          |
| RedPacket          |
| bishe              |
| brushorder         |
| caipiao            |
| daijia             |
| dht                |
| linmaocheng        |
| ljk                |
| mysql              |
| mytool             |
| performance_schema |
| smallfox           |
| studyfast          |
| yuerjia            |
+--------------------+
16 rows in set (0.00 sec)

使用dht這個數據庫:

mysql> use dht
Database changed
3.2 選擇一個數據表
mysql> show tables;
+---------------+
| Tables_in_dht |
+---------------+
| content       |
| user          |
+---------------+
2 rows in set (0.00 sec)

使用user表進行測試:

mysql> select * from user;
+----+-----------+--------+
| id | name      | pwd    |
+----+-----------+--------+
|  1 | 小王      | 123    |
|  2 | username  | 123456 |
|  3 | root      | 123456 |
|  4 | 侯亮平    | 123456 |
+----+-----------+--------+
4 rows in set (0.00 sec)
3.3 添加一條測試數據
mysql> insert into user(name,pwd) values('光頭強',123321);
Query OK, 1 row affected (0.00 sec)

查看是否添加上:

mysql> select * from user;
+----+-----------+--------+
| id | name      | pwd    |
+----+-----------+--------+
|  1 | 小王      | 123    |
|  2 | username  | 123456 |
|  3 | root      | 123456 |
|  4 | 侯亮平    | 123456 |
|  5 | 光頭強    | 123321 |
+----+-----------+--------+
5 rows in set (0.00 sec)
3.4 刪除剛剛添加的測試數據
mysql> delete from user where id = 5;
Query OK, 1 row affected (0.00 sec)

查看是否刪除成功:

mysql> select * from user;
+----+-----------+--------+
| id | name      | pwd    |
+----+-----------+--------+
|  1 | 小王      | 123    |
|  2 | username  | 123456 |
|  3 | root      | 123456 |
|  4 | 侯亮平    | 123456 |
+----+-----------+--------+
4 rows in set (0.00 sec)

發現光頭強這條數據已經沒有了,下面就進行數據恢復。

四、進行數據恢復

查看最近的操作被保存到哪個日誌裏面去了:show master status;

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000038 |      688 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

查看日誌偏移信息:show binlog events in 'mysql-bin.000038';

mysql> show binlog events in 'mysql-bin.000038';
+------------------+-----+-------------+-----------+-------------+------------------------------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                             |
+------------------+-----+-------------+-----------+-------------+------------------------------------------------------------------+
| mysql-bin.000038 |   4 | Format_desc |         1 |         120 | Server ver: 5.6.44-log, Binlog ver: 4                            |
| mysql-bin.000038 | 120 | Query       |         1 |         197 | BEGIN                                                            |
| mysql-bin.000038 | 197 | Intvar      |         1 |         229 | INSERT_ID=5                                                      |
| mysql-bin.000038 | 229 | Query       |         1 |         354 | use `dht`; insert into user(name,pwd) values('光頭強',123321)    |
| mysql-bin.000038 | 354 | Query       |         1 |         432 | COMMIT                                                           |
| mysql-bin.000038 | 432 | Query       |         1 |         509 | BEGIN                                                            |
| mysql-bin.000038 | 509 | Query       |         1 |         610 | use `dht`; delete from user where id = 5                         |
| mysql-bin.000038 | 610 | Query       |         1 |         688 | COMMIT                                                           |
+------------------+-----+-------------+-----------+-------------+------------------------------------------------------------------+
8 rows in set (0.00 sec)

在這裏插入圖片描述
可以看到Pos爲120,End_log_pos爲432的偏移量正是插入這條數據的BEGINCOMMIT

[root@VM_0_10_centos /]# /www/server/mysql/bin/mysqlbinlog  /www/server/data/mysql-bin.000038 --start-position 120 --stop-position 432 | mysql -u root -p dht;
Enter password: 
[root@VM_0_10_centos /]#

執行完成後,查看是否已經恢復:

mysql> select  * from user;
+----+-----------+--------+
| id | name      | pwd    |
+----+-----------+--------+
|  1 | 小王      | 123    |
|  2 | username  | 123456 |
|  3 | root      | 123456 |
|  4 | 侯亮平    | 123456 |
|  5 | 光頭強    | 123321 |
+----+-----------+--------+
5 rows in set (0.00 sec)

我們看到光頭強這個測試數據已經恢復了,這個只是恢復數據實戰,如果你誤刪數據表或者數據庫,同樣可以用此方法進行恢復,找到對應的偏移量即可。

五、總結

  • 如果偏移量過大的話,可以把日誌文件下載下來進行搜索建表建庫時候的sql語句,方便查詢對應的偏移量進行恢復。
  • 如果,你刪了一個庫,那這個偏移量是很大的,你只需要找到對應的偏移量,不需要擔心恢復之前刪掉別的表的數據,畢竟負負得正嘛。
  • 找到相應的偏移量非常重要,只有精準的找到需要恢復的數據偏移量,我們能夠很大程度的減少數據丟失的損失。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章