同步跨数据库的表数据

18 浏览
0 Comments

同步跨数据库的表数据

我有一张表,记录了其行插入/更新的时间戳字段。

我想要将该表中的数据与另一个数据库服务器上的另一张表进行同步。这两个数据库服务器没有连接,并且同步是单向的(主/从)。使用表触发器不适合。

我的工作流程:

  • 我使用一个全局的last_sync_date参数,并查询Master表中已更改/插入的记录
  • 将结果行输出为XML
  • 解析XML并使用更新和插入操作更新Slave表

处理Master表中已删除的记录时,问题的复杂性增加。为了捕获已删除的记录,我认为我必须维护一个先前插入记录的日志表,并使用SQL的"NOT IN"进行查询。当处理大型数据集时,这会成为一个性能问题。

在处理这种情况时,有何替代的工作流程?

0
0 Comments

在数据库应用中,经常会遇到需要在不同数据库之间同步表数据的需求。这种需求的出现可能是因为不同的数据库用于不同的用途,需要保持数据的一致性,或者需要将数据在不同数据库之间进行备份和迁移。为了解决这个问题,可以使用以下几种方法:

一种解决方法是使用Oracle GoldenGate。Oracle GoldenGate是一个全面的软件包,可以在异构数据环境中实现数据的复制。该产品集支持高可用性解决方案、实时数据集成、事务性变更数据捕获、数据复制、转换和验证等功能。

另一种解决方法是使用SymmetricDS。SymmetricDS是一个开源软件,用于在异构环境中实现多主数据库复制、过滤同步或转换。它支持多个订阅者,可以进行单向或双向异步数据复制。

还有一种解决方法是使用Daffodil Replicator。Daffodil Replicator是一个Java工具,用于在各种数据库服务器之间进行数据同步、数据迁移和数据备份。

通过使用这些工具,可以方便地实现数据库之间的表数据同步,保持数据的一致性,并且能够在不同的数据库之间进行数据的备份和迁移。以上介绍的几种方法都提供了可靠的解决方案,可以根据具体的需求选择合适的工具来实现数据同步。

0
0 Comments

在进行数据库管理和数据同步的过程中,有时会遇到需要在不同的数据库之间同步表数据的问题。这种需求可能由于以下原因而产生:

1. 数据库迁移:当需要将数据从一个数据库迁移到另一个数据库时,需要确保迁移后的数据库中的数据与原始数据库中的数据保持一致。

2. 多数据库同步:当有多个数据库需要共享相同的数据时,需要确保这些数据库中的数据保持同步,以便在任何一个数据库中进行的更改都能够反映在其他数据库中。

为了解决这个问题,有一些方法和工具可以使用。以下是一些可能有用的链接:

1. http://knowledgebase.apexsql.com/2007/09/how-to-synchronize-data-between.htm

2. http://www.codeproject.com/Tips/348386/Copy-Synchronize-Table-Data-between-databases

然而,这些链接中的解决方案可能不适用于所有情况。因此,根据具体的需求和技术环境,可能需要进一步调查和研究其他方法和工具来解决数据同步的问题。

0
0 Comments

问题:如何在多个数据库之间同步表数据?

解决方法:使用事务性消息队列。当更新主数据库时,可以将更新操作发送到消息代理,消息可以发送到任意数量的队列。每个从数据库可以有自己的队列,由于队列保持顺序,进程应该能够正确地同步(具有讽刺意味的是,这种方式类似于大多数关系型数据库内部进行复制的方式)。消息队列可以看作是一种类似于源代码管理(change-list)或补丁列表的数据库。大多数消息队列支持持久性和事务,因此不必担心消息丢失。

推荐使用spring-amqp和/或spring-integration,特别是考虑到你标记了这个问题为spring-batch。

根据你的评论:

- 参考Spring Integration:http://static.springsource.org/spring-integration/reference/htmlsingle/

- 搜索简单工作流程或“message”的内容,以帮助理解建议。

- 查看RabbitMQ的消息传递工作原理:http://www.rabbitmq.com/getstarted.html

- 消息的内容可以是整行数据,以及是CRUD、UPDATE还是DELETE操作。可以使用任何格式(例如JSON),参考spring integration的建议。

- 除了消息队列,你还可以尝试使用类似之前尝试过的XML文件的方法。在主数据库中,关键特性是在模式中添加一个CREATE TIMESTAMP列,以便在系统运行时进行批处理处理(否则将需要停止系统)。在这种情况下,可以使用“SELECT * WHERE CREATE_TIME < ?”来获取当前时间之前的行,从而获取快照。

- 在其他数据库中,可以使用inner join和!=来删除行,而不是使用较慢的NOT IN。幸运的是,你只需要删除的ids而不是其他列。对于更新和创建(插入)操作,可以基于更新时间戳列使用增量。

- 如果其他人从表中删除行怎么办?如果他从主数据库中删除行,那么他没有问题。他只需将“DELETE”作为消息发送,它最终会传递到其他数据库。正如我在答案中说的,他甚至可以发送原始SQL语句。消息队列中保持顺序。这个想法正是其他数据库使用自定义队列进行复制的方式。但是,如果他在不从主数据库中删除的情况下从从数据库中删除行,那么他就会遇到问题。

- 如果他不想使用触发器,也不想更新访问数据库的应用程序,那么谁会生成这些事件/消息?以及如何将它们与单个事务绑定,以避免出现不一致性?不清楚他可以做什么和不能做什么。无论如何,事件驱动的消息队列对于未来的需求是一个好东西。

0