1

我正在尝试使用 dblink 将远程数据库链接到本地​​数据库。这里想要实现的是:

  1. 我只想每 10 秒从远程数据库中的表中获取最新行的数据。

  2. 我希望将数据插入本地数据库到预先存在的表中。在这种情况下,我希望将我从远程数据库收集的数据以及其他一些数据(如主键)和一些我没有从远程数据库获得的序列插入到表中。

任何建议,将不胜感激。

4

1 回答 1

2
  • 您需要远程表中的索引列,每次插入或更新行时都会增加(不是时间戳,因为许多行可以具有相同的时间戳,计算机时钟有时可以倒退等)。如果您从不更新,那么串行主键就足够了(如果您决定依赖此触发器,则强制使用触发器不允许更新)。删除也不会同步,所以我建议强制他们也不允许使用触发器。

  • 您需要一个 cron(或 Windows 上的调度程序)作业来连接到您的数据库并执行同步,因为 PostgreSQL 没有定期任务的机制。

  • 这项工作只会做:

    开始交易;
    以独占模式锁定表 local_tablename;
    dblink_connect(…);
    插入 local_tablename (id, data, row_counter)
      选择 * 从 dblink(
        '从 remote_tablename 中选择 id、data、row_counter
           where row_counter>'||(select coalesce(max(row_counter),-1) from local_tablename)
      ) as t(id int, data text, row_counter int);
    犯罪;

    它需要处于事务中并用锁保护,因为如果它与另一个同步作业同时运行(例如,如果前一个作业花费超过 10 秒),它可能会中断。

    如果 `local_tablename` 还没有行,则需要 `coalesce` - 如果没有它,它将不会插入任何内容。它假定总是 `row_counter>=0`。

于 2012-06-19T11:01:54.473 回答