[數據庫/MYSQL]MYSQL開啟Bin-Log


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 

X 參考文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM