1. 程式人生 > >【MySQL】通過Binary Log簡單實現數據回滾(一)

【MySQL】通過Binary Log簡單實現數據回滾(一)

pre mage 用途 top IT cal 時間 excel var

一、前言

對,沒錯,我又水了好一陣子,深刻反思寄幾。前段時間,工作項目上出於對excel等批量操作可能出現誤操作的問題,要求提供一個能夠根據操作批次進行數據回滾的能力。在開發的過程中接觸到了MySQL的Binary Log,感覺有些收獲,記錄一下。

二、Binary Log的概念

首先我們要了解一下什麽是Binary Log(詳情點進去看):

Binary Log(二進制文件),包含了描述數據庫更改的“事件”,例如創建表的操作或者改變表的數據。如果采用基於行的日誌,它還能包含已經發生更改的語句事件(比如,沒有對應行的DELETE事件)。

也就是說你對數據庫的操作,包括INSERT、DELETE在內的CRUD,binlog(命令裏簡稱)都會包含進去,那麽,如果我們能夠解析

(因為從binlog的名字可以知道,這是一個二進制文件,不是人類能夠閱讀的)出它的內容,就可以對執行的語句進行反向操作,對誤操作的數據進行恢復。

這也是binlog的目的之一:數據恢復

而binlog的另一個用途就是用於主從復制。我們都知道在現在的大數據背景下,常規的單數據庫已經無法滿足訪問量的需求,於是出現了數據庫集群:主數據庫進行寫操作,從數據庫進行讀操作,從而降低數據庫的訪問壓力,而為了保證數據庫的內容一致,就要用到binlog來保證了,如下圖:這裏不具體展開。

技術分享圖片

三、通過shell查看Binary Log

了解了binlog的概念之後,我們來通過shell查看一下binlog。

首先要在my.cnf中添加如下配置:

[mysqld]
log-bin=mysql-bin
server_id=1 #避免和slave機器重復
log_bin_basename=xxx 可選
log_bin_index=xxx 可選

保存後重啟MySQL。

進入MySQL Command:

mysql> show variables like '%log_bin%'; 查看binglog路徑
+---------------------------------+---------------------------------------+
| Variable_name                   | Value                                 |
+---------------------------------+---------------------------------------+
| log_bin                         | ON                                    |
| log_bin_basename                | /usr/local/mysql/data/mysql-bin       |
| log_bin_index                   | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                   |
| log_bin_use_v1_row_events       | OFF                                   |
| sql_log_bin                     | ON                                    |
+---------------------------------+---------------------------------------+
  • log_bin:on 表示開啟了Binary Log
  • log_bin_basename:binary log的基本文件名,可以在my.cnf指定
  • log_bin_index:binlog文件的索引文件,可以在my.cnf指定

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |   9309624 |
| mysql-bin.000002 |   9008629 |
| mysql-bin.000003 |    229080 |
| mysql-bin.000004 |  15410010 |
| mysql-bin.000005 |       177 |
| mysql-bin.000006 |   5798399 |
| mysql-bin.000007 |       177 |
+------------------+-----------+

顯示當前數據庫所有的binary log文件和文件大小

知道這些之後,退出MySQL Command,在shell中進行查看:

> sudo -u mysql mysqlbinlog /usr/local/mysql/data/mysql-bin.000030

由於我的/usr/local/mysql/data的在安裝MySQL的時候默認只給了mysql用戶,所以要加-u切換成mysql。

至此便可以查看到二進制文件中的內容(截取了部分):

# at 1341475
#180416 15:58:45 server id 1  end_log_pos 1341582 CRC32 0x0ca6c030  Table_map: `user-center`.`t_management_entity_role` mapped to number 127
# at 1341582
#180416 15:58:45 server id 1  end_log_pos 1341686 CRC32 0x33552cef  Write_rows: table id 127 flags: STMT_END_F

BINLOG '
tVfUWhMBAAAAawAAAI54FAAAAH8AAAAAAAEADnNoLXVzZXItY2VudGVyABh0X21hbmFnZW1lbnRf
ZW50aXR5X3JvbGUADAMPDw8PDwEPDxIPEhJgADYAYAC0AAMAAwDAAADAAAASADDApgw=
tVfUWh4BAAAAaAAAAPZ4FAAAAH8AAAAAAAEAAgAM//8Q8IkAAAARc3ViX2VtcGxveWVlX2RlcHQG
5qCh5belDXNjaG9vbF93b3JrZXIBMQIBMAN6a2qZn6D7wAN6a2qZn6D7wO8sVTM=
'/*!*/;
# at 1341686
#180416 15:58:45 server id 1  end_log_pos 1341717 CRC32 0x1fdc2123  Xid = 22495
COMMIT/*!*/;
# at 1341717
#180416 16:41:12 server id 1  end_log_pos 1341740 CRC32 0xca0bf05c  Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

看到這裏,覺得BINLOG具體裏面的還是非人類能夠閱讀的。想要知道其中的秘密,看來還是要閱讀MySQL的開發手冊才行。

四、總結

第一部分先記錄一下整個操作的過程,第二部分寫具體的實現過程。謝謝各位園友觀看,如果有描述不對的地方歡迎指正,與大家共同進步!



【MySQL】通過Binary Log簡單實現數據回滾(一)