一、關於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消耗,增加性能 |
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的偏移量正是插入這條數據的BEGIN
和COMMIT
:
[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語句,方便查詢對應的偏移量進行恢復。 - 如果,你刪了一個庫,那這個偏移量是很大的,你只需要找到對應的偏移量,不需要擔心恢復之前刪掉別的表的數據,畢竟
負負得正
嘛。 - 找到相應的偏移量非常重要,只有精準的找到需要恢復的數據偏移量,我們能夠很大程度的減少數據丟失的損失。