`

binlog模式分三种(row,statement,mixed)

 
阅读更多

1.Row

日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改,只记录要修改的数据,只有value,不会有sql多表关联的情况。

优点:在row模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了,所以row的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程和function,以及trigger的调用和出发无法被正确复制问题。

缺点:在row模式下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。



mysql> insert into username(username) select * from aa;

ERROR 1146 (42S02): Table 'test.username' doesn't exist

mysql> insert into user(username) select * from aa;

Query OK, 1 row affected (0.01 sec)

Records: 1  Duplicates: 0  Warnings: 0



查看binlog



root@xuebinbin:/vobiledata/mysqllog# mysqlbinlog mysql-bin.000017



BINLOG '

63EfUBNQAAAALgAAAA8CAAAAAA8AAAAAAAEABHRlc3QABHVzZXIAAgIPAi0AAA==

63EfUBdQAAAAJgAAADUCAAAAAA8AAAAAAAEAAv/8BAAFYmFveXU=

'/*!*/;

### INSERT INTO test.user

### SET

###   @1=4 /* SHORTINT meta=0 nullable=0 is_null=0 */

###   @2='baoyu' /* VARSTRING(45) meta=45 nullable=0 is_null=0 */

# at 565

#120806  0:27:39 server id 80  end_log_pos 592     Xid = 20

COMMIT/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;



由此可见,row模式是针对每一行的数据,而于关联表无关,它把关联中的相应数据记录在log中。这样一来会产生大量的数据。



2.statement

每一条会修改数据的sql都会记录到master的binlog中,slave在复制的时候sql进程会解析成和原来master端执行多相同的sql再执行。

优点:在statement模式下首先就是解决了row模式的缺点,不需要记录每一行数据的变化减少了binlog日志量,节省了I/O以及存储资源,提高性能。因为他只需要激励在master上所执行的语句的细节一届执行语句时候的上下的信息。

缺点:在statement模式下,由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端被执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于mysql现在发展比较快,很多的新功能不断的加入,使mysql的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement中,目前已经发现不少情况会造成Mysql的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep()函数在有些版本中就不能被正确复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于row是基于每一行来记录的变化,所以不会出现,类似的问题。





mysql> insert into user(username) values('xuebinbin');

ERROR 1598 (HY000): Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'

mysql> SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

    -> ;

Query OK, 0 rows affected (0.00 sec)



mysql> insert into user(username) values('xuebinbin');

Query OK, 1 row affected (0.00 sec)



查看binlog

root@xuebinbin:/vobiledata/mysqllog# mysqlbinlog mysql-bin.000008



BEGIN

/*!*/;

# at 174

#120806 14:47:35 server id 80  end_log_pos 202     Intvar

SET INSERT_ID=2/*!*/;

# at 202

#120806 14:47:35 server id 80  end_log_pos 311     Query    thread_id=5    exec_time=0    error_code=0

use test/*!*/;

SET TIMESTAMP=1344235655/*!*/;

insert into user(username) values('xuebinbin')

/*!*/;

# at 311

#120806 14:47:35 server id 80  end_log_pos 338     Xid = 20

COMMIT/*!*/;

# at 338

#120806 14:53:18 server id 80  end_log_pos 357     Stop

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;



结果发现statement是以sql记录形式记录的。这样的话一个sql就只记录一条,减少了大量的数据存储。



3.Mixed

从官方文档中看到,之前的 MySQL 一直都只有基于 statement 的复制模式,直到 5.1.5 版本的 MySQL 才开始支持 row 复制。从 5.0 开始,MySQL 的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给 MySQL Replication 又带来了更大的新挑战。另外,看到官方文档说,从 5.1.8 版本开始,MySQL 提供了除 Statement 和 Row 之外的第三种复制模式:Mixed,实际上就是前两种模式的结合。在 Mixed 模式下,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。新版本中的 statment 还是和以前一样,仅仅记录执行的语句。而新版本的 MySQL 中对 row 模式也被做了优化,并不是所有的修改都会以 row 模式来记录,比如遇到表结构变更的时候就会以 statement 模式来记录,如果 SQL 语句确实就是 update 或者 delete 等修改数据的语句,那么还是会记录所有行的变更。







分享到:
评论

相关推荐

    mysql binlog的三种模式

    MySQL提供了三种不同的Binlog格式:Row Level、Statement Level 和 Mixed Level,每种格式都有其特点和适用场景。 #### 二、Row Level 模式 **Row Level** 是MySQL Binlog中的一种日志格式,它会记录每一行数据的...

    binlog文件解析相关.docx

    MySQL支持三种模式:ROW、STATEMENT和MIXED。ROW模式记录每个更改的具体行,STATEMENT模式记录SQL语句,而MIXED模式则根据情况自动选择ROW或STATEMENT。 GTID模式是一种自动分配的全局事务ID,用于追踪和管理跨多个...

    [MySQL binlog]mysql如何彻底解析Mixed日志格式的binlog

    mysql binlog3种格式,row,mixed,statement. 解析工作 mysqlbinlog –base64-output=DECODE-ROWS -v mysql-bin.000144 |more –base64-output=DECODE-ROWS: 会显示出row模式带来的sql变更。 -v :显示statement...

    MySQL – binlog日志简介及设置

    MySQL binlog有三种格式:STATEMENT、ROW和MIXED。每种格式都有其特点: 1. **STATEMENT模式**:基于SQL语句的复制。在这种模式下,每条修改数据的SQL语句会被记录到binlog中。优点是日志文件较小,减少了磁盘I/O,...

    基于java开发的、高性能的、基于解析mysql row base binlog技术实现.zip

    有三种模式:Statement、Row和Mixed,其中Row模式提供了最详细的日志信息,记录每个更改的具体行数据,适用于需要精确数据同步的场景。 2. **Row Base Binlog**: 在Row模式下,binlog记录的是每一行数据的变更,...

    binlog测试log

    MySQL Binlog支持三种不同的格式:STATEMENT、ROW和MIXED。默认情况下,MySQL使用的是ROW格式。 - **STATEMENT格式**:记录SQL语句本身,适用于大多数情况,但存在某些特殊情况下无法恢复数据的问题。 - **ROW格式*...

    必知必会:Binlog 详解

    文章目录Binlog 介绍Binlog 模式行模式:ROW语句模式:Statement混合模式:Mixed查看、开启查看 mysql 是否开启 binlog查看 mysql 的 binlog 模式通过配置文件开启 binlogMySQL 中 binlog 相关命令MySQL 扩展总结 ...

    binlog2sql 离线包+python扩展包

    8. **最佳实践**:在使用binlog2sql时,需要了解MySQL的binlog格式(如ROW、STATEMENT、MIXED),并根据实际需求配置binlog的保留策略,确保有足够的binlog数据用于恢复。 9. **故障排查**:binlog2sql 可以帮助...

    同步MySQL binlog 将分库分表合并到另外一个库表中-py_sync_binlog.zip

    它的格式有两种:STATEMENT和ROW,以及后来的MIXED模式。STATEMENT模式记录的是SQL语句,ROW模式则记录具体的数据行变化。在进行数据同步时,ROW模式通常更为安全,因为它能精确地反映出数据的变化。 在“py_sync_...

    MySQL Flashback闪回功能详解.docx

    MySQL 的 binlog 有三种格式:statement、row、mixed。Statement 模式基于 SQL 语句的模式,一般来说生成的 binlog 尺寸较小,但是某些不确定性 SQL 语句或函数在复制过程可能导致数据不一致甚至出错;Row 模式基于...

    使用binlog日志恢复MySQL数据库删除数据的方法

    另外,binlog日志的存储格式(如STATEMENT、ROW或MIXED)也会影响恢复的难易程度和完整性。 总之,了解并正确使用MySQL的binlog日志是数据库管理员必备的技能之一,它能帮助我们在遭遇数据灾难时尽可能地减少损失。...

    binlog2sql-master.zip

    1. **binlog事件解析**:binlog2sql能够解析MySQL binlog事件的各种格式,包括ROW、STATEMENT和MIXED模式。 2. **SQL语句生成**:根据binlog事件,binlog2sql可以生成相应的INSERT、UPDATE和DELETE SQL语句,便于...

    mysql数据库恢复 binlog2sql数据库恢复

    这通常涉及到设置my.cnf配置文件,开启binlog功能,并设定合适的binlog_format(如ROW、STATEMENT或MIXED),以及binlog_row_image(FULL、MINIMAL或NO)。此外,还需要设置合适的binlog_size,以控制单个binlog文件...

    binlog备份1

    2. **Binlog格式**: 包括STATEMENT、ROW和MIXED三种模式。 - STATEMENT: 记录SQL语句。 - ROW: 记录每一条记录的变化。 - MIXED: 默认模式,根据SQL语句选择STATEMENT或ROW。 3. **Binlog文件管理**: MySQL自动...

    php_client_for_mysql_binlog 源代码包

    1. **MySQL二进制日志(binlog)**:记录所有改变数据库状态的SQL语句,分为STATEMENT、ROW和MIXED格式,用于数据恢复、主从复制等。 2. **MySQL复制**:主从复制是一种数据库高可用性的解决方案,通过binlog实现...

    MySQL binlog闪回工具

    它分为STATEMENT、ROW和MIXED三种模式,其中ROW模式最适合用于闪回操作,因为它记录了每一行数据的变化。 2. **binlog闪回原理**:当数据库出现错误或误操作后,可以通过binlog找出在特定时间点之前的所有操作,...

    mysql中binlog_format模式与配置详细分析

    `binlog_format` 参数定义了binlog的记录方式,有三种模式:STATEMENT、ROW和MIXED。 1. **STATEMENT模式(SBR)** - 在这种模式下,binlog记录的是修改数据的SQL语句。因为不需要记录每一行的变更,所以日志文件...

    MySQL 闪回工具binlog2sql

    MySQL的binlog格式有ROW、STATEMENT和MIXED三种模式,binlog2sql需要能处理这三种模式下的事件。解析过程中,工具需要理解并解析每个事件的结构,包括事件类型、时间戳、影响的表、执行的SQL语句等信息。 五、使用...

    canal数据binlog同步demo

    常见的格式有ROW、STATEMENT和MIXED。 2. **Canal**:Canal是一款开源的数据库同步工具,主要用于解决分布式环境下的数据一致性问题。它能够实时捕获MySQL的binlog事件,并将其转换为易于处理的消息格式,如JSON,...

Global site tag (gtag.js) - Google Analytics