=====================================================================================

binlog_format参数介绍

  1. binlog_format
  2. mysql 5.1 版本前,所有二进制文件的格式都是基于SQL语句级别的,在mysql 5.1 版本后引入binlog_format参数,可以设置为STATEMENT\ROW\MIXED
  3.  
  4. ROW
  5. 日志中会记录成每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改。
  6.  
  7. Statement
  8. 每一条会修改数据的 SQL 都会记录到 master bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。
  9.  
  10. Mixed
  11. Mixed 模式下,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement row 之间选择一种。
    新版本中的 statment 还是和以前一样,仅仅记录执行的语句。而新版本的 MySQL 中对 row 模式也被做了优化,并不是所有的修改都会以 row 模式来记录,
    比如遇到表结构变更的时候就会以 statement 模式来记录,如果 SQL 语句确实就是 update 或者 delete 等修改数据的语句,那么还是会记录所有行的变更。
  12.  
  13. binlog_format是动态参数,可以在运行环境下进行修改,除以下几种情况外,在运行时可以动态改变 binlog 的格式:
  14. >存储流程或者触发器中间;
  15. >启用了 NDB
  16. >当前会话使用 row 模式,并且已打开了临时表;

=====================================================================================

混合格式(mixed)特点:

  1. 如果 binlog 采用了 Mixed 模式,那么在以下几种情况下会自动将 binlog 的模式由 statement 模式变为 row 模式:
  2. >当 DML 语句更新一个 NDB 表时;
  3. >当函数中包含 UUID() 时;
  4. >2个及以上包含 AUTO_INCREMENT 字段的表被更新时;
  5. >执行 INSERT DELAYED 语句时;
  6. >用 UDF 时;
  7. >视图中必须要求运用 row 时,例如建立视图时使用了 UUID() 函数;

=====================================================================================

语句格式(statement)优缺点

  1. Statement 优点
  2. 历史悠久,技术成熟;
  3. 产生的 binlog 文件较小;
  4. binlog 中包含了所有数据库修改信息,可以据此来审核数据库的安全等情况;
  5. binlog 可以用于实时的还原(操作行为),而不仅仅用于复制;
  6. 主从版本可以不一样,从服务器版本可以比主服务器版本高;
  7.  
  8. Statement 缺点:
  9. 不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候;
  10. 调用具有不确定因素的 UDF 时复制也可能出现问题;
  11. 运用以下函数的语句也不能被复制:
  12. * LOAD_FILE()
  13. * UUID()
  14. * USER()
  15. * FOUND_ROWS()
  16. * SYSDATE() (除非启动时启用了 sysdate-is-now 选项)
  17. INSERT SELECT 会产生比 RBR 更多的行级锁;
  18. 复制须要执行全表扫描 (WHERE 语句中没有运用到索引) UPDATE 时,须要比 row 请求更多的行级锁;
  19. 对于有 AUTO_INCREMENT 字段的 InnoDB 表而言,INSERT 语句会阻塞其他 INSERT 语句;
  20. 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 row 模式下,只会对那个发生变化的记录产生影响;
  21. 存储函数(不是存储流程 )在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也可能是好事;
  22. 确定了的 UDF 也须要在从服务器上执行;
  23. 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错;
  24. 执行复杂语句如果出错的话,会消耗更多资源;

=====================================================================================

行格式(row)优缺点

  1. Row 优点
  2. 任何情况都可以被复制,这对复制来说是最安全可靠的;
  3. 和其他大多数数据库系统的复制技能一样;
  4. 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多;
  5. 复制以下几种语句时的行锁更少:
  6. * INSERT SELECT
  7. * 包含 AUTO_INCREMENT 字段的 INSERT
  8. * 没有附带条件或者并没有修改很多记录的 UPDATE DELETE 语句
  9. 执行 INSERTUPDATEDELETE 语句时锁更少;
  10. 从服务器上采用多线程来执行复制成为可能;
  11.  
  12. Row 缺点
  13. 生成的 binlog 日志体积大了很多;
  14. 复杂的回滚时 binlog 中会包含大量的数据;
  15. 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 statement 只会写一次,这会导致频繁发生 binlog 的写并发请求;
  16. UDF 产生的大 BLOB 值会导致复制变慢;
  17. 不能从 binlog 中看到都复制了写什么语句(加密过的);
  18. 当在非事务表上执行一段堆积的 SQL 语句时,最好采用 statement 模式,否则很容易导致主从服务器的数据不一致情况发生;
  19. 另外,针对系统库 MySQL 里面的表发生变化时的处理准则如下:
  20. 如果是采用 INSERTUPDATEDELETE 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录;
  21. 如果是采用 GRANTREVOKESET PASSWORD 等管理语句来做的话,那么无论如何都要使用 statement 模式记录;
  22. 使用 statement 模式后,能处理很多原先出现的主键重复问题

=====================================================================================

Binlog格式与事务隔离级别

MySQL 5.1以前,Statement是Binlog的默认格式,即依次记录系统接受的SQL请求;5.1及以后,MySQL提供了Row和Mixed两个Binlog格式。

从MySQL 5.1开始,如果打开语句级Binlog,就不支持RC和Read-Uncommited隔离级别。要想使用RC隔离级别,必须使用Mixed或Row格式。
错误消息:
ERROR 1598 (HY000): Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'

