(4.7)mysql備份還原——深刻解析二進制日誌(3)binlog的三種日誌記錄模式詳解

 關鍵詞:binlog模式,binlog,二進制日誌,binlog日誌mysql

 

目錄概述sql

0、binlog概述安全

  查看binlog日誌參數設置: show variables like '%log_bin%';服務器

  查看binlog文件事件信息:show binlog events in 'binlog.000003';session

  設計到3個參數:函數

  (1)binlog_format='row' -- (row,statement,mixed)性能

    日誌記錄模式,行、語句、混合   測試

    (1.1)statement:基於語句的複製(5.5.6以前默認),主服務器執行的SQL語句,在從服務器執行一樣的語句ui

 

    (1.2)row:基於行的複製(5.5.7以後默認),把改變的內容複製到從庫,而不是把SQL命令在從庫從新執行一遍。mysql5.0就開始支持加密

 

    (1.3)mixed:混合類型的複製,默認是使用 statement 語句方式複製,一旦發現基於語句沒法精確複製時(好比now() 由於主從有延遲致使數據不一致)就會採用基於 row 行的方式複製。

 

  (2)binlog_row_image=full -- (full,minimal,noblob)

    若是是用行的話,記錄所有的記錄、最小的記錄、不記錄二進制

    (2.1)full:記錄全部的列字段新舊字段記錄(即便那一列沒有更新到) -- insert/update語句的set部分是所有的新記錄,delete/update的where部分是所有的舊記錄

      (2.2)minimal:只記錄被更新到的新舊字段記錄  --  insert/update語句的set部分是所有的新記錄,update語句只有修改的列內容,update/delete的where部分沒有記錄(若是是主鍵或者惟一索引則會記錄)

    (2.3)noblob:二進制字段,不記錄,其他的與minimal相同

  (3)binlog_rows_query_log_events=on -- (on,off)

    爲off時,binlog中的記錄,dml裏面寫的是行記錄且加密,而不是SQL語句,DDL是明文。

    爲on時,dml裏面寫的是SQL語句+行記錄詳細信息,DDL是明文。

    

 

一、binlog_format='statement'

【1.3】總結(對主從的影響)
(1)這種方式下,使用RC、RUC隔離級別會報錯。
(2)DDL以及DML都是明文按SQL記錄存儲。
(3)對有些參數,在不一樣的服務器和不一樣的時間,執行的結果不同,會致使主從不一致。好比currment_date,timestamp。
  特別是一些函數:uuid(),user(),時間函數now()
(4)性能問題:好比主庫有一條慢SQL執行了,也會去從庫執行
(5)數據異常:主從數據不一致,執行也會有問題

二、binlog_format='row'

binlog_row_image=full;
binlog_rows_query_log_events=off;-- 顯示較爲詳細的DML信息,明文DDL,加密DML
【2.3】總結
(1)ddl操做時明文,而dml操做時加密(dml裏面寫的是行記錄,而不是SQL語句)
(2)針對加密的操做反解析加參數-v
mysqlbinlog --base64-output=decode-rows -v binlog.000004
(3)對複製的影響
  a.同步最安全
  b.無論是更新仍是刪除,或者批量操做數據,都是按行記錄,依次處理全部行的記錄,而不是SQL。
(4)查看事件(ddl爲sql明文,dml爲加密記錄)
show binlog events in 'binlog.000004';

三、binlog_format='row'

binlog_row_image=full;
binlog_rows_query_log_events=on; --顯示SQL語句+更詳細(數據類型)的DML信息 
【3.3】總結
(1)ddl操做時明文,而dml操做時加密(dml裏面寫的是SQL語句+行記錄詳細信息)
(2)針對加密的操做反解析加參數-v,加2個-v
mysqlbinlog --base64-output=decode-rows -v -v binlog.000005
(3)對複製的影響
  a.同步最安全
  b.無論是更新仍是刪除,或者批量操做數據,都是按行記錄,依次處理全部行的記錄,而不是SQL。
(4)查看事件(ddl爲sql明文,dml爲加密記錄)
show binlog events in 'binlog.000005';

 

 四、binlog_format='mixed'

  理解了row與statement模式之後,mixed=statement和row

  大多數狀況下是以statement模式記錄,若是隔離級別爲RC,那麼會以row模式記錄

  混合類型的記錄,默認是使用 statement 語句方式記錄,一旦發現基於語句沒法精確記錄時(好比now() 由於主從有延遲致使數據不一致)就會採用基於 row 行的方式複製。

 

 

 

0、概述

查看binlog日誌參數設置: show variables like '%log_bin%';

查看binlog文件事件信息:show binlog events in 'binlog.000003';

  

 

