4

我需要做一些mysql复制。一些信息:

  • 我有两个数据库实例,在共享主机中,所以我不能使用 Mysql 复制(我无权访问配置文件)。
  • 这是一个非营利项目(教育),所以我们买不起自己的服务器。
  • 如果主服务器宕机了几分钟,这通常并没有那么糟糕,但是在某些特定的日子里,我们真的需要一个备份解决方案,与主服务器同步(网站的时间限制事件)。

现在系统在每个表的每一行都使用一个修订号,我们定期检查这些数字的修改(并更新相应的行)。这很慢。

我在想的是每个 SELECT/INSERT/UPDATE 查询都记录在一个特定的表中,并且“从服务器”会定期向“主服务器”询问该表的内容并应用相应的查询。

你对这个想法有什么看法?

我知道这并不完美,在传播所有查询之前服务器可能已关闭,但我想尽量减少可能的问题,尽可能少的代码行。

实现它的最佳方法是什么?

  • 在 php 代码中,在每个 SELECT/INSERT/UPDATE 上,我都可以在特定表中进行其他插入(我只是插入查询)
  • 带触发器?
4

2 回答 2

3

我成功地结合使用触发器和联合表来模拟数据从一台服务器上的 MyISAM 表复制到共享主机环境中另一台服务器上的 MyISAM 表。

我的主表上的任何插入/更新/删除都通过 AFTER INSERT / AFTER UPDATE / AFTER DELETE 触发器复制到同一台服务器上的联合表。然后,该联合表将更改推送到不同服务器上的表。

我不能因为提出这种方法而受到赞扬,因为RolandoMySQLDBA在 Server Fault 上非常有帮助地记录了它:
MySQL 存储过程能够插入/更新到远程备份 MySQL 服务器吗?.

以下是我实施的步骤:

在 SERVER2...

  • 我创建了一个表(我们称之为slave_table ),其中的列与 SERVER1 上的主表(我们称之为 master_table )中的列相 匹配

在 SERVER1...

  • 我创建了一个表(我们称之为federated_table),其中的列与master_table中的列匹配,指定了一个 FEDERATED存储引擎和一个CONNECTION字符串来引用SERVER2 上的slave_table ... CONNECTION='mysql://username:password@SERVER2:port/database/slave_table';

  • 我分别添加了AFTER INSERT,AFTER UPDATEAFTER DELETE触发器到 master_table,其中包含 SQL 命令到
    INSERT INTO federated_table VALUES (NEW.id,NEW.title);...
    UPDATE federated_table SET id=NEW.id,title=NEW.title WHERE id=OLD.id;
    DELETE FROM federated_table WHERE id=OLD.id;

我希望这对处于类似情况的人有所帮助。

于 2013-03-24T20:10:51.330 回答
1

两个想法:

  1. 一个 cron,它在备份数据库表中找到 max(ID),然后获取主数据库中除此之外的所有记录。

  2. 要包含我评论中的建议,请将您的写入直接复制到第二个数据库,而不是将查询写入表。这可能会导致一些开销,但可能是最容易实现的。

于 2012-02-09T19:48:14.203 回答