MySQL binlog_format中sbr 和rbr(Statement-Based and Row-Based Replication)的优缺点

Advantages of statement-based replication

1 技术成熟

2 对于大量的更新删除等操作,仅仅会写入少量的变更结果,加速日志获取或者备份的速度

3 日志文件包含了所有更改的语句,可以用来做验证数据库

Disadvantages of statement-based replication

1.1 在UDF自定义函数中的语句
1.2 在DELETE和UPATE中没有使用order by 进行限制的字句
1.3 以下函数不能在语句格式中进行复制 load_file() uuid() user() found_rows() 等,now()函数除外
1.4 相比行格式,insert ...select 需要更多的行级锁
1.5 相比行格式,update语句需要锁住大量的行来进行表扫描
1.6 对于InnoDB:使用AUTO_INCREMENT会阻塞其他不冲突的INSERT语句
1.7 在复杂的语句中,行被更新或者插入之前,在从服务器上会对语句进行评估和执行。如果是行复制,从服务器只需要更改受影响的行而不需要去处理所有的表
1.8 在从库执行复杂语句中,由于评估错误,随着时间的超时,会对行的影响慢慢增多
1.9 存储函数使用跟调用函数相同的now()时候,并不是存储过程真实的情况
2.1 确定性UDF必须应用在从属上。
2.2 主和从的表的定义必须要一致
时间: 2024-11-07 20:36:48

MySQL binlog_format中sbr 和rbr(Statement-Based and Row-Based Replication)的优缺点的相关文章

JAVA调用mysql数据操作时出现错误:impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.'

使用mysql做持久化报错:Cannot execute statement: impossible to write to binary log since BINLOG_FORM ActiveMQ中如果使用mysql innodb的同时,开启了binlog,那么在ack消息的时候,日志里就可会报错:java.sql.SQLException: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATE

使用sqoop将MySQL数据库中的数据导入Hbase

使用sqoop将MySQL数据库中的数据导入Hbase 前提:安装好 sqoop.hbase. 下载jbdc驱动:mysql-connector-java-5.1.10.jar 将 mysql-connector-java-5.1.10.jar 拷贝到 /usr/lib/sqoop/lib/ 下 MySQL导入HBase命令: sqoop import --connect jdbc:mysql://10.10.97.116:3306/rsearch --table researchers --h

【20180507】MySQL主从在线修改从库binlog格式从STATEMENT更改成ROW格式

需求 公司内部有几十套基于传统复制的MySQL主从实例,而且binlog的格式都是STATEMENT格式.在接手这些MySQL主从实例之后就有考虑过想将binlog格式更改成ROW格式.而这次则是因为我们elk上面一个第三方工具需要解析和监听binlog信息,并且只能解析ROW格式的binlog,借此机会正好将公司部分MySQL主从复制实例的binlog格式更改成ROW格式. ROW和STATEMENT比对 row格式 优点:就是能够完全保证主从数据的一致性,不会出现因为在SQL中使用MySQL

MySQL数据库中的算术运算符

MySQL数据库中的算数运算符 MySQL数据库中的算术运算符 一.运算符的概述: 运算符在MySQL数据库中也是很重要的知识体,在执行sql语句的时候这个运算符对操作数据帮助很大.其中运算符的运用可以帮助你减省大量的时间,操作起来也比较灵活. 二.运算符 运算符主要包括"算数运算符"."比较运算符"."罗运算符"."位运算符"四大类,下面我们就一次学习一下. 1.算术运算符 算术运算符在sql语句的时候经常使用,例如对表的字

在mysql语句中为什么要加反引号

在MySQL语句中我们有时候经常会遇到反引号(``),刚开始的时候不知道什么意思,他是什么作用呢? Select * from `member` order by posts desc limit 0,10; 它是为了区分MYSQL的保留字与普通字符而引入的符号. 举个例子:SELECT `select` FROM `test` WHERE select='字段值' 在test表中,有个select字段,如果不用反引号,MYSQL将把select视为保留字而导致出错,所以,有MYSQL保留字作为

Mysql存储过程中使用cursor

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

查看MYSQL数据库中所有用户及拥有权限

查看MYSQL数据库中所有用户 mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; 查看数据库中具体某个用户的权限mysql> show grants for 'cactiuser'@'%';

清除mysql表中数据

delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容. 效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据. delete的效果有点像将mysql表中所有记录一条一条删除到删完, 而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表.

在MySQL字段中使用逗号分隔符

大多数开发者应该都遇到过在mysql字段中存储逗号分割字符串的经历,无论这些被分割的字段代表的是id还是tag,这个字段都应该具有如下几个共性. 被分割的字段一定是有限而且数量较少的,我们不可能在一个字符串中存储无限多个字符 这个字段所属的表与这个字段关联的表,一定是一对多的关系 比如下面这个表结构所代表的content与tag这两个对象 mysql> SELECT * FROM content; +----+------+ | id | tags | +----+------+ | 1 | 1