十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
由于數(shù)據(jù)庫 Blob字段太多,導(dǎo)致從庫進(jìn)行binlog不能正常進(jìn)行的處理方法
成都創(chuàng)新互聯(lián)公司專注于巴彥淖爾網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供巴彥淖爾營銷型網(wǎng)站建設(shè),巴彥淖爾網(wǎng)站制作、巴彥淖爾網(wǎng)頁設(shè)計、巴彥淖爾網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造巴彥淖爾網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供巴彥淖爾網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
binlog_format為row格式的時候記錄的不是簡單的sql,而是實際變更的行,一些大的DML操作,會導(dǎo)致binlog量增加很大,消耗額外的IO、網(wǎng)絡(luò)資源
可以通過設(shè)置binlog_row_p_w_picpath=minimal解決
測試:
binlog_row_p_w_picpath默認(rèn)值是full
結(jié)論:可以對比發(fā)現(xiàn)當(dāng)binlog_row_p_w_picpath=minimal的時候binlog只記錄了影響的那一行記錄,有效減少了binlog日志量。
數(shù)據(jù)庫版本:5.6.*
參數(shù)binlog_row_p_w_picpath 控制著這種p_w_picpath類型,默認(rèn)為FULL(log all columns),即記錄before&after p_w_picpaths。
該參數(shù)還有兩種,minimal和noblob,minimal表示只記錄after更改后的值,并且如果有主鍵或者非空唯一索引,則只以該字段作為where條件判斷;noblob同full,只是不記錄blob、text列。
對于insert則沒有什么好說的,我們主要重點關(guān)注一下update和delete操作。
binlog_row_p_w_picpath=full的情況下,對于update和delete所有的表(包含帶有主鍵、非空唯一索引,唯一索引,沒有索引)產(chǎn)生的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'
從上面我們可以看到,在默認(rèn)為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'
從上面的例子可以看到,當(dāng)binlog_row_p_w_picpath=minimal的情況下,where條件只有主鍵或不為空的唯一索引,且只會更新被改變的字段。
在上面的測試我們可以看到,如果采用minimal格式,將減少主鍵和非空唯一索引表的before值,以及減少所有表update的after未被改變的值。
從效率上來說,減少了網(wǎng)絡(luò)傳輸以及加快了update的效率。
參考資料:
https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_row_p_w_picpath