一.Mysql Binlog格式介绍
Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW!
1.Statement:每一条会修改数据的sql都会记录在binlog中。
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)
缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-defined functions(udf)会出现问题).
使用以下函数的语句也无法被复制:
* LOAD_FILE()
* UUID()
* USER()
* FOUND_ROWS()
* SYSDATE() (除非启动时启用了 --sysdate-is-now 选项)
同时在INSERT ...SELECT 会产生比 RBR 更多的行级锁
2.Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。
优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题
缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。
3.Mixedlevel: 是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。
二.Binlog基本配制与格式设定
1.基本配制
Mysql BInlog日志格式可以通过mysql的my.cnf文件的属性binlog_format指定。如以下:
binlog_format = MIXED //binlog日志格式
log_bin =目录/mysql-bin.log //binlog日志名
expire_logs_days = 7 //binlog过期清理时间
max_binlog_size 100m //binlog每个日志文件大小
binlog-do-db=需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
binlog-ignore-db=不需要备份的数据库苦命,如果备份多个数据库,重复设置这个选项即可
2.Binlog日志格式选择
Mysql默认是使用Statement日志格式,推荐使用MIXED.
由于一些特殊使用,可以考虑使用ROWED,如自己通过binlog日志来同步数据的修改,这样会节省很多相关操作。对于binlog数据处理会变得非常轻松,相对mixed,解析也会很轻松(当然前提是增加的日志量所带来的IO开销在容忍的范围内即可)。
3.mysqlbinlog格式选择
mysql对于日志格式的选定原则:如果是采用 INSERT,UPDATE,DELETE 等直接操作表的情况,则日志格式根据 binlog_format 的设定而记录,如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何 都采用 SBR 模式记录
三.Mysql Binlog日志分析
通过MysqlBinlog指令查看具体的mysql日志,如下:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SET TIMESTAMP=1350355892/*!*/;
BEGIN
/*!*/;
# at 1643330
#121016 10:51:32 server id 1 end_log_pos 1643885 Query thread_id=272571 exec_time=0 error_code=0
SET TIMESTAMP=1350355892/*!*/;
Insert into T_test….)
/*!*/;
# at 1643885
#121016 10:51:32 server id 1 end_log_pos 1643912 Xid = 0
COMMIT/*!*/;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.开始事物的时间:
SET TIMESTAMP=1350355892/*!*/;
BEGIN
2.sqlevent起点
#at 1643330 :为事件的起点,是以1643330字节开始。
3.sqlevent 发生的时间点
#121016 10:51:32:是事件发生的时间,
4.serverId
server id 1 :为master 的serverId
5.sqlevent终点及花费时间,错误码
end_log_pos 1643885:为事件的终点,是以1643885 字节结束。
execTime 0: 花费的时间
error_code=0:错误码
Xid:事件指示提交的XA事务
Mixed日志说明:
在slave日志同步过程中,对于使用now这样的时间函数,MIXED日志格式,会在日志中产生对应的unix_timestamp()*1000的时间字符串,slave在完成同步时,取用的是sqlEvent发生的时间来保证数据的准确性。另外对于一些功能性函数slave能完成相应的数据同步,而对于上面指定的一些类似于UDF函数,导致Slave无法知晓的情况,则会采用ROW格式存储这些Binlog,以保证产生的Binlog可以供Slave完成数据同步。
http://www.cnblogs.com/jackluo/archive/2013/09/24/3336585.html
相关推荐
### MySQL Binlog 二进制日志详解 #### 基本概念 **定义:** MySQL 的二进制日志(Binlog)是一种记录数据库所有更新操作的日志形式,包括那些实际更新了数据以及那些虽然执行但未找到匹配行(如未匹配任何行的 ...
1. **MySQL二进制日志详解** - **作用**:binlog记录了所有改变数据库状态的SQL语句,用于在主从复制中同步数据,同时也可用于灾难恢复。 - **格式**:MySQL binlog有两种格式,Statement和Row,Statement记录的是...
本文将深入讲解如何正确清理MySQL的binlog日志,确保数据的安全性和系统的稳定运行。 首先,查看MySQL的binlog日志列表,可以通过以下SQL命令实现: ```sql mysql> show binary logs; ``` 这条命令会显示所有已...
### MySQL 删除日志方法详解 在数据库管理过程中,MySQL的日志文件可能会随着时间的推移而逐渐增大,占用较多的磁盘空间。为了更好地管理和优化存储资源,适时地清理不再需要的日志文件是非常必要的。本文将详细...
### MySQL Binlog 的三种模式详解 #### 一、引言 在MySQL数据库系统中,Binlog(Binary Log)是至关重要的日志记录机制之一,它主要用于记录所有改变数据的SQL语句,对于实现主从复制、数据恢复等功能具有不可替代...
Canal是阿里巴巴开源的一款用于MySQL数据库增量数据订阅与消费的工具,主要基于MySQL的binlog日志解析。MySQL的binlog日志记录了所有对数据库的更改操作,这对于数据同步和备份至关重要。Canal通过模拟MySQL slave的...
《深入理解PHP MySQL Binlog解析器:php-binlog-parser实现详解》 在数据库管理领域,MySQL的Binary Log(简称Binlog)是数据恢复和复制的关键技术。它记录了所有更改数据库状态的事件,使得我们可以从Binlog中重建...
MySQL binlog(二进制日志)是数据库系统中用于记录所有改变数据库状态的数据操作的重要组件,它在数据恢复和高可用性方案中扮演着关键角色。MySQL binlog远程备份是为了确保即使在本地服务器出现问题时,也能保持...
MySQL日志系统是数据库管理的重要组成部分,它记录了数据库的各种操作和事件,为故障排查、性能优化、数据恢复等提供了重要参考。以下是对MySQL日志的详细解析: 1. 错误日志(Error Log) MySQL的错误日志记录了...
描述中提到,“canal订阅监听mysql binlog日志,消费订阅日志demo”,意味着这个示例会演示如何配置和使用Canal来订阅MySQL数据库的binlog事件。一旦MySQL服务器上产生了任何更改(如增删改操作),这些变更会被记录...
MySQL面试题详解 本文档将详细解释MySQL面试中的一些常见问题,包括MySQL的复制原理、InnoDB与MyISAM的区别、varchar与char的区别、事务与日志的实现方式等。 MySQL的复制原理 ---------------- MySQL的复制原理...
《使用MySQL Binlog自动刷新Redis缓存——mycacher详解》 在现代互联网应用中,数据库与缓存的配合使用是提升系统性能的关键一环。MySQL作为常用的后端数据库,其数据更新频繁,而Redis作为内存数据库,提供高速的...
MySQL二进制日志(binlog)是数据库复制和数据恢复的重要组成部分,它记录了所有对MySQL数据库进行的更改操作。在MySQL中,不同的数据库操作对应着不同类型的binlog事件。下面将详细介绍这些事件类型。 1. QUERY_...
binlog2sql是一款能够将MySQL的binlog日志反解析为SQL插入语句的工具,对于数据恢复和数据迁移有着显著的优势。 ### MySQL Binlog介绍 MySQL的binlog是一种记录所有改变数据库状态的非归档日志。它记录了对数据库...
MySQL Binlog数据查看方法详解 MySQL的二进制日志(binlog)是MySQL数据库的一个重要功能,它记录了所有对MySQL数据库进行更改的事件(例如修改数据,删除数据,甚至修改表结构等操作),这些日志文件对于数据库的...