我可以使用自制程序代码镜像数据库中的更改吗?

时间:2012-02-14 16:05:14

标签: mysql database mirroring

我有几个需要“收听”的mysql数据库和表。我需要知道哪些数据发生了变化,并将更改发送到具有数据库本地镜像的远程服务器。

如何镜像mysql数据库中的更改?我正在考虑设置mysql触发器,将所有更改写入另一个表。此表具有数据库名称,表名称和所有列。然后我编写自定义代码来传输更改并定期在远程镜像上安装它们。这会满足我的需求吗?

3 个答案:

答案 0 :(得分:1)

您的计划是100%正确的。

这个额外的表被称为“审计”或“历史”表(有一些细微的区别,但你不应该太在意 - 但你现在有了“官方”术语,你可以用来做进一步的研究)。

如果主表有列A,B,C,那么审计还有3个:A,B,C,Operation,Changed_By,Change_DateTime(名称取决于您的口味和编码标准)。

“操作”列存储更改是插入,删除,更新的旧值还是更新的新值(通常它是3个字符宽,操作为“INS”/“DEL”/“U_D”和“U_I” “,但还有其他方法)。

审计表中的数据通过主表上的触发器填充。

然后确保Change_DateTime列上有索引。

要查找更改列表,您可以跟踪上次轮询的时间,然后只需执行

SELECT * FROM Table_Audit WHERE Change_DateTime > 'LAST_POLL_TIME'

答案 1 :(得分:1)

您可以告诉MySQL从特定时间点创建增量备份。数据仅包含自那时以来对数据库的更改。

您必须启用二进制日志记录,然后您可以使用mysqlbinlog命令导出自给定时间戳以来的更改。请参阅手册的Point-in-Time (Incremental) Recovery部分以及documentation for mysqlbinlog。具体来说,您需要--start-datetime参数。

以文本格式导出日志后,可以在其他数据库实例上执行。

答案 2 :(得分:0)

一旦你走出DBMS的机制来完成一个固有的面向数据库的任务,比如镜像,你就违反了DB的大部分属性,将它与普通文件区分开来。

特别是,您提出的机制违反了构建MySQL以确保的atomicity, consistency, isolation, and durability。例如,镜像上日志的不完整回放将使镜像处于与父DB不一致的状态。您建议的只能近似镜像,因此您应该更喜欢DBMS内在机制,除非您不关心镜像是否准确反映了父级的状态。