postgresql - Schedule将数据从dblink插入到本地表中

时间:2012-06-19 10:01:29

标签: postgresql scheduled-tasks dblink

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

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

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

  3. 任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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

  • 这项工作只会:

    start transaction;
    lock table local_tablename in exclusive mode;
    dblink_connect(…);
    insert into local_tablename (id, data, row_counter)
      select * from dblink(
        'select id, data, row_counter from remote_tablename
           where row_counter>'||(select coalesce(max(row_counter),-1) from local_tablename)
      ) as t(id int, data text, row_counter int);
    commit;

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

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