具有大量临时表写入的复制

时间:2008-09-22 17:23:50

标签: mysql replication

我有一个数据库,我打算为了备份原因而复制(目前性能不是问题)。

我们已正确设置复制并对其进行测试,一切正常。

然后我们意识到它复制了对临时表的所有写入,这实际上意味着对于空闲从站,复制一天的数据花费了将近两个小时。

原因是我们每隔15分钟通过cronjob重新计算数据库中的一些数据,以确保它同步(总共花费约3分钟,因此在Web请求期间执行这些操作是不可接受的;相反,我们只是存储修改而不试图在Web请求中重新计算任何内容,然后批量完成所有工作)。为了有效地处理这些数据,我们使用临时表(因为有很多相互依赖性)。

现在,第一个问题是,如果我们在处理使用该临时表的事务处理过程中重启奴隶,临时表不会持久存在。可以通过不使用临时表来避免这种情况,尽管这有其自身的问题。

更严重的问题是,如果不是所有重新计算的话,奴隶可以在不到半小时内轻松赶上(它一个接一个地进行,所以每15分钟重建数据没有任何好处......你可以直截了当地看到它,例如1115,只是为了快速赶上并在1130等等被卡住了。)

我们提出的一个解决方案是将所有重新计算移出复制的数据库,以便从服务器不会复制它。但它的缺点在于我们必须修剪它最终更新的表格,使我们的奴隶实际上“阉割”,即。在我们真正使用它之前,我们必须重新计算它上面的所有内容。

有没有人有类似的问题和/或你会如何解决?我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:3)

我想出了解决方案。它利用了Nick提到的replicate-do-db。把它写下来以防有人遇到类似的问题。

在这种情况下使用replicate-(wild-)do *选项的问题(就像我说的,我们使用临时表来重新填充中心表)是要么忽略临时表并重新填充没有数据的中心表(这会导致进一步的问题,因为依赖于中央表的所有查询都是最新的会产生不同的结果),或者您忽略了具有类似问题的中央表。更不用说,你必须在将任何这些选项添加到my.cnf后重新启动mysql。我们想要的东西可以覆盖所有这些情况(以及未来的情况)而无需进一步重启。

因此,我们决定将数据库拆分为“真实”和“工作区”数据库。只复制“真实”数据库(我猜你可以决定用于复制 - 野生表格语法的表名约定。)

所有的临时表工作都发生在“workarea”db中,为了避免上面提到的依赖问题,我们不会通过INSERT ... SELECT或RENAME填充中心表(位于“真正的”db中)表,而是查询tmp表以在活动表上生成一种差异(即为新行生成INSERT语句,为旧行生成DELETE并在必要时更新)。

这样,复制的唯一查询就是所需的更新,没有别的,即。一些(大多数?)重新计算查询每十五分钟就会出现问题,甚至可能无法进入奴隶状态,那些做起来很少且计算成本也不高的只是简单的INSERT和DELETE。

答案 1 :(得分:2)

在MySQL中,从5.0开始,我相信,您可以使用表通配符来复制特定的表。可以设置许多命令行选项,但您也可以通过MySQL配置文件来执行此操作。

[mysqld]
replicate-do-db    = db1
replicate-do-table = db2.mytbl2
replicate-wild-do-table= database_name.%
replicate-wild-do-table= another_db.%

这个想法是你告诉它不要复制你指定的表以外的任何表。