關鍵詞: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.000005 (3)對複製的影響 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模式記錄