【问题标题】:Can I mirror changes in a database with homebrew code?我可以使用自制代码镜像数据库中的更改吗?
【发布时间】:2012-02-14 16:05:13
【问题描述】:

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

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

【问题讨论】:

  • 如当前答案所示,使用 DBMS 之外的机制来处理诸如复制之类的数据库任务肯定会被破坏。
  • @msw 我的回答怎么破?它不在数据库之外。
  • @jterrace 提出的问题被破坏了,因为它试图使用非数据库机制来完成任务。我对问题进行了编辑,以更准确地反映所描述内容的语义。
  • @msw 当然,但我的回答是没有坏了。这是一种完全有效的复制方式,使用数据库机制本身。

标签: mysql database mirroring


【解决方案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'

【讨论】:

    【解决方案2】:

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

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

    一旦您以文本格式导出日志,您就可以在另一个数据库实例上执行它。

    【讨论】:

      【解决方案3】:

      一旦您跳出 DBMS 的机制来完成一个固有的面向 DB 的任务(如镜像),您就违反了 DB 区别于普通文件的大部分属性。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 2018-05-12
        • 2016-12-04
        • 2017-01-07
        • 1970-01-01
        • 1970-01-01
        • 2016-05-01
        相关资源
        最近更新 更多