--mysql对binlog的处理

------------------------2014/05/28

Binlog是mysql以二进制形式打印的日志,它默认不加密,不压缩。每个正常的binlog文件头部,有4个字节的标记,值为0xfe 0x62 0x69 0x6e。LOG_EVENT是binlog里的单位,即正常情况下binlog按照逐LOG_EVENT的形式增长。除去头部的标记,binlog就是一个LOG_EVENT的序列。每个LOG_EVENT都独立单元,没有互相引用的关系,它也有自己的二进制头部,主要是记录了时间戳、类型标记等描述信息。

Mysql把磁盘操作的实现封装在IO_CACHE结构里,这也方便了我们对binlog的研究和描述,后文如果没有特别说明,读写binlog与读写IO_CACHE的含义相同。

对于MYISAM表:只要语法和语义没有错误,MYSQL不等执行语句执行完,就会写binlog。如果binlog_format=statement对于复制而言就很危险,因为主库可能会将它执行到一半的时候cancel,然后这条语句却会在从库上完整的执行,造成主从不一致。

这是生产库上因为主库sql被abort后,从库停止复制,报出的错误信息:

Last_Error: Query partially completed on the master (error on master: ) and was aborted. There is a chance that your master is inconsistent at this point.
If you are sure that your master is ok, run this query manually on the slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=; START SLAVE; .
Query: 'delete from log_fight_data where d_create< '-- ::''

对于INNODB表:commit后才会写binlog,如果语句被cancel,作为事务性引擎,会回滚,不会出现更新一半,也不会记binlog。

--可见使用innodb表相比myisam无事务的表来说,从很多方面来看都安全很多。

Q:  主库发送binlog,是使用内存里的copy吗?

A:  无法确定,很有可能是先从磁盘上读一份,然后发送。

Q: 既然mysql是先做数据操作、再写binlog,如果写binlog的时候失败,mysql又crash,数据怎么办?
A: 是由存储引擎决定数据。
  可以把mysql和它的存储引擎分开看,因为mysql只是一个框架,而不是一个实现。
  binlog是mysql自己的日志,而事务是由存储引擎本身保证的。
  以update为例,mysql做的事情简单分为:
  1. 修改数据update
  2. 写binlog
  注意此处的update和commit/rollback都由存储引擎实现,mysql只是站在逻辑的高度上理解这些操作。

对于innodb而言,会在提交后才开始写binlog,没提交的事务不会写binlog。然而即使是这样,innodb仍然无法保证

binlog和数据的一致性,因为innodb在写commit成功后crash,不能保证binlog被写入了磁盘。

把--innodb-support-xa设置为1,同时保证sync_binlog=1,才能保证innodb的binlog和数据一致。

实验

1. 证明对于innodb存储引擎,只有commit成功后才写日志。

mysql> show master logs;
+----------------+-----------+
| Log_name | File_size |
+----------------+-----------+
| pri_bin. | |
| pri_bin. | |
| pri_bin. | |
| pri_bin. | |
+----------------+-----------+
rows in set (0.00 sec) mysql> insert into t values();
Query OK, row affected (0.00 sec) mysql> show master logs;
+----------------+-----------+
| Log_name | File_size |
+----------------+-----------+
| pri_bin. | |
| pri_bin. | |
| pri_bin. | |
| pri_bin. | |
+----------------+-----------+
rows in set (0.00 sec) mysql> rollback;
Query OK, rows affected (0.01 sec) mysql> show master logs;
+----------------+-----------+
| Log_name | File_size |
+----------------+-----------+
| pri_bin. | |
| pri_bin. | |
| pri_bin. | |
| pri_bin. | |
+----------------+-----------+
rows in set (0.00 sec)

2. 由于innodb的这种特性,是的在binlog_format在row和statement下有不同的锁表现。

STATEMENT模式:带有范围性的修改,锁全表。例如update t set id=XXX where statement; 例如insert ... select操作会锁定源表。

ROW模式:正常行级锁。

