在忽略的表上使用UPDATE JOIN进行Mysql复制

use*_*654 -33 mysql replication

我正在做mysql复制,作为一个愚蠢的例子,我有两个表,tableAtableB.

在slave上进行复制,tableA允许并被tableB忽略.

replicate-do-table='dbname.tableA'
Run Code Online (Sandbox Code Playgroud)

在主服务器上,正在进行此查询(我无法对主服务器进行任何更改):

UPDATE tableA as a LEFT JOIN tableB as b ON b.type = a.type
SET b.col1 = CONCAT(IFNULL(a.col1,''),'|',IFNULL(a.col2,''))
Run Code Online (Sandbox Code Playgroud)

显然我可以tableB在slave上创建并让它更新一个伪表,但是这个表特别是一个用于搜索的内存表,并且几乎不断更新导致大量浪费的资源.

有没有办法让我从复制过滤掉这些更新,同时仍然保持tableA?我无法访问主服务器,但是如果这是一个不会影响系统运行方式的更改,我可以要求他们进行更改.

Wri*_*ken 11

选项AFAIK主要基于使复制ROW基于而不是STATEMENT基于复制.

  1. 将默认值设置为ROW(这是一种强力方法,并且有其缺点).
  2. 您可以将SESSIONbinlog_format 设置为ROW,但它需要SUPER用户可能没有的权限,并且由于充分的理由不会被授予.
  3. 如果日志以MIXED格式发生,您可以在此处查看以强制ROW在binlog中基于条目,尝试强制无用FOUND_ROWS()UUID()在更新中调用可能很好地触发它.

MIXED解决方案的示例:查询:

INSERT INTO sometable VALUES ('a','aa');
UPDATE sometable SET aa='bb';
UPDATE sometable SET aa='cc' WHERE UUID(); -- slight overhead, but always true
Run Code Online (Sandbox Code Playgroud)

日志(使用mysqlbinlog来检查它),显然STATEMENT基于前2个,但ROW基于第3个:

# at 175
#130918 21:18:25 server id 1  end_log_pos 277   Query   thread_id=142   exec_time=0     error_code=0
use `test`/*!*/;
SET TIMESTAMP=1379531905/*!*/;
INSERT INTO sometable VALUES ('a','aa')
/*!*/;
# at 277
#130918 21:18:25 server id 1  end_log_pos 304   Xid = 488
COMMIT/*!*/;
# at 304
#130918 21:18:52 server id 1  end_log_pos 372   Query   thread_id=142   exec_time=0     eror_code=0
SET TIMESTAMP=1379531932/*!*/;
BEGIN
/*!*/;
# at 372
#130918 21:18:52 server id 1  end_log_pos 463   Query   thread_id=142   exec_time=0     error_code=0
SET TIMESTAMP=1379531932/*!*/;
UPDATE sometable SET aa='bb'
/*!*/;
# at 463
#130918 21:18:52 server id 1  end_log_pos 490   Xid = 497
COMMIT/*!*/;
# at 490
#130918 21:21:06 server id 1  end_log_pos 558   Query   thread_id=144   exec_time=0     error_code=0
SET TIMESTAMP=1379532066/*!*/;
BEGIN
/*!*/;
# at 558
# at 610
#130918 21:21:06 server id 1  end_log_pos 610   Table_map: `test`.`sometable` mapped to number 180
#130918 21:21:06 server id 1  end_log_pos 664   Update_rows: table id 180 flags: STMT_END_F
BINLOG '
Iv05UhMBAAAANAAAAGICAAAAALQAAAAAAAEABHRlc3QACXNvbWV0YWJsZQAC/A8DAwYAAQ==
Iv05UhgBAAAANgAAAJgCAAAAALQAAAAAAAEAAv///QJiYv0CY2P8AQAAYQJiYvwBAABhAmNj
'/*!*/;
# at 664
#130918 21:21:06 server id 1  end_log_pos 691   Xid = 578
COMMIT/*!*/;
DELIMITER ;
# End of log file
Run Code Online (Sandbox Code Playgroud)