【问题标题】:Ideas for synchronizing records programmatically以编程方式同步记录的想法
【发布时间】:2012-09-15 12:36:27
【问题描述】:

我需要在本地和远程数据库之间同步记录,比如客户列表。两侧的数据库具有相同的结构。我考虑过使用某种标记(日期字段、字段值的哈希/校验和...),但您有什么建议?

编辑:远程数据库在虚拟主机上,因此需要 PHP 来传输数据。

【问题讨论】:

  • 大多数数据库都有某种形式的复制机制,可以让您保持数据库的多个副本同步——您使用的是什么风格的数据库?
  • 如果您使用的是 MySQL,请检查:stackoverflow.com/questions/364291/…
  • @MarkBaker MySQL。可能无法直接连接(端口 3306?),因为远程数据库将在虚拟主机上。

标签: php mysql database synchronization


【解决方案1】:

在您的记录中包含最后一次更改字段(日期)总是一个好主意。请记住,如果您开始同步,则必须处理冲突。

如果双方都可以插入,请为主键使用分区方案。示例:站点 A 从 1000000000 开始,站点 B 从 2000000000 开始(使这个数字足够大,或者简单地将主键大小除以并发站点的数量)。

粗略同步图:

  1. 从源 A 获取修改后的记录,从上一个同步周期开始。
  2. 对于每条记录,检查:
    1. 它是新插入到 A 中的吗?然后插入到B中
    2. 是否在 A 中修改,但在 B 中没有:更新 B
    3. 是否在 A 和 B 中修改:在字段级别解决冲突。
  3. 从源 B 获取修改后的记录,从上一个同步周期开始
  4. 对于每条记录,检查:
    1. 是新插入到 B 中的吗?然后插入A中
    2. 是否在 B 中修改,但在 A 中没有:更新 A
    3. 是否在 B 和 A 中修改:在字段级别解决冲突。

【讨论】:

  • 如何使用自己的主键生成处理站点 A 上的并发插入?
  • 您不需要自己处理主键生成 - 您可以在两个站点上使用不同的 auto_increment 键偏移量。
  • 关于 PK,也许可以使用添加客户端 id 之类的东西来使本地和远程表对应。
【解决方案2】:

如果你想通过代码同步两个数据库,那你就是在找麻烦。

首先,您需要处理自己的主键生成,因为在不同站点上插入记录时,主键可以/将是相同的。唯一主键生成并不容易完成。

此外,您需要一些冲突解决方案。任何一方所做的更新或删除都必须反映到另一个站点。通常,如果没有用户干预,您无法解决冲突。

我的建议:查看数据库原生的内置(双向)复制。它会为您省去很多麻烦。

【讨论】:

  • 感谢您的提醒。是的,用这些术语来考虑 id 可能会有问题。也许专注于信息本身比实际同步记录本身更好。这仍然会留下冲突的可能性。
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多