涉及到3個參數

  (1)binlog_format='row' -- (row,statement,mixed)

    日誌記錄模式,行、語句、混合

  (2)binlog_row_image=full -- (full,minimal,noblob)

    若是是用行的話,記錄所有的記錄、最小的記錄、不記錄二進制

    (2.1)full:記錄全部的列字段新舊字段記錄(即便那一列沒有更新到) -- insert/update語句的set部分是所有的新記錄,delete/update的where部分是所有的舊記錄

      (2.2)minimal:只記錄被更新到的新舊字段記錄  --  insert/update語句的set部分是所有的新記錄,update語句只有修改的列內容,update/delete的where部分沒有記錄(若是是主鍵或者惟一索引則會記錄)

    (2.3)noblob:二進制字段,不記錄,其他的與minimal相同

  (3)binlog_rows_query_log_events=on -- (on,off)  

       爲off時,binlog中的記錄,dml裏面寫的是行記錄且加密,而不是SQL語句,DDL是明文。

    爲on時,dml裏面寫的是SQL語句+行記錄詳細信息,DDL是明文。

 

一、binlog_format='statement'

【1.3】總結(對主從的影響)
(1)這種方式下,使用RC、RUC隔離級別會報錯。
(2)DDL以及DML都是明文按SQL記錄存儲。
(3)對有些參數,在不一樣的服務器和不一樣的時間,執行的結果不同,會致使主從不一致。好比currment_date,timestamp。
  特別是一些函數:uuid(),user(),時間函數now()
(4)性能問題:好比主庫有一條慢SQL執行了,也會去從庫執行
(5)數據異常:主從數據不一致,執行也會有問題
1.1】準備工做
-- 修改binlog記錄模式
set session binlog_format='statement';
set global binlog_format='statement';
select @@global.binlog_format,@@binlog_format;

-- 修改隔離級別爲重複度
set global tx_isolation='repeatable-read'; -- 舊的設置方法
set global transaction_isolation='repeatable-read'; -- 新的設置方法
set session transaction_isolation='repeatable-read';
select @@global.transaction_isolation,@@transaction_isolation;

-- 刷新binlog日誌
show master status;
flush logs;
show master status;

【1.2】 測試
-- 建表
create table test2(id int primary key not null auto_increment,
tablename varchar(200),UUID varchar(50),
timepoint datetime not null default current_timestamp,
currentversion timestamp not null default current_timestamp on update current_timestamp
)engine=innodb ; -- 插入數據 insert into test2(tablename,UUID) select 'test2',uuid();
-- 更新數據
update test2 set tablename='test2_update' where id = 1;
-- 提交
commit;
-- 查看狀態
show master status; -- 會發現position有了變化,以前是154,如今是2125
-- 退出mysql,進入binlog目錄,使用mysqlbinlog 查看binlog信息
mysqlbinlog --start-position=154 --stop-position=2125 binlog.000002

【1.3】總結(對主從的影響)
(1)這種方式下,使用RC、RUC隔離級別會報錯。
(2)DDL以及DML都是明文按SQL記錄存儲。
(3)對有些參數,在不一樣的服務器和不一樣的時間,執行的結果不同,會致使主從不一致。好比currment_date,timestamp。
  特別是一些函數:uuid(),user(),時間函數now()
(4)性能問題:好比主庫有一條慢SQL執行了,也會去從庫執行
(5)數據異常:主從數據不一致,執行也會有問題
(6)查看Binlog事件
show binlog events in 'binlog.000003';
  
  
 

   

 

二、binlog_format='row'

binlog_row_image=full;
binlog_rows_query_log_events=off;-- 顯示較爲詳細的DML信息,明文DDL
【2.3】總結
(1)ddl操做時明文,而dml操做時加密(dml裏面寫的是行記錄,而不是SQL語句)
(2)針對加密的操做反解析加參數-v
mysqlbinlog --base64-output=decode-rows -v binlog.000004
(3)對複製的影響
  a.同步最安全
  b.無論是更新仍是刪除,或者批量操做數據,都是按行記錄,依次處理全部行的記錄,而不是SQL。
(4)查看事件(ddl爲sql明文,dml爲加密記錄)
show binlog events in 'binlog.000004';
2.1】所有記錄+操做事件
binlog_row_image=full;
binlog_rows_query_log_events=off; 

【2.2】測試
-- 設置模式
set session binlog_format='row';
set global binlog_format='row';
set session binlog_rows_query_log_events=off; -- 默認
set global binlog_rows_query_log_events=off; -- 默認
set global binlog_row_image=full; -- 默認
set session binlog_row_image=full; -- 默認
select @@global.binlog_format,@@binlog_format,
@@global.binlog_rows_query_log_events,@@binlog_rows_query_log_events,
@@global.binlog_row_image,@@binlog_row_image\G


