【MySQL】通過Binary Log簡單實現數據回滾(一)
一、前言
對,沒錯,我又水了好一陣子,深刻反思寄幾。前段時間,工作項目上出於對excel等批量操作可能出現誤操作的問題,要求提供一個能夠根據操作批次進行數據回滾的能力。在開發的過程中接觸到了MySQL的Binary Log,感覺有些收獲,記錄一下。
二、Binary Log的概念
首先我們要了解一下什麽是Binary Log(詳情點進去看):
Binary Log(二進制文件),包含了描述數據庫更改的“事件”,例如創建表的操作或者改變表的數據。如果采用基於行的日誌,它還能包含已經發生更改的語句事件(比如,沒有對應行的DELETE事件)。
也就是說你對數據庫的操作,包括INSERT、DELETE在內的CRUD,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簡單實現數據回滾(一)