1 概述: MYSQL數據庫的二進制日志————bin log
什么是二進制日志(binlog)?
MySQL的二進制日志binlog,可以說是MySQL最重要的日志,它記錄了所有的DDL和DML語句(除了數據查詢語句select),以事件形式記錄,還包含語句所執行的消耗的時間,MySQL的二進制日志是【事務安全型】的。
binlog是記錄所有數據庫表結構變更(例如CREATE、ALTER TABLE…)以及表數據修改(INSERT、UPDATE、DELETE…)的二進制日志。
binlog不會記錄SELECT和SHOW這類操作,因為這類操作對數據本身並沒有修改,但你可以通過查詢通用日志來查看MySQL執行過的所有語句。
二進制日志包括兩類文件:
二進制日志索引文件(文件名后綴為.index),用於記錄所有的二進制文件
二進制日志文件(文件名后綴為.00000*),用於記錄數據庫所有的DDL和DML(除了數據查詢語句)語句事件。
什么是事務日志?
事務日志的目的:實例或者介質失敗,事務日志文件就能作為備份數據而派上用場。
innodb事務日志包括:
redo log : 指事務開始之前, 在操作任何數據之前,首先將需操作的數據備份到一個地方
undo log : 指事務中操作的任何數據,將最新的數據備份到一個地方
- redo log 事務日志
不是隨着事務的提交才寫入的,而是在事務的執行過程中,便開始寫入redo 中。
具體的落盤策略可以進行配置 。
防止在發生故障的時間點,尚有臟頁未寫入磁盤,在重啟mysql服務的時候,根據redo log進行重做,從而達到事務的未入磁盤數據進行持久化這一特性。
RedoLog是為了實現事務的持久性而出現的產物

- undo log 事務日志
用來回滾行記錄到某個版本。
事務未提交之前,Undo保存了未提交之前的版本數據,Undo中的數據可作為數據舊版本快照供其他並發事務進行快照讀。
undo log是為了實現事務的原子性而出現的產物,在Mysql innodb存儲引擎中用來實現多版本並發控制

寫 Binlog 的時機? sync_binlog
對支持事務的引擎如InnoDB而言,必須要提交了事務才會記錄binlog。binlog 什么時候刷新到磁盤跟參數 sync_binlog
相關。
- 如果設置為0,則表示MySQL不控制binlog的刷新,由文件系統去控制它緩存的刷新;
- 如果設置為不為0的值,則表示每 sync_binlog 次事務,MySQL調用文件系統的刷新操作刷新binlog到磁盤中。
- 設為1是最安全的,在系統故障時最多丟失一個事務的更新,但是會對性能有所影響。
sync_binlog的設置
如果 sync_binlog=0 或 sync_binlog大於1,當發生電源故障或操作系統崩潰時,可能有一部分已提交但其binlog未被同步到磁盤的事務會被丟失,恢復程序將無法恢復這部分事務。
在MySQL 5.7.7之前,默認值 sync_binlog 是0,MySQL 5.7.7和更高版本使用默認值1,這是最安全的選擇。一般情況下會設置為100或者0,犧牲一定的一致性來獲取更好的性能。
【二進制日志處理事務】和【非事務性語句】的區別?
在事務性語句(update)執行過程中,服務器將會進行額外的處理,在服務器執行時多個事務是並行執行的,為了把他們的記錄在一起,需要引入事務日志的概念。在事務完成被提交的時候一同刷新到二進制日志。
對於非事務性語句(insert,delete)的處理。遵循以下3條規則:
1)如果非事務性語句被標記為事務,那么: 將被寫入重做日志(redo log)。
2)如果沒有標記為事務,而且重做日志中沒有,那么: 直接寫入二進制日志(bin log)。
3)如果沒有標記為事務,但是重做日志中有,那么: 寫入重做日志(redo log)。
注意: 如果在一個事務中有非事務性語句,那么: 將會利用規則2,優先將該影響非事務表語句直接寫入二進制日志。
Binlog日志的應用場景
- MySQL主從復制:MySQL Replication在Master端開啟binlog,Master把它的二進制日志傳遞給slaves來達到master-slave數據一致的目的
- 數據恢復:通過使用 mysqlbinlog 工具來使恢復數據
Binlog日志的代價
一般來說,開啟binlog日志大概會有1%的性能損耗
2 操作步驟(Windows系統下: my.ini
)
step1 查看MYSQL是否開啟 bin log
bin-log的默認配置: 關閉(OFF)
mysql> show variables like 'log_bin'
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set, 1 warning (0.10 sec)

step2 若為OFF,則需開啟 bin log
mysql-version: 5.7.19
my.ini
文件默認不允許修改,需要右鍵“管理員取得所有權”之后才能保存修改。
- step2.1 配置
bin log
在打開my.ini文件,在mysqld下面添加
# Binary Logging
log-bin=mysql-bin
# 【binlog 日志存放路徑】若提供的全路徑,則: 生成的日志文件就在指定的路徑下;若僅提供的1個文件名稱(Eg: mysql-bin),則:生成的binlog日志的位置在data目錄下(eg: D:\Program Files(x86)\MySQL\db-data)
binlog-format=ROW
# 【日志中會記錄成每⼀一⾏行行數據被修改的形式】
# Server Id
server-id=1
# 【指定當前機器的服務 ID(如果是集群,則不能重復)】

Binlog常見格式:

- step2.2 重啟mysql服務
保存文件,重啟mysql服務
cmd(管理員權限)> sc stop mysql
cmd(管理員權限)> sc start mysql
cmd(管理員權限)> sc query mysql

step2.3 確認/查驗 是否mysql開啟成功了binlog
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------------------------------+
| log_bin | ON |
| log_bin_basename | D:\Program Files(x86)\MySQL\db-data\mysql-bin |
| log_bin_index | D:\Program Files(x86)\MySQL\db-data\mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------------------------------+
6 rows in set, 1 warning (0.00 sec)

若
log-bin
配置項提供的全路徑,則: 生成的日志文件就在指定的路徑下;若僅提供的1個文件名稱(Eg: mysql-bin),則:生成的binlog日志的位置在data目錄下(eg: D:\Program Files(x86)\MySQL\db-data)

3 操作步驟(Linux系統下: my.cnf
)
配置文件 :
/etc/my.cnf
log-bin=/var/lib/mysql/mysql-bin
binlog-format=ROW
server_id=1