--設置隔離級別爲可重複讀
set global tx_isolation='repeatable-read'; -- 舊的設置方法
set global transaction_isolation='repeatable-read'; -- 新的設置方法
set session transaction_isolation='repeatable-read';
select @@global.transaction_isolation,@@transaction_isolation;

-- 刷新binlog日誌
show master status;
flush logs;
-- mysqladmin -uroot -p flush-logs; mysql -uroot -p -e 'flush logs'; show master status;

--建表
create table test3(id int primary key not null auto_increment,
tablename varchar(200),UUID varchar(50),
timepoint datetime not null default current_timestamp,
currentversion timestamp not null default current_timestamp on update current_timestamp
)engine=innodb ; -- 增刪改數據 insert into test3(tablename,UUID) select 'test3',uuid();
insert into test3(tablename,UUID) select 'test3',uuid();
update test3 set tablename='test3_update' where id = 1;
commit;

delete from test3 where id = 1;
commit;

drop table test3;

show master status; -- 會發現position有了變化,以前是154,如今是2125

-- 退出mysql,進入binlog目錄,使用mysqlbinlog 查看binlog信息
mysqlbinlog  binlog.000004
-- mysqlbinlog --start-position=154 --stop-position=2125 binlog.000004

【2.3】總結
(1)ddl操做時明文,而dml操做時加密(dml裏面寫的是行記錄,而不是SQL語句)
(2)針對加密的操做反解析加參數-v
mysqlbinlog --base64-output=decode-rows -v binlog.000004
(3)對複製的影響
  a.同步最安全
  b.無論是更新仍是刪除,或者批量操做數據,都是按行記錄,依次處理全部行的記錄,而不是SQL。
(4)查看事件(ddl爲sql明文,dml爲加密記錄)
show binlog events in 'binlog.000004';
 
  

 

 

 

三、binlog_format='row'

binlog_row_image=full;
binlog_rows_query_log_events=on; --顯示SQL語句+更詳細(數據類型)的DML信息
【3.1】所有記錄+詳細事件
binlog_row_image=full;
binlog_rows_query_log_events=on; 

【3.2】測試
-- 設置模式
set session binlog_format='row';
set global binlog_format='row';
set session binlog_rows_query_log_events=on; -- 手動指定
set global binlog_rows_query_log_events=on; -- 手動指定
set global binlog_row_image=full; -- 默認
set session binlog_row_image=full; -- 默認
select @@global.binlog_format,@@binlog_format,
@@global.binlog_rows_query_log_events,@@binlog_rows_query_log_events,
@@global.binlog_row_image,@@binlog_row_image\G


--設置隔離級別爲可重複讀
set global tx_isolation='repeatable-read'; -- 舊的設置方法
set global transaction_isolation='repeatable-read'; -- 新的設置方法
set session transaction_isolation='repeatable-read';
select @@global.transaction_isolation,@@transaction_isolation;

-- 刷新binlog日誌
show master status;
flush logs;
-- mysqladmin -uroot -p flush-logs; mysql -uroot -p -e 'flush logs';
show master status;

--建表
create table test4(id int primary key not null auto_increment,
tablename varchar(200),UUID varchar(50),
timepoint datetime not null default current_timestamp,
currentversion timestamp not null default current_timestamp on update current_timestamp
)engine=innodb ;

-- 增刪改數據
insert into test4(tablename,UUID) select 'test4',uuid();
insert into test4(tablename,UUID) select 'test4',uuid();
update test4 set tablename='test4_update' where id = 1;
commit;

delete from test4 where id = 1;
commit;

drop table test4;

show master status; -- 會發現position有了變化,以前是154,如今是2125

-- 退出mysql,進入binlog目錄,使用mysqlbinlog 查看binlog信息
mysqlbinlog  binlog.000005
-- mysqlbinlog --start-position=154 --stop-position=2125 binlog.000005

【3.3】總結
(1)ddl操做時明文,而dml操做時加密(dml裏面寫的是SQL語句+行記錄詳細信息)
(2)針對加密的操做反解析加參數-v,加2個-v
mysqlbinlog --base64-output=decode-rows -v -v binlog.0000053)對複製的影響
  a.同步最安全
  b.無論是更新仍是刪除,或者批量操做數據,都是按行記錄,依次處理全部行的記錄,而不是SQL。
(4)查看事件(ddl爲sql明文,dml爲加密記錄)
show binlog events in 'binlog.000005';


  (2)中:mysqlbinlog --base64-output=decode-rows -v -v binlog.000005
  

  (4)中:show binlog events in 'binlog.000005';  SQL語句與操做內容所有都有

    

 

 

 

 四、binlog_format='mixed'

  理解了row與statement模式之後,mixed=statement和row

  大多數狀況下是以statement模式記錄,若是隔離級別爲RC,那麼會以row模式記錄

相關文章
相關標籤/搜索