由于Binlog中语句的顺序以commit为序,如果使用read commit隔离级别+语句级别binlog,主库上回话1和回话2并行执行,回话1访问数据D1,然后回话2修改数据D1为D2并提交,回话2访问D2数据,最后提交,由于binlog是串行写入,先写入回话2的BINLOG在写入回话1的BINLOG,主库BINLOG传递到从库,从库上先执行回话2的语句,再执行回话1的语句,导致回话1两次数据均为D2,因此导致主从不一致。

由于STATEMENT格式的BINLOG只记录执行SQL,而不关心具体数据变化,因此如果需要保证数据一致,就必须保证从库执行SQL时的数据状态与在主库上执行时的数据状态一致。

=====================================================================================

Binlog格式与数据加锁

在语句格式(statement)下,为保证从库执行SQL时的数据状态与在主库上执行时的数据状态一致,主要通过对数据加锁来实现。

如对于SQL语句:
INSERT INTO TB1 SELECT * FROM TB2;

虽然该SQL只是读取TB2的数据并插入到TB1中,但为防止TB2数据被其他事务修改导致主从数据差异,执行该语句时,需要对TB2的数据加锁并持续到事务提交。

摘抄自:http://blog.csdn.net/heizistudio/article/details/8616997

MySQL Binlog--binlog_format参数的更多相关文章

  1. MySQL Binlog常用参数

    ====================================================================== MySQL Binlog常用参数 log_bin 设置此参 ...

  2. 【MySQL】binlog_format以及binlog事务记录分析

    MySQL官方对于binlog_format参数的说明: http://dev.mysql.com/doc/refman/5.5/en/binary-log-setting.html binlog_f ...

  3. mysql binlog日志优化及思路

    在数据库安装完毕,对于binlog日志参数设置,有一些参数的调整,来满足业务需求或使性能最大化.Mysql日志主要对io性能产生影响,本次主要关注binlog 日志. 查一下二进制日志相关的参数    ...

  4. MySQL Binlog Mixed模式记录成Row格式

    背景: 一个简单的主从结构,主的binlog format是Mixed模式,在执行一条简单的导入语句时,通过mysqlbinlog导出发现记录的Binlog全部变成了Row的格式(明明设置的是Mixe ...

  5. Mysql binlog

    理解Mysql binlog 日志的三种模式   本文介绍下,mysql中binlog日志的三种模式,了解了各种模式的不同之处,才能更好地应用.有需要的朋友建议参考下.   一,模式1 Row Lev ...

  6. MySQL binlog相关分析

    1.redolog.binlog的简单分析 图解:redolog和binlog机制 2.开启binlog及关注点 3.关注binlog的相关参数 4.binlog模式分析 5.关于binlog的使用 ...

  7. 腾讯工程师带你深入解析 MySQL binlog

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯云数据库内核团队 发布在云+社区 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的red ...

  8. 教你MySQL Binlog实用攻略

    本文由云+社区发表 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志:其主要是用来记录对mysql数据更新或潜在发 ...

  9. MySQL Binlog详解

    MySQL Binlog详解 Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被bi ...

  10. MySQL复制 slave_exec_mode 参数IDEMPOTENT 说明

      背景: 今天无意当中看到参数slave_exec_mode,从手册里的说明看出该参数和MySQL复制相关,是可以动态修改的变量,默认是STRICT模式(严格模式),可选值有IDEMPOTENT模式 ...

随机推荐

  1. 如何在ubuntu上搭建hustoj?

    1.安装MySQL apt-get install mysql-server mysql-client 安装的过程会弹出一个框,输入sql密码,按TAB切换到ok 2.安装apache2 apt-ge ...

  2. 深入margin

    1.外边距叠加 外边距叠加是指两个垂直外边距相遇时,这两个外边距会合并成一个外边距,就是二变一,关键是叠加后的外边距会取值两个外边距最大的那个: 例子如下:创建A.B两个盒子,A定义一个margin- ...

  3. python笔记2-变量

    变量 存东西所用 #定义变量 name='feifei'#定义变量,字符串 age=18.9#整型或者小数定义变量不需要加引号 print(name) print(age) name2="w ...

  4. java语言登陆界面(菜鸟版)

    最近在看的Java入门书是<Head First Java>,一本很棒的Java书. 老师要求的程序流程图我没有,之前我们的做法是写完代码再画流程图,我想这样的做法是不对的,流程图应该是在 ...

  5. 很Low的三级菜单程序

    # -*-coding:utf-8-*- # Author:sunhao province={ '广东省':{ '深圳市':['南山区','龙岗区','福田区'], '广州市':['荔湾区','海珠区 ...

  6. 20165326 java第三周学习笔记

    纸质学习笔记 代码托管

  7. kbmMWUnidac直接SQLServer

    UniDAC支持SQLServer直联了,当时就测试过在kbmMW中用直联方式,结果不尽人意,kbmMWServer在执行sql时会出地址错误,就一直没有进一步测试.今天听xalion说,是因为当直联 ...

  8. C# EditPlus环境设置

    C# EditPlus环境设置 先要设置环境变量   5.0的 C:\Program Files\MSBuild\12.0\Bin 6.0的  C:\Windows\Microsoft.NET\Fra ...

  9. java中高级

    面试问题: 一.Java基础方面: 1.Java面相对象的思想的理解(主要是多态): http://blog.csdn.net/zhaojw_420/article/details/70477636 ...

  10. PhoneGap Vs AppCan

    首先在写这篇文章前,必须先申明一下,本人是技术出身,对HTML技术及手机客户端都有过编程经验,只是出于工作岗位的变动,便没有再具体代码工作,以下文章涉及的中间件的基本代码实现及前期的API使用,都是自 ...