MySQL Binlog--binlog_format参数
=====================================================================================
binlog_format参数介绍
- binlog_format
- 在mysql 5.1 版本前,所有二进制文件的格式都是基于SQL语句级别的,在mysql 5.1 版本后引入binlog_format参数,可以设置为STATEMENT\ROW\MIXED
- ROW
- 日志中会记录成每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改。
- Statement
- 每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。
- Mixed
- 在 Mixed 模式下,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。
新版本中的 statment 还是和以前一样,仅仅记录执行的语句。而新版本的 MySQL 中对 row 模式也被做了优化,并不是所有的修改都会以 row 模式来记录,
比如遇到表结构变更的时候就会以 statement 模式来记录,如果 SQL 语句确实就是 update 或者 delete 等修改数据的语句,那么还是会记录所有行的变更。- binlog_format是动态参数,可以在运行环境下进行修改,除以下几种情况外,在运行时可以动态改变 binlog 的格式:
- >存储流程或者触发器中间;
- >启用了 NDB;
- >当前会话使用 row 模式,并且已打开了临时表;
=====================================================================================
混合格式(mixed)特点:
- 如果 binlog 采用了 Mixed 模式,那么在以下几种情况下会自动将 binlog 的模式由 statement 模式变为 row 模式:
- >当 DML 语句更新一个 NDB 表时;
- >当函数中包含 UUID() 时;
- >2个及以上包含 AUTO_INCREMENT 字段的表被更新时;
- >执行 INSERT DELAYED 语句时;
- >用 UDF 时;
- >视图中必须要求运用 row 时,例如建立视图时使用了 UUID() 函数;
=====================================================================================
语句格式(statement)优缺点
- Statement 优点
- 历史悠久,技术成熟;
- 产生的 binlog 文件较小;
- binlog 中包含了所有数据库修改信息,可以据此来审核数据库的安全等情况;
- binlog 可以用于实时的还原(操作行为),而不仅仅用于复制;
- 主从版本可以不一样,从服务器版本可以比主服务器版本高;
- Statement 缺点:
- 不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候;
- 调用具有不确定因素的 UDF 时复制也可能出现问题;
- 运用以下函数的语句也不能被复制:
- * LOAD_FILE()
- * UUID()
- * USER()
- * FOUND_ROWS()
- * SYSDATE() (除非启动时启用了 –sysdate-is-now 选项)
- INSERT … SELECT 会产生比 RBR 更多的行级锁;
- 复制须要执行全表扫描 (WHERE 语句中没有运用到索引) 的 UPDATE 时,须要比 row 请求更多的行级锁;
- 对于有 AUTO_INCREMENT 字段的 InnoDB 表而言,INSERT 语句会阻塞其他 INSERT 语句;
- 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 row 模式下,只会对那个发生变化的记录产生影响;
- 存储函数(不是存储流程 )在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也可能是好事;
- 确定了的 UDF 也须要在从服务器上执行;
- 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错;
- 执行复杂语句如果出错的话,会消耗更多资源;
=====================================================================================
行格式(row)优缺点
- Row 优点
- 任何情况都可以被复制,这对复制来说是最安全可靠的;
- 和其他大多数数据库系统的复制技能一样;
- 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多;
- 复制以下几种语句时的行锁更少:
- * INSERT … SELECT
- * 包含 AUTO_INCREMENT 字段的 INSERT
- * 没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句
- 执行 INSERT,UPDATE,DELETE 语句时锁更少;
- 从服务器上采用多线程来执行复制成为可能;
- Row 缺点
- 生成的 binlog 日志体积大了很多;
- 复杂的回滚时 binlog 中会包含大量的数据;
- 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 statement 只会写一次,这会导致频繁发生 binlog 的写并发请求;
- UDF 产生的大 BLOB 值会导致复制变慢;
- 不能从 binlog 中看到都复制了写什么语句(加密过的);
- 当在非事务表上执行一段堆积的 SQL 语句时,最好采用 statement 模式,否则很容易导致主从服务器的数据不一致情况发生;
- 另外,针对系统库 MySQL 里面的表发生变化时的处理准则如下:
- 如果是采用 INSERT,UPDATE,DELETE 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录;
- 如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何都要使用 statement 模式记录;
- 使用 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参数的更多相关文章
- MySQL Binlog常用参数
====================================================================== MySQL Binlog常用参数 log_bin 设置此参 ...
- 【MySQL】binlog_format以及binlog事务记录分析
MySQL官方对于binlog_format参数的说明: http://dev.mysql.com/doc/refman/5.5/en/binary-log-setting.html binlog_f ...
- mysql binlog日志优化及思路
在数据库安装完毕,对于binlog日志参数设置,有一些参数的调整,来满足业务需求或使性能最大化.Mysql日志主要对io性能产生影响,本次主要关注binlog 日志. 查一下二进制日志相关的参数 ...
- MySQL Binlog Mixed模式记录成Row格式
背景: 一个简单的主从结构,主的binlog format是Mixed模式,在执行一条简单的导入语句时,通过mysqlbinlog导出发现记录的Binlog全部变成了Row的格式(明明设置的是Mixe ...
- Mysql binlog
理解Mysql binlog 日志的三种模式 本文介绍下,mysql中binlog日志的三种模式,了解了各种模式的不同之处,才能更好地应用.有需要的朋友建议参考下. 一,模式1 Row Lev ...
- MySQL binlog相关分析
1.redolog.binlog的简单分析 图解:redolog和binlog机制 2.开启binlog及关注点 3.关注binlog的相关参数 4.binlog模式分析 5.关于binlog的使用 ...
- 腾讯工程师带你深入解析 MySQL binlog
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯云数据库内核团队 发布在云+社区 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的red ...
- 教你MySQL Binlog实用攻略
本文由云+社区发表 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志:其主要是用来记录对mysql数据更新或潜在发 ...
- MySQL Binlog详解
MySQL Binlog详解 Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被bi ...
- MySQL复制 slave_exec_mode 参数IDEMPOTENT 说明
背景: 今天无意当中看到参数slave_exec_mode,从手册里的说明看出该参数和MySQL复制相关,是可以动态修改的变量,默认是STRICT模式(严格模式),可选值有IDEMPOTENT模式 ...
随机推荐
- 如何在ubuntu上搭建hustoj?
1.安装MySQL apt-get install mysql-server mysql-client 安装的过程会弹出一个框,输入sql密码,按TAB切换到ok 2.安装apache2 apt-ge ...
- 深入margin
1.外边距叠加 外边距叠加是指两个垂直外边距相遇时,这两个外边距会合并成一个外边距,就是二变一,关键是叠加后的外边距会取值两个外边距最大的那个: 例子如下:创建A.B两个盒子,A定义一个margin- ...
- python笔记2-变量
变量 存东西所用 #定义变量 name='feifei'#定义变量,字符串 age=18.9#整型或者小数定义变量不需要加引号 print(name) print(age) name2="w ...
- java语言登陆界面(菜鸟版)
最近在看的Java入门书是<Head First Java>,一本很棒的Java书. 老师要求的程序流程图我没有,之前我们的做法是写完代码再画流程图,我想这样的做法是不对的,流程图应该是在 ...
- 很Low的三级菜单程序
# -*-coding:utf-8-*- # Author:sunhao province={ '广东省':{ '深圳市':['南山区','龙岗区','福田区'], '广州市':['荔湾区','海珠区 ...
- 20165326 java第三周学习笔记
纸质学习笔记 代码托管
- kbmMWUnidac直接SQLServer
UniDAC支持SQLServer直联了,当时就测试过在kbmMW中用直联方式,结果不尽人意,kbmMWServer在执行sql时会出地址错误,就一直没有进一步测试.今天听xalion说,是因为当直联 ...
- C# EditPlus环境设置
C# EditPlus环境设置 先要设置环境变量 5.0的 C:\Program Files\MSBuild\12.0\Bin 6.0的 C:\Windows\Microsoft.NET\Fra ...
- java中高级
面试问题: 一.Java基础方面: 1.Java面相对象的思想的理解(主要是多态): http://blog.csdn.net/zhaojw_420/article/details/70477636 ...
- PhoneGap Vs AppCan
首先在写这篇文章前,必须先申明一下,本人是技术出身,对HTML技术及手机客户端都有过编程经验,只是出于工作岗位的变动,便没有再具体代码工作,以下文章涉及的中间件的基本代码实现及前期的API使用,都是自 ...