SBR,基于语句的复制。当default database(use db_name)和binlog-do-db参数配置的库一致时,执行的语句全部被binlog,而不管该语句执行的更改是针对哪个数据库。
比如:
--binlog-do-db=sales
基于语句的复制,下面的语句:
USE sales; #指定默认数据库为sales,和binlog-do-db参数配置的库一致
UPDATEprices.discounts SET percentage = percentage + 10; #这条语句要被binlog,尽管其更新的是prices数据库。
但是对于下面的语句:
USE prices; #指定默认数据库为prices,和binlog-do-db参数配置的库不一致
UPDATEsales.january SET amount=amount+1000; #这条语句不会被binlog,尽管其更新的是binlog-do-db参数配置的库。
RBR,基于行记录的复制。只要是更改binlog-do-db参数配置的库下的对象,这样的语句都要被binlog,而不管defaultdatabase(use db_name)和binlog-do-db参数配置的库是否一致。
比如:
--binlog-do-db=sales
基于行记录的复制,下面的语句:
USE prices; #指定默认数据库为prices,虽然和binlog-do-db参数配置的库不一致
UPDATEsales.january SET amount=amount+1000; #这条语句要被binlog,因为其更新的是binlog-do-db参数配置的库。
但是对于下面的语句:
USE sales; #指定默认数据库为sales,和binlog-do-db参数配置的库一致
UPDATEprices.discounts SET percentage = percentage + 10; #这条语句不会被binlog,因为其更改的不是binlog-do-db参数配置的库。
MBR
对于基于混合模式的呢?混合模式,mysql是优先采用RBR,而RBR无法有效保证复制成功时,自动转换为SBR。
说错了,是优先采用SBR,当SBR无法保证时,自动转换为RBR。
同参数binlog-do-db一样,SBR和RBR有不同的表现。
SBR,基于语句的复制。当default database(use db_name)和binlog- ignore -db参数配置的库一致时,执行的语句全部不会被binlog,而不管该语句执行的更改是针对哪个数据库。
比如:
--binlog- ignore-db=sales
基于语句的复制,下面的语句:
USE sales; #指定默认数据库为sales,和binlog- ignore -db参数配置的库一致
UPDATEprices.discounts SET percentage = percentage + 10;
UPDATEsales.january SET amount=amount+1000; #这两条语句都不会被binlog,因为当前default database 和binlog- ignore -db参数配置的库一致。
RBR,基于行记录的复制。只要是更改binlog- ignore -db参数配置的库下的对象,这样的语句都不会被binlog,而不管defaultdatabase(use db_name)和binlog- ignore -db参数配置的库是否 一致。
比如:
--binlog- ignore-db=sales
基于行记录的复制,下面的语句:
USE prices; #指定默认数据库为prices,虽然和binlog- ignore -db参数配置的库不一致
UPDATEsales.january SET amount=amount+1000; #这条语句不会被binlog,因为其更新的是binlog- ignore -db参数配置的库。
SBR,基于语句的复制。当主库的binlog的default database(use db_name)和replicate-do-db参数配置的库一致时,语句全部要被重演,而不管这些语句实际更改的是哪个数据库。
比如:
replicate-do-db=sales
基于语句的复制,下面的语句:
USE sales; #指定默认数据库为sales,和replicate-do-db参数配置的库一致
UPDATEprices.discounts SET percentage = percentage + 10;
UPDATEsales.january SET amount=amount+1000; #这两条语句都会被重演,因为当前defaultdatabase 和replicate-do-db参数配置的库一致。
但是下面的语句:
USE prices; #指定默认数据库为prices,和replicate-do-db参数配置的库不一致
UPDATEsales.january SET amount=amount+1000; #这条语句不会被重演,尽管其更新的是replicate-do-db参数配置的库。
RBR,基于行记录的复制。只要语句实际更改的数据库和replicate-do-db参数配置的库一致,则实施重演,而不管当前的default database是哪个。
比如:
replicate-do-db=sales
基于行记录的复制,下面的语句:
USE sales; #指定默认数据库为sales,和replicate-do-db参数配置的库一致
UPDATEprices.discounts SET percentage = percentage + 10; #这条语句不会被重演,因为其更新是prices库, 和replicate-do-db参数配置的库不一致。
UPDATEsales.january SET amount=amount+1000; #这两条语句都会被重演
并且下面的语句:
USE prices; #指定默认数据库为prices,和replicate-do-db参数配置的库不一致
UPDATEsales.january SET amount=amount+1000; #这条语句也会被重演,因为其更新的是replicate-do-db参数配置的库。
表级过滤,所以仅仅能过滤表。replicate-do-table=db_name.tbl_name,告诉SQL线程仅仅重演db_name.tbl_name表的更改。
这与SBR和RBR无关。
SBR,基于语句的复制。当主库的binlog的default database(use db_name)和replicate-ignore-db参数配置的库一致时,语句全部不会被重演,而不管这些语句实际更改的是哪个数据库。
比如:
replicate- ignore-db=sales
基于语句的复制,下面的语句:
USE sales; #指定默认数据库为sales,和replicate- ignore -db参数配置的库一致
UPDATEprices.discounts SET percentage = percentage + 10;
UPDATEsales.january SET amount=amount+1000; #这两条语句都不会被重演,因为当前defaultdatabase 和replicate- ignore-db参数配置的库一致。
但是下面的语句:
USE prices; #指定默认数据库为prices,虽然和replicate- ignore -db参数配置的库不一致
UPDATEsales.january SET amount=amount+1000; #这条语句也不会被重演
RBR,基于行记录的复制。只有实际更改的数据库和replicate- ignore -db参数配置的库一致的语句,才不实施重演,而不管当前的default database是哪个。
比如:
replicate- ignore-db=sales
基于行记录的复制,下面的语句:
USE sales; #指定默认数据库为sales,和replicate-do-db参数配置的库一致
UPDATEprices.discounts SET percentage = percentage + 10; #这条语句不会被重演,因为其更新是prices库, 和replicate-do-db参数配置的库不一致。
UPDATEsales.january SET amount=amount+1000; #这两条语句都会被重演
并且下面的语句:
USE prices; #指定默认数据库为prices,和replicate-do-db参数配置的库不一致
UPDATEsales.january SET amount=amount+1000; #这条语句也会被重演,因为其更新的是replicate-do-db参数配置的库。
表级过滤,所以仅仅能过滤表。replicate-ignore-table=db_name.tbl_name,告诉SQL线程db_name.tbl_name表的更改不重演。
这与SBR和RBR无关。并且如果,一个语句更新了db_name.tbl_name和其他表,那么这条语句同样不会被重演。
replicate-rewrite-db="olddb->newdb",slave把use olddb替换为 use newdb,只有针对表操作的语句才有效(不包括create database,drop database,alter database),并且olddb必须是master的默认数据库(use 指定)。该选项不会重写语句。不支持跨库更新。
replicate-wild-do-table:类似数据库like方式指定多个匹配的表,行为类似replicate-do-table。
replicate-wild-ignore-table:类似数据库like方式指定多个匹配的表,行为类似replicate-ignore-table。