use*_*654 -33 mysql replication
我正在做mysql复制,作为一个愚蠢的例子,我有两个表,tableA和tableB.
在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基于复制.
ROW(这是一种强力方法,并且有其缺点).SESSIONbinlog_format 设置为ROW,但它需要SUPER用户可能没有的权限,并且由于充分的理由不会被授予.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)
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |