--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后,从库停止复制,报出的错误信息:

  1. 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.
  2. 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; .
  3. 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成功后才写日志。

  1. mysql> show master logs;
  2. +----------------+-----------+
  3. | Log_name | File_size |
  4. +----------------+-----------+
  5. | pri_bin. | |
  6. | pri_bin. | |
  7. | pri_bin. | |
  8. | pri_bin. | |
  9. +----------------+-----------+
  10. rows in set (0.00 sec)
  11.  
  12. mysql> insert into t values();
  13. Query OK, row affected (0.00 sec)
  14.  
  15. mysql> show master logs;
  16. +----------------+-----------+
  17. | Log_name | File_size |
  18. +----------------+-----------+
  19. | pri_bin. | |
  20. | pri_bin. | |
  21. | pri_bin. | |
  22. | pri_bin. | |
  23. +----------------+-----------+
  24. rows in set (0.00 sec)
  25.  
  26. mysql> rollback;
  27. Query OK, rows affected (0.01 sec)
  28.  
  29. mysql> show master logs;
  30. +----------------+-----------+
  31. | Log_name | File_size |
  32. +----------------+-----------+
  33. | pri_bin. | |
  34. | pri_bin. | |
  35. | pri_bin. | |
  36. | pri_bin. | |
  37. +----------------+-----------+
  38. 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. centos 7 安装MySQL 5.6

    本文根据mysql的官方文档操作:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/ 由于Centos7 默认数据库是mariabd(网上 ...

  2. NEWS-包名-baseTest-类名-baeseDao

    package baseTest; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedS ...

  3. Chrome浏览器扩展开发系列之十:桌面通知Notification

    Desktop Notification也称为Web Notification,是在Web页面之外,以弹出桌面对话框的形式通知用户发生了某事件.Web Notification于2015.9.10成为 ...

  4. Dev控件学习-GridControl中的BandGridview导出多层行头操作

    BandGridview默认导出的是Columns的列头信息,而不是Bands的列头信息,为了实现导出多层行头.代码如下 public static void ExportExcel2(DevExpr ...

  5. dbgrid数据显示和数据源不同

    dbgrid数据显示和数据源不同,在ODBC配置时如下设置,去掉勾

  6. JavaScript一个拖动元素的实例

    <script type="text/javascript" src="./whenReady.js"></script> <bo ...

  7. Python-Flask:利用flask_sqlalchemy实现分页效果

    Flask-sqlalchemy是关于flask一个针对数据库管理的.文中我们采用一个关于员工显示例子. 首先,我们创建SQLALCHEMY对像db. from flask import Flask, ...

  8. 输入三个整数x、y、z,请把这三个数由小到大输出

    题目:输入三个整数x,y,z,请把这三个数由小到大输出. 程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x> y则将x与y的值进行交换,然后再用x与z进行比较,如果x> ...

  9. Palindrome 回文数

    回文数,从前到后,从后到前都一样 把数字转成字符串来处理 package com.rust.cal; public class Palindrome { public static boolean i ...

  10. 使用JDBC技术连接数据库(附源码)--JAVA的简单应用

    一.创建数据库(以mysql数据库为例) mysql数据库的下载安装与配置 -可参考博主之前的随笔:Windows平台下搭建MySQL数据库 创建wxb数据库-create database wxb; ...