mysql对binlog的处理的更多相关文章

  1. 【转】【MySQL】mysql 通过bin-log恢复数据方法详解

    mysql中bin-log在mysql默认状态下是没有打开的,我们要先打开mysql 开启bin-log功能,然后再通过备份的bin-log进行数据库恢复了. 具体的操作是通过mysqlbinlog这 ...

  2. mysql开启binlog

    mysql开启binlog,至于为什么要开启binlog,可以google下. ## 设置server_id,一般设置为IP server_id= ## 复制过滤:需要备份的数据库名,多个库以逗号分隔 ...

  3. MySQL的binlog数据如何查看

    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 ...

  4. 解说mysql之binlog日志以及利用binlog日志恢复数据

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...

  5. mysql 利用binlog增量备份,还原实例

    mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 标签:binlog, mysql, mysqldump, 增量备份 一,什么是增量备份 增量 ...

  6. 不小心删除数据--利用MySQL的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

  7. mysql通过binlog日志来恢复数据

    简介 在生产的过程中有这么一个业务场景:比如我在2016-11-19 09:30:00 通过mysqldump的方式备份了数据库,但是在2016-11-19 10:30:00的时候数据库崩溃了,如果通 ...

  8. 【MySQL】binlog缓存的问题和性能

    之前在没有备库的情况下,遇到过more than 'max_binlog_cache_size' bytes of storage 的错误,今天在主备复制的时候又遇到了这个问题 Last_SQL_Er ...

  9. SQL注入实验,PHP连接数据库,Mysql查看binlog,PreparedStatement,mysqli, PDO

    看到有人说了判断能否sql注入的方法: 简单的在参数后边加一个单引号,就可以快速判断是否可以进行SQL注入,这个百试百灵,如果有漏洞的话,一般会报错. 下面内容参考了这两篇文章 http://blog ...

  10. [转载]mysql的binlog安全删除

    [转载]mysql的binlog安全删除  理论上,应该在配置文件/etc/my.cnf中加上binlog过期时间的配置项,expire_logs_days = 10 但是如果没有加这一项,随着产生越 ...

随机推荐

  1. 把本地git仓库中的项目引入到码云上

    一.安装git软件和TortoiseGit客户端(git需配置环境变量,但安装时已经配置好,无需考虑) 二.生成公钥和私钥(建立与码云的连接) 三.在码云上新建项目(建议在组织的基础上)   四.在码 ...

  2. Web自动化之Headless Chrome概览

    Web自动化 这里所说的Web自动化是所有跟页面相关的自动化,比如页面爬取,数据抓取,页面内容检测,页面功能测试,页面加载性能测试,页面回归测试等等,当前主要由如下几种解决方式: 文本数据获取 这就是 ...

  3. Watson Conversation Service Implementation Methodology

    Watson Conversation Service Implementation Methodology In order to implement the WCS successfully. Y ...

  4. English Learning - Vampire bats

    " Vampire bats are very adaptable." Bambi said. And when their roosts are disrupted or the ...

  5. 如何使用SVN?

      一.什么是SVN? SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁 ...

  6. Oracle trunc()函数的用法--来着心静禅定ing

    1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值. 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date 一个日期值 fmt 日期格式,该日期将由指 ...

  7. 【JAVA】配置JAVA环境变量

    系统变量新建,添加 变量名JAVA_HOME 变量值为C:\Java\jdk版本号 修改 Path为 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

  8. Java探秘之神秘的字符串String(二)

    不可变性 String可以说是最常用的类型了,即字符串类型,String是常量(final关键词修饰的),他的值不能被创建后更改,因为字符串是不可被改变的,所以可以被用来共享. Java语言为Stri ...

  9. 使用boost/property_tree进行XML操作

    之前一直用tinyxml来进行XML文件操作,刚刚接触的一个测试项目是使用boost操作的,虽然不清楚这两者的差异,但boost使用起来还挺方便的,所以简单整理一些关于boost解析和创建XML文件的 ...

  10. join和wait

    最近看多线程的时候发现对于join的理解有些错误,在网上查了不少资料,根据自己的理解整理了一下,这里之所以把join和wait放在一起,是因为join的底层实现就是基于wait的,一并讲解更容易理解. ...