MySQL binlog日誌基於段和語句的使用

2021-10-24 13:44:23 字數 4658 閱讀 3316

總綱

基於語句的日誌 statement

基於行的日誌 row

混合日誌 mixed

通用操作步驟

檢視當前日誌型別

show variables like 'binlog_format';

設定日誌格式為基於語句形式

基於語句

set session binlog_format=statement;

基於行set session binlog_format=row;

查詢當前的binlog日誌

show binary logs;

重新整理日誌,生成乙個新的日誌檔案

flush logs;

執行sql

檢視最新日誌檔案

基於語句檢視日誌

mysqlbinlog binlog.000012

基於行檢視日誌

mysqlbinlog -vv binlog.000012

資料初始化

建立資料庫

create database db_binlog;

進入測試資料庫

use db_binlog;

建立表create table user ( id int ( 11 ), name varchar ( 255 ), age int ( 11 ));

插入資料

insert into user(id,name,age) values(1,"aaa",1),(2,"bbb",2),(3,"ccc",3);

基於語句的日誌

實驗步驟

設定為基於語句的日誌

set session binlog_format=statement;

批量更新多條資料

重新整理日誌檔案

flush logs;

批量更新

update user set age=6;

分析日誌內容

檢視日誌

mysqlbinlog binlog.000017

分析日誌

/*!*/;

# at 336

#201008 20:57:03 server id 1 end_log_pos 453 crc32 0x9f208ee4 query thread_id=10 exec_time=0 error_code=0

use `db_binlog`/*!*/;

set timestamp=1602161823/*!*/;

update user set age=6

/*!*/;

結果出現這條語句 update user set age=6

優點

日誌記錄量相對較小,節約磁碟和網路i/o 缺點

保證語句在其他伺服器上執行結果和在主伺服器上相同,必須要記錄上下文資訊,所以在只修改或插入一條資料是,可能比基於行的的日誌量更大

特定函式例如uuid(),user()可能在其他伺服器會複製失敗,導致主從資料不一致

基於行的日誌

三種形式

full:記錄修改行所有的內容,無論這些列是否被修改過

minimal:記錄被修改的列

noblob:和full挺像,但是如果列中text和blob沒有被修改就不會記錄text和blob的列

查詢行日誌格式

show variables like '%binlog_row_image%';

+------------------+-------+

| variable_name | value |

+------------------+-------+

| binlog_row_image | full |

+------------------+-------+

設定行日誌格式

set session binlog_row_image=minimal;

實驗步驟

設定為基於行的日誌

set session binlog_format=row;

批量更新多條資料

重新整理日誌檔案

flush logs;

批量更新

update user set age=7;

分析日誌內容

檢視日誌

mysqlbinlog -vv binlog.000017

分析日誌

'/*!*/;

### update `db_binlog`.`user`

### where

### @1=1 /* int meta=0 nullable=1 is_null=0 */

### @2='aaa' /* varstring(1020) meta=1020 nullable=1 is_null=0 */

### @3=6 /* int meta=0 nullable=1 is_null=0 */

### set

### @1=1 /* int meta=0 nullable=1 is_null=0 */

### @2='aaa' /* varstring(1020) meta=1020 nullable=1 is_null=0 */

### @3=7 /* int meta=0 nullable=1 is_null=0 */

### update `db_binlog`.`user`

### where

### @1=2 /* int meta=0 nullable=1 is_null=0 */

### @2='bbb' /* varstring(1020) meta=1020 nullable=1 is_null=0 */

### @3=6 /* int meta=0 nullable=1 is_null=0 */

### set

### @1=2 /* int meta=0 nullable=1 is_null=0 */

### @2='bbb' /* varstring(1020) meta=1020 nullable=1 is_null=0 */

### @3=7 /* int meta=0 nullable=1 is_null=0 */

### update `db_binlog`.`user`

### where

### @1=3 /* int meta=0 nullable=1 is_null=0 */

### @2='ccc' /* varstring(1020) meta=1020 nullable=1 is_null=0 */

### @3=6 /* int meta=0 nullable=1 is_null=0 */

### set

### @1=3 /* int meta=0 nullable=1 is_null=0 */

### @2='ccc' /* varstring(1020) meta=1020 nullable=1 is_null=0 */

### @3=7 /* int meta=0 nullable=1 is_null=0 */

### update `db_binlog`.`user`

### where

### @1=5 /* int meta=0 nullable=1 is_null=0 */

### @2='3934f07a-0967-11eb-bf37-000c29360040' /* varstring(1020) meta=1020 nullable=1 is_null=0 */

### @3=5 /* int meta=0 nullable=1 is_null=0 */

### set

### @1=5 /* int meta=0 nullable=1 is_null=0 */

### @2='3934f07a-0967-11eb-bf37-000c29360040' /* varstring(1020) meta=1020 nullable=1 is_null=0 */

### @3=7 /* int meta=0 nullable=1 is_null=0 */

# at 602

#201008 21:27:31 server id 1 end_log_pos 633 crc32 0xcf5a7646 xid = 145

commit/*!*/;

結果每一條資料都出現一條update語句

優點

row格式可以避免mysql複製**現的主從不一致的問題

對每一行資料的修改比基於段的複製高效 缺點

同乙個sql語句修改了1000條資料的情況下,會產生1000條sql,記錄日誌量較大

混合日誌

mixed主要使用記錄語句,當遇到uuid函式或者 innodb引擎設定讀未提交讀已提交時使用行記錄

mysql binlog日誌刪除

隨著mysql的執行,其binlog日誌會越來越多,占用的磁碟會越來越大。我們需要定期清理這些過期的binlog日誌。處理方法主要有兩種 1 自動刪除 2 手動刪除 1 自動刪除 a,修改my.cnf引數 需要更改其配置檔案my.cnf,新增引數expire logs days 10,單位是天。b,...

壓縮mysql binlog日誌

伺服器硬碟太貴了 mysql的binlog日誌增長太快了 需要定時壓縮一下 然後清除 清除步驟 建立清除shell vim bzbinlog.sh bin sh tar jcvpf date mysqlbinlogdir mysql bin.000108.tar.bz2 usr local mysq...

mysql binlog日誌刪除

今天發現磁碟被佔滿,檢查後是binlog日誌占用太多,所以刪除下 mysql的binlog日誌介紹 binlog是mysql以二進位制形式列印的日誌,它預設不加密,不壓縮。binlog二進位制日誌包含了所有更新了資料或者已經潛在更新了資料 例如,沒有匹配任何行的乙個delete 的所有語句。語句以 ...