因为SQL线程只根据默认数据库去判断是否需要复制,发现默认的数据库不是sales则下面的所有SQL都不会执行。
基于行的复制(Row-based replication):基于行的复制则与基于语句的复制恰恰相反,SQL线程不关系默认库是什么只关心sql语句是否影响了指定的数据库,如果slave设置为--replicate-do-db=sales,那么下面的语句会更新sales库中的february表:
USE prices;
UPDATE sales.february SET amount=amount+1000;
这种策略会带来一些小副作用,例如下面的sql:
USE db1;
UPDATE db1.table1 SET col1 = 10, db2.table2 SET col2 = 20;
如果此时slave设置为--replicate-do-db=db1,那么不只是db1.table1表会发生变化,db2.table2也会发生变更。
综上所述,考虑到数据库复制,跨数据库的sql一定要谨慎了。
11,--replicate-ignore-db=db_name
在slave上创建过滤器,指定忽略哪些数据库,在5.7.3及以后的版本可以使用CHANGE REPLICATION FILTER REPLICATION_IGNORE_DB命令创建,不同格式的binlog的规则与--replicate-do-db=db_name类似。
12,--replicate-do-table=db_name.tbl_name
创建表级别的复制过滤器,告诉SQL线程那个库的那些表需要复制,不管是跨数据库的更新还是默认数据的更新都起作用,在5.7.3及以后的版本可以使用 CHANGE REPLICATION FILTER REPLICATION_DO_TABLE命令创建。只对sql语句起作用,对数据库中的其他对象例如存储程序不起作用。
13,--replicate-ignore-table=db_name.tbl_name
创建忽略哪些表的过滤器,跨数据库更新依然有效,在5.7.3及以后的版本可以使用CHANGE REPLICATION FILTER REPLICATION_IGNORE_TABLE命令创建。只对sql语句起作用,对数据库中的其他对象例如存储程序不起作用。