1. 程式人生 > >mysql-二進制日誌

mysql-二進制日誌

導致 pos 長時間 是否 params 時間 特點 mysql數據庫 日誌格式

mysql---二進制日誌

記錄了所有對MySQL數據庫的修改事件,包括增刪改查事件和對表結構的修改事件

二進制日誌的開啟

#是否啟用了日誌
mysql> show variables like ‘log_bin‘; 

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+

[mysqld]

log-bin [=DIR \ [filename]]

log_bin=mysql-bin 名字可以隨便起(mysql-bin)

格式

binlog_format={STATEMENT|ROW|MIXED}
  1. 語句(statement):默認的記錄格式,基於段
  2. 行(row):定義的並非數據本身而是這一行的數據是什麽
  3. 混合模式(mixed):交替使用行和語句、由mysql服務器自行判斷

基於段的日誌格式

優點

  1. 日誌記錄量相對較小,節約磁盤及網絡IO
  2. 只對一條記錄修改或者插入,row格式所產生的日誌量小於段產生的日誌量

缺點

  1. 必須要記錄上下文信息,保證語句在從服務器上執行結果與主服務器相同
  2. 特定函數如UUID(),user()這樣非確定性函數還是無法復制;可能造成MySQL復制的主備服務器數據不一致

操作

mysql> show variables like ‘binlog_format‘;

mysql> set session binlog_format=statement;

mysql> show binary logs; 

mysql> flush logs;

行日誌格式

  1. 5.7版本的默認格式
  2. Row格式可以避免Mysql復制中出現的主從不一致問題

同一SQL語句修改了10000條數據的情況下

  • 基於段的日誌格式只會記錄這個SQL語句
  • 基於行的日誌會有10000條記錄分別記錄每一行的數據修改

優點

  1. 使MySQL主從復制更加安全
  2. 對每一行數據的修改比基於段的復制高效

誤操作而修改了數據庫中的數據,同時又沒有備份可以恢復時,我們就可以通過分析二進制日誌,對日誌中記錄的數據修改操作做反向處理的方式來達到恢復數據的目的

缺點

  1. 記錄日誌量較大;binlog_row_image=[FULL|MINIMAL|NOBLOB]

混合日誌格式

binlog_format=MIXED

特點

  • 根據SQL語句由系統決定基於段和基於行的日誌格式中進行選擇
  • 數據量的大小由所執行的SQL語句決定

二進制日誌格式對復制的影響

基於SQL語句(statement)復制(SBR)

優點

  1. 生成的日誌量少,節約網絡傳輸IO
  2. 並不強制要求主從數據庫的表定義完全相同
  3. 相比於基於行的復制方式更為靈活

缺點

  1. 對於非確定性事件,無法保證主從復制數據的一致性
  2. 對於存儲過程,觸發器,自定義函數進行的修改也可能造成數據不一致
  3. 相比於基於行的復制方式在從上執行時需要更多的行鎖

基於行的復制(PBR)

優點

  1. 可以應用於任何SQL的復制包括非確定函數,存儲過程等
  2. 可以減少數據庫鎖的使用
  3. 對主從數據的一致性更加有保證

缺點

  1. 要求主從數據庫的表結構相同,否則可能會中斷復制
  2. 無法在從上單獨執行觸發器

查看二進制日誌

數據庫會話查看

#顯示當前服務器使用的二進制文件及大小
mysql> show binary logs

#顯示主服務器使用的二進制文件及大小
mysql> show master logs;

#當前使用的二進制文件及所處位置
mysql> show master status

#lush logs一般只會滾動中繼日誌和二進制日誌
mysql> flush logs;

#二進制日誌的記錄位置,通常為上一個事件執行結束時間的位置
mysql> showmaster status;

#...數據庫的增刪改查
#觀察二進制位置的變化
mysql> show master status;


#查看所有的二進制信息
mysql> show binlog events\G;

#查看指定日誌的二進制信息
mysql> show binlog events in ‘mysql-bin.000011‘; 

#從指定的事件位置開始
mysql> show binlog events in ‘mysql-bin.000011‘ from 190;

#指定偏移量(不是語句,是事件)
mysql> showbinlog events in ‘mysql-bin.000011‘ from 190 limit 3;

命令行mysqlbinlog

#必須在數據目錄下
mysqlbinlog mysql-bin.000017

#導出此數據庫的信息  
mysqlbinlog mysql-bin.000017 > /tmp/a.sql

#導入此數據庫的信息
mysql < a.sql

mysqlbinlog -vv 日誌名

二進制日誌刪除

長時間不清理會浪費很多的磁盤空間,但是刪除後可能導致數據庫崩潰無法進行恢復.

若要刪除二進制日誌首先將其和數據庫備份一份

#刪除所有的二進制日誌(不可效仿)
mysql> reset master; 

#根據文件或時間點來刪除二進制日誌
# TO ‘log_name‘ 刪除文件之前的所有文件 
mysql> PURGE { BINARY | MASTER } LOGS {TO ‘log_name‘ | BEFORE datetime_expr }

#使用時間來刪除二進制日誌
mysql> PURGEBINARY LOGS BEFORE ‘13-10-19 10:26:36‘; 

mysql-二進制日誌