当前位置:  数据库>mysql

mysql对binlog的处理说明

    来源: 互联网  发布时间:2014-09-06

    本文导语:  然而这里不打算对某种存储引擎的实现细节进行描述,也不打算介绍各种存储引擎的优缺点,只是描述一下mysql如何处理binlog,并澄清几个容易混淆的问题。 Binlog对mysql而言是重要的,主要体现在它的功能上。Mysql官方文档明...

然而这里不打算对某种存储引擎的实现细节进行描述,也不打算介绍各种存储引擎的优缺点,只是描述一下mysql如何处理binlog,并澄清几个容易混淆的问题。
Binlog对mysql而言是重要的,主要体现在它的功能上。Mysql官方文档明确指出,binlog的启动大概会为mysql增加1%的负载,因此在绝大多数情况下,binlog都不会成为mysql的性能瓶颈。
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的含义相同。
为了解mysql写入binlog的过程,可以找一个sql语句的处理过程进行跟踪。以update为例,在最简单的情况下,mysql会先调用为存储引擎开放的接口ha_update_row,然而执行binlog_query对binlog进行写操作。这样处理的原因是,在主从备份的场景下,如果主库先写入binlog成功、在执行update的过程中crash,从库有可能执行update成功,此时主库重启之后,与从库的数据不一致。如果update操作发生在事务性的表上,在写入binlog之后会执行开放接口ha_autocommit_or_rollback,由存储引擎判断操作结果。
在主从备份的场景下,主库相当于server,从库相当于client,双方采用tcp短连接。从库发出读取日志的请求,主库接收请求、读取本地binlog、然后发送给从库。从库接收日志,进行简单校验后写本地日志,称为relay log。此处从库的流程专门由一个线程负责,称为同步io线程。从库还有一个线程,称为同步sql线程。它的行为是,定期读取relay log,解析并执行同步过来的sql语句。

下面回答几个问题:

1. binlog的格式?
二进制顺序存储,不加密,不压缩

2.binlog使用WAL吗?

No
3.主库发送binlog,是使用内存里的copy吗?

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

4. relaylog使用WAL吗?

Yes。从库接收到日志后,会先写relay log

5. binlog和relaylog的SQL是否一致?

在网络传输正确性可靠的前提下,yes

提一个问题:
既然binlog不使用WAL,那么在主从场景下,mysql异常之后,主库和从库是否会不一致呢?

之前有个问题一直没弄明白:
既然mysql是先做数据操作、再写binlog,如果写binlog的时候失败,mysql又crash,数据怎么办?
答案是由存储引擎决定数据。
可以把mysql和它的存储引擎分开看,因为mysql只是一个框架,而不是一个实现。
binlog是mysql自己的日志,而事务是由存储引擎本身保证的。
以update为例,mysql做的事情简单分为:
1. 修改数据update
2. 写binlog
3. 如果当前处理的表是一个事务性的表,则commit或rollback
注意此处的update和commit/rollback都由存储引擎实现,mysql只是站在逻辑的高度上理解这些操作。
对于事务型的引擎innodb,它本身有日志保证数据的一致性。在innodb的实现中,update修改数据之前,
会新建一个事务,并建立一个回滚点。而在innodb提供的commit/rollback接口会提交/回滚事务。
因此对innodb而言,每条SQL语句的事务,其实包含了binlog的写操作。然而即使是这样,innodb仍然无法保证
binlog和数据的一致性,因为innodb在写commit成功后crash,回滚操作不会回滚binlog。按照手册上的说法,
把--innodb-support-xa设置为1,同时保证sync_binlog=1,才能保证innodb的binlog和数据一致。

对于非事务型的引擎myisam,没有commit/rollback的机会,因此在异常情况下,数据会和binlog不一致。
那么新的问题出现了:myisam如何处理这个不一致呢?

    
 
 

您可能感兴趣的文章:

  • Mysql索引类型:Hash索引介绍及举例说明
  • mysql截取函数常用方法使用说明
  • linux 下 mysql 启动参数说明
  • mysql中的“money”类型说明
  • MySQL文本文件导入及批处理模式应用说明
  • mysql下优化表和修复表命令使用说明(REPAIR TABLE和OPTIMIZE TABLE)
  • MySQL 转义字符使用说明
  • mysql免安装制作使用说明
  • MYSQL where 1=1判定中的作用说明
  • MySQL数据库varchar的限制规则说明
  • mysql 字符集的系统变量说明
  • Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别说明
  • Mysql数据库错误代码中文详细说明
  • MySql中having字句对组记录进行筛选使用说明
  • mysql与mysqli的区别与用法说明
  • MySQL 服务器参数说明及查看 设置方法
  • Mysql字符串截取函数SUBSTRING的用法说明
  • MySQL性能分析及explain的使用说明
  • MySQL 数据库优化的具体方法说明
  • mysql安装图解 mysql图文安装教程(详细说明)
  • 比较详细的MySQL字段类型说明
  • mysql问题之slow log中出现大量的binlog dump记录的解决方法 iis7站长之家
  • MySQL C API中有没有事务处理的函数啊?
  • 修改mysql密码与忘记mysql密码的处理方法
  • MySQL的化学处理扩展 Mychem
  • MySQL 5.6 如何更改安全的处理密码探讨
  • mysql启用skip-name-resolve模式时出现Warning的处理办法
  • 请教:linux里取出mysql的数据为乱码,作了编码处理还是不行(java)
  • mysql从执行.sql文件时处理n换行的问题
  • 使用Linux的Shell脚本定时处理MySQL超时
  • 烦人:用Java操纵mySQL数据库时的中文字符处理。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • [MySQL binlog]mysql如何彻底解析Mixed日志格式的binlog
  • PHP Client for Mysql Binlog
  • mysql主从连接失败,怎样通过binlog日志恢复呢?
  • Mysql Data目录和 Binlog 目录 搬迁的方法
  • mysql手动删除BINLOG的方法
  • 使用mysql事件调度器定时删除binlog
  • mysql问题之slow log中出现大量的binlog dump记录的解决方法
  • mysql binlog二进制日志详解
  • MySQL中的binlog相关命令和恢复技巧
  • 教你自动恢复MySQL数据库的日志文件(binlog)
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • Mysql查询错误:ERROR:no query specified原因
  • MySQL 重装MySQL后, mysql服务无法启动
  • php安装完成后如何添加mysql扩展
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin
  • MySQL Workbench的下载安装与使用教程
  • 在Linux内安装了Mysql,无法进入Mysql.
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 怎样在linux终端输入mysql直接进入mysql?
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • c++中关于#include <mysql/mysql.h>的问题?
  • MySQL索引基本知识
  • mysql -u root mysql 怎么解释
  • Mysql设置查询条件(where)查询字段为NULL
  • mm.mysql那里可以下载?www.mysql.com根本下载不了。谢谢了
  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3