天天看點

由于資料庫 Blob字段太多,導緻從庫進行binlog不能正常進行的處理方法

binlog_format為row格式的時候記錄的不是簡單的sql,而是實際變更的行,一些大的DML操作,會導緻binlog量增加很大,消耗額外的IO、網絡資源

可以通過設定binlog_row_image=minimal解決

測試:

binlog_row_image預設值是full

由于資料庫 Blob字段太多,導緻從庫進行binlog不能正常進行的處理方法

對user表進行update

由于資料庫 Blob字段太多,導緻從庫進行binlog不能正常進行的處理方法

進入binlog裡面檢視更新記錄,binlog日志将所有影響的行都進行了記錄

由于資料庫 Blob字段太多,導緻從庫進行binlog不能正常進行的處理方法

現在将binlog_row_image=minimal

由于資料庫 Blob字段太多,導緻從庫進行binlog不能正常進行的處理方法

對表中的行進行相同的update操作 再來觀察下binlog記錄

由于資料庫 Blob字段太多,導緻從庫進行binlog不能正常進行的處理方法

結論:可以對比發現當binlog_row_image=minimal的時候binlog隻記錄了影響的那一行記錄,有效減少了binlog日志量。

資料庫版本:5.6.*

該參數還有兩種,minimal和noblob,minimal表示隻記錄after更改後的值,并且如果有主鍵或者非空唯一索引,則隻以該字段作為where條件判斷;noblob同full,隻是不記錄blob、text列。

對于insert則沒有什麼好說的,我們主要重點關注一下update和delete操作。

<code>--建表語句</code>

<code>CREATE TABLE `pk_test`(</code>

<code>`id` bigint(20) NOT NULL,</code>

<code>`username` varchar(30) NOT NULL,</code>

<code>PRIMARY KEY (`id`)</code>

<code>) ENGINE=InnoDB DEFAULT CHARSET=utf8;</code>

<code>insert into pk_test values (1,2);</code>

<code>insert into pk_test values (2,2);</code>

<code>commit;</code>

<code></code>

<code>show master statusG;--記錄binlog檔案和pos</code>

<code>deletefrom pk_test where id =1;</code>

<code>update pk_test set username='3';</code>

<code>commit;</code>

<code>mysqlbinlog --no-defaults -v --start-position=637945822/mysqllog/3307/binlog/mysql-bin.000001| more</code>

<code>### DELETE FROM `baofeng`.`pk_test`</code>

<code>### WHERE</code>

<code>### @1=1</code>

<code>### @2='2'</code>

<code>.....</code>

<code>### UPDATE `baofeng`.`pk_test`</code>

<code>### @1=2</code>

<code>### SET</code>

<code>### @2='3'</code>

從上面我們可以看到,在預設為FULL的binlog_row_image下,無論表有沒有主鍵、唯一索引,全部按照全表字段作為條件,且update會更新全部字段。

binlog_row_image=minimal的情況下:

<code>CREATE TABLE `ui_test`(</code>

<code>UNIQUE (`id`)</code>

<code>CREATE TABLE `ui_test_null`(</code>

<code>`id` bigint(20),</code>

<code>UNIQUE key (`id`)</code>

<code>CREATE TABLE `null_test`(</code>

<code>`username` varchar(30) NOT NULL</code>

<code>insert into ui_test values (1,2);</code>

<code>insert into ui_test_null values (1,2);</code>

<code>insert into null_test values (1,2);</code>

<code>update pk_test set username='4';</code>

<code>deletefrom pk_test;</code>

<code>deletefrom ui_test;</code>

<code>deletefrom ui_test_null;</code>

<code>update null_test set username='4';</code>

<code>deletefrom null_test;</code>

<code>### @2='4'</code>

<code>....</code>

<code>### DELETE FROM `baofeng`.`ui_test`</code>

<code>### DELETE FROM `baofeng`.`ui_test_null`</code>

<code>### UPDATE `baofeng`.`null_test`</code>

<code>### DELETE FROM `baofeng`.`null_test`</code>

從上面的例子可以看到,當binlog_row_image=minimal的情況下,where條件隻有主鍵或不為空的唯一索引,且隻會更新被改變的字段。

在上面的測試我們可以看到,如果采用minimal格式,将減少主鍵和非空唯一索引表的before值,以及減少所有表update的after未被改變的值。

從效率上來說,減少了網絡傳輸以及加快了update的效率。

參考資料:

<a href="https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_row_image" target="_blank">https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_row_image</a>

本文轉自 holy2009 51CTO部落格,原文連結:http://blog.51cto.com/holy2010/1967909