MySQL中的行复制

MySQL基于行的复制可以最大化保证主从复制的一致性,对于RBR(基于行复制) 和SBR(基于语句复制),相信大家已经很熟知,下面记录的是行复制在二进制日志总记录的情况。

基于行的复制是与位置相关的,binlog里面只记录相关表发生改变的列的数据。其中引入了四个新的事件: Table_map, Write_rows,Delete_rows,Update_rows.

一条语句执行后,在binlog里面,Table_map事件中包含表ID,和列的类型(没有列名,slave 可以利用这些信息对比和master上的表结构是否一致),后面跟着其他三个事件,结束标志为STMT_END_F.

事件在slave 端执行过程:

1、SQL线程从中继日中读取各个事件。

2、对与Table_map事件,SQL线程将提取出表信息,保存表的定义

3、锁定要改变的表,并检查master和slave上表结构是否一致。

4、如果表schema不一致,则停止复制,否则继续执行行事件,直至遇到结束标志符:STMT_END_F.

本栏目更多精彩内容:http://www.bianceng.cn/database/MySQL/

对于Update_rows和Delete_rows事件,SQL线程要先定位到具体的行,查找操作的步骤:

1、主键或者

优先选择slave上的主键。这是最好的办法。当找到匹配的主键值的时候,就认为已经找到匹配的行,行的其他列的内容则不去匹配。

2、非空唯一索引扫描

这个也只比较键值

3、其他索引或者全表扫描

此时会比较整个行的数据在master和slave上是否一致(确实能保证主从复制的一致性,但也是最慢的)

具体测试数据请参考

http://www.mysqlops.com/2011/06/07/mysql-replication-data-consistency.html

时间: 2024-10-02 13:23:12

MySQL中的行复制的相关文章

MySQL中的行级锁、表级锁、页级锁_Mysql

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 一.行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.行级锁分为共享锁 和 排他锁. 特点 开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也

MySQL中的行级锁,表级锁,页级锁

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.行级锁分为共享锁和排它锁(MySQL中的共享锁与排他锁) 特点 开销大,加锁慢:会出现死锁:锁定粒度最小,

mysql中insert...select复制表数据

语法 INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name 实例 可以运行insert...select语法解决问题: insert into hotel_ktv (title,price, number,date,area,content,num) select title,price,number,date,area,content,num from hotel_ktv; 查看结果  代码如下 复制代码

在MySQL中使用GTIDs复制协议和中断协议的教程

  MySQL5.6有很多新的特性,其中很多人都感兴趣的一条就是全局事务序号功能(GTIDs).而大家都对这一特性很感兴趣的原因也很好理解,即:本来重新连接从服务器和一个新的主服务器一直是件很麻烦的事,然而在启用GTIDs功能之后就变得简单易行.可是,GTIDs的使用不单单是用单独的标识符替换旧的二进制日志文件/位置,它也采用了新的复制协议.假如你还不太明白这些,那你可以在这篇文章里学点什么. 复制协议:新的 VS 旧的 旧的协议往往简单直接即:首先从服务器上在一个特定的偏移量那里连接到一个给定

mysql中数据表复制语句(表结构、表数据)

1.复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable;来删除. 不过这种方法的一个最不好的地方就是新表中没有了旧表的primary key.Extra(auto_increment)等属性.需要自己用"alter"添加,而且容易搞错. 2.只复制表结构到新表 CREATE TABLE 新表 SELECT * FROM 旧表WHERE 1=2

在MySQL中使用GTIDs复制协议和中断协议的教程_Mysql

 MySQL5.6有很多新的特性,其中很多人都感兴趣的一条就是全局事务序号功能(GTIDs).而大家都对这一特性很感兴趣的原因也很好理解,即:本来重新连接从服务器和一个新的主服务器一直是件很麻烦的事,然而在启用GTIDs功能之后就变得简单易行.可是,GTIDs的使用不单单是用单独的标识符替换旧的二进制日志文件/位置,它也采用了新的复制协议.假如你还不太明白这些,那你可以在这篇文章里学点什么.复制协议:新的 VS 旧的 旧的协议往往简单直接即:首先从服务器上在一个特定的偏移量那里连接到一个给定的二

mysql中实现行号,oracle中的rowid

  mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber.   MYSQL中变量定义可以用 set @var=0 或 set @var:=0   可以用=或:=都可以,但是如果变量用在其他语句中,如:select那么必须用:=,因为=会被当作一个比较符号   1 select @rownum:=@rownum+1 as rownum, b.* from (select @rownum:=0) a, b   这个很有用哦,比如要取到排名好多的. 转自:http://s

MySQL中存储程序、函数、触发程序以及复制

MySQL 5.1存储程序和函数对复制起作用吗? 是的,在存储程序和函数中被执行标准行为被从主MySQL服务器复制到从服务器. 在主服务器上创建的存储程序和函数可以被复制到从服务器上么? 是的,通过一般DDL语句执行的存储程序和函数,其在主服务器上的创建被复制到从服务器,所以目标 将存在两个服务器上.对存储程序和函数的ALTER 和DROP语句也被复制. 行为如何在已复制的存储程序和函数里发生? MySQL纪录每个发生在存储程序和函数里的DML事件,并复制这些单独的行为到从服务器.执行存储程 序

MySQL中存储程序、函数、触发程序以及复制知识大全

MySQL 5.1存储程序和函数对复制起作用吗? 是的,在存储程序和函数中被执行标准行为被从主MySQL服务器复制到从服务器. 在主服务器上创建的存储程序和函数可以被复制到从服务器上么? 是的,通过一般DDL语句执行的存储程序和函数,其在主服务器上的创建被复制到从服务器,所以目标将存在两个服务器上.对存储程序和函数的ALTER 和DROP语句也被复制. 行为如何在已复制的存储程序和函数里发生? MySQL纪录每个发生在存储程序和函数里的DML事件,并复制这些单独的行为到从服务器.执行存储程序和函