2016-09-20 64 views
0

我碰到这个问题,前几天来了,一直修修补补与 - 和琢磨一下几种不同的方法,但我似乎无法找到一个很好的答案:MySQL的复制/同步:从主清除而不是从奴隶

我有两个MySQL服务器,一个主/热和一个从/档案。所有写入请求都发送给主设备,并且还将(最终)复制/复制到从设备。然而,在一段时间(比如说一个星期)之后,主人中的证明数据会变得“陈旧”,然后被清除,从而使主人的桌子变短。然而这个清除不应该影响从属。我该如何着手解决这个问题?

本质上,我的主数据库的行为有点像“热”数据库,其中数据是新鲜的,一旦变老就会被清除。它应该包含用户可能需要的数据,因此我们希望保持表格的小巧。另一方面,我的奴隶更像是一个存档,它应该包含所有数据,不管“热度”如何。对从机的查询不需要快速执行,从机数据可能会滞后几分钟,但它需要包含自我们开始以来的所有记录。

  • 我最初的想法是利用普通的复制,但我可以以某种方式过滤某些查询,不影响奴隶?我正在考虑创建一个清除查询,该查询从主服务器删除旧数据,但不影响从服务器。从阅读MySQL文档看来,这种过滤似乎只能在数据库或Tabel级别上完成。

  • 另一个想法是通过外部应用程序来完成此操作,并手动从主服务器中选择数据并将其插入从服务器,然后使用一些巧妙的逻辑来决定要选择的数据。这适用于日志表,它只会添加数据,但对于表示状态的表(如用户设置)不起作用。这种方法可能还会包含很多特殊情况,因为我无法找到描述数据库中所有表的好的一致方式(有日志表,状态表,配置表和一些我无法真正分类的表) )。

这些方法都不是以简单的方式解决问题,但我觉得我不能成为第一个有这个问题的人。任何想法都欢迎,并提前致谢。

如果需要更多的信息,随意评论,我会在

回答

1

只要使用正规的复制编辑。当您删除的主数据,你在同一个会话

SET sql_log_bin = 0; 
DELETE FROM my_table WHERE whatever = true; 
SET sql_log_bin = 1; 

做到这可以防止这些语句被写入二进制日志。因此它不会被复制到奴隶。

  • 阅读更多关于它here
+0

如果我理解正确这,我应该通过SET SESSION SQL_LOG_BIN = 0调用该方法,对吗?我只希望purging命令不被记录,所有其他并发查询仍应记录。 – Gikkman

+0

是的,它这样做。它只会阻止此会话中的语句不被记录。其他会议的发言不受影响。 – fancyPants

+0

好吧,我会用这个做一些测试,如果它能解决问题,我会返回并标记为正确的:-) – Gikkman