(4.7)mysql备份还原——深入解析二进制日志(3)binlog的三种日志记录模式详解...
?關鍵詞:binlog模式,binlog,二進制日志,binlog日志
?
目錄概述
0、binlog概述
查看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是明文。
?
1、binlog_format='statement'
【1.3】總結(對主從的影響)(1)這種方式下,使用RC、RUC隔離級別會報錯。
(2)DDL以及DML都是明文按SQL記錄存儲。
(3)對有些參數,在不同的服務器和不同的時間,執行的結果不一樣,會導致主從不一致。比如currment_date,timestamp。
特別是一些函數:uuid(),user(),時間函數now()
(4)性能問題:比如主庫有一條慢SQL執行了,也會去從庫執行
(5)數據異常:主從數據不一致,執行也會有問題
2、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';
3、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';
?
?4、binlog_format='mixed'
理解了row與statement模式以后,mixed=statement和row
大多數情況下是以statement模式記錄,如果隔離級別為RC,那么會以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是明文。
?
1、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';
?
?
2、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'; ?
?
?
?
3、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語句與操作內容全部都有
?
?
?4、binlog_format='mixed'
理解了row與statement模式以后,mixed=statement和row
大多數情況下是以statement模式記錄,如果隔離級別為RC,那么會以row模式記錄
轉載于:https://www.cnblogs.com/gered/p/10720918.html
總結
以上是生活随笔為你收集整理的(4.7)mysql备份还原——深入解析二进制日志(3)binlog的三种日志记录模式详解...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [題解](并查集)luogu_P2391
- 下一篇: 网络基础复习提纲