因爲數據庫 Blob字段太多,致使從庫進行binlog不能正常進行的處理方法html
binlog_format爲row格式的時候記錄的不是簡單的sql,而是實際變動的行,一些大的DML操做,會致使binlog量增長很大,消耗額外的IO、網絡資源
能夠經過設置binlog_row_p_w_picpath=minimal解決
測試:
mysql
binlog_row_p_w_picpath默認值是fullsql
對user表進行update數據庫
進入binlog裏面查看更新記錄,binlog日誌將全部影響的行都進行了記錄網絡
如今將binlog_row_p_w_picpath=minimalide
對錶中的行進行相同的update操做 再來觀察下binlog記錄post
結論:能夠對比發現當binlog_row_p_w_picpath=minimal的時候binlog只記錄了影響的那一行記錄,有效減小了binlog日誌量。測試
數據庫版本:5.6.*ui
參數binlog_row_p_w_picpath 控制着這種p_w_picpath類型,默認爲FULL(log all columns),即記錄before&after p_w_picpaths。
該參數還有兩種,minimal和noblob,minimal表示只記錄after更改後的值,而且若是有主鍵或者非空惟一索引,則只以該字段做爲where條件判斷;noblob同full,只是不記錄blob、text列。spa
對於insert則沒有什麼好說的,咱們主要重點關注一下update和delete操做。
binlog_row_p_w_picpath=full的狀況下,對於update和delete全部的表(包含帶有主鍵、非空惟一索引,惟一索引,沒有索引)產生的binlog均一致,binlog狀況以下:
--建表語句
CREATE TABLE `pk_test`(
`id` bigint(20) NOT NULL,
`username` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into pk_test values (1,2);
insert into pk_test values (2,2);
commit;
show master statusG;--記錄binlog文件和pos
deletefrom pk_test where id =1;
update pk_test set username='3';
commit;
mysqlbinlog --no-defaults -v --start-position=637945822/mysqllog/3307/binlog/mysql-bin.000001| more
### DELETE FROM `baofeng`.`pk_test`
### WHERE
### @1=1
### @2='2'
.....
### UPDATE `baofeng`.`pk_test`
### WHERE
### @1=2
### @2='2'
### SET
### @1=2
### @2='3'
從上面咱們能夠看到,在默認爲FULL的binlog_row_p_w_picpath下,不管表有沒有主鍵、惟一索引,所有按照全表字段做爲條件,且update會更新所有字段。
binlog_row_p_w_picpath=minimal的狀況下:
--建表語句
CREATE TABLE `ui_test`(
`id` bigint(20) NOT NULL,
`username` varchar(30) NOT NULL,
UNIQUE (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `ui_test_null`(
`id` bigint(20),
`username` varchar(30) NOT NULL,
UNIQUE key (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `null_test`(
`id` bigint(20),
`username` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into pk_test values (1,2);
insert into ui_test values (1,2);
insert into ui_test_null values (1,2);
insert into null_test values (1,2);
commit;
update pk_test set username='4';
deletefrom pk_test;
deletefrom ui_test;
deletefrom ui_test_null;
update null_test set username='4';
deletefrom null_test;
### UPDATE `baofeng`.`pk_test`
### WHERE
### @1=1
### SET
### @2='4'
....
### DELETE FROM `baofeng`.`pk_test`
### WHERE
### @1=1
.....
### DELETE FROM `baofeng`.`ui_test`
### WHERE
### @1=1
.....
### DELETE FROM `baofeng`.`ui_test_null`
### WHERE
### @1=1
### @2='2'
.....
### UPDATE `baofeng`.`null_test`
### WHERE
### @1=1
### @2='2'
### SET
### @2='4'
.....
### DELETE FROM `baofeng`.`null_test`
### WHERE
### @1=1
### @2='2'
從上面的例子能夠看到,當binlog_row_p_w_picpath=minimal的狀況下,where條件只有主鍵或不爲空的惟一索引,且只會更新被改變的字段。
在上面的測試咱們能夠看到,若是採用minimal格式,將減小主鍵和非空惟一索引表的before值,以及減小全部表update的after未被改變的值。
從效率上來講,減小了網絡傳輸以及加快了update的效率。