【问题标题】:Copy new records from one database to another将新记录从一个数据库复制到另一个
【发布时间】:2017-03-24 14:24:50
【问题描述】:

我有本地和远程数据库。 本地数据库是远程数据库的副本。 我必须将远程数据库中的新记录插入本地数据库。 远程数据库中有 14 个表,所以我需要跟踪所有 14 个表的变化。

我知道我可以选择远程数据库中的每个表并检查本地数据库中是否存在记录,如果不存在则插入它。

还有其他方法吗?也许在java中? 哪种方法最好?

【问题讨论】:

  • 我觉得DBMS更快更安全,如果你想通过throw java,可能这需要时间,你试过dblink吗?
  • 速度是最少的问题。考虑两个数据库之间的同步和一致性...
  • 数据量是多少?与包含数十亿条记录的 14 个表相比,包含数百条记录的 14 个表是一个不同(且微不足道)的问题。
  • @Youcef Laidani - 不,但我会尝试
  • 什么不@user1598696,你想尝试什么?

标签: java sql oracle hibernate oracle11g


【解决方案1】:

如果您只有一个本地数据库并且它一直在运行 - 您可以使用远程数据库的触发器插入本地数据库。

顺便说一句:从本地手动检查远程不是一个好主意。如果现有的远程记录发生了变化,但本地仍然有旧值怎么办?

还有很多 Oracle 工具可以在数据库之间进行复制和同步。最好挖进去。

【讨论】:

  • 我无权访问远程数据库,仅授予选择和更新权限。是的,我想我需要同步。你知道哪些工具最容易使用吗?
  • 很抱歉我很久以前就在那个领域工作过,可能不知道最新的情况。无论如何,有 DBA 的技术或工具,您将无法以简单用户的身份应用它们(仅具有 SELECT 和 UPDATE 权限)。
【解决方案2】:

让我们从 DBlink 到远程 DB 开始

CREATE PUBLIC DATABASE LINK REMO
CONNECT TO <user_name>
IDENTIFIED BY <password>
USING '<service_name>';

然后循环插入用户模式中的所有表。或者,如果您只想插入一些表,请为这 14 个表定义适当的条件。

begin

for x in (select table_name from user_tables) loop
execute immediate 'insert into ' || x.table_name || ' (select * from ' || x.table_name || '@REMO minus select * from ' || x.table_name || ')';

commit;
end loop;
end;
/

这将只插入新记录(实际上是远程存在(或已更改)而本地不存在的记录)。如果这是你需要的,这将起作用。如果您需要同步,这不是解决方案。

【讨论】:

  • 恕我直言:这是正确的解决方案。它还可以扩展到某种“同步”解决方案,以将本地 DB 与远程 DB 同步,如果它定期运行(例如)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2013-07-02
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多