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

Posted

技术标签:

【中文标题】postgresql - 计划将数据从 dblink 插入到本地表中【英文标题】:postgresql - Schedule Insert data from dblink to a local table In a 【发布时间】:2012-06-19 10:01:29 【问题描述】:

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

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

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

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

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

您需要一个 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`。

【讨论】:

在这种情况下,我还会使用 dblink,还是有更好的选择来实现我想要实现的目标? @tometzky? 我认为 dblink 将是最简单的方法。我已经更新了我的答案,使其更加清晰。 您好@tometzky,您的解决方案运行良好,并且正在从插入到我的数据库中的远程数据库中获取数据,但现在我注意到数据是按顺序插入的。我从远程数据库的三列中获取数据,但它插入到我本地数据库的前 3 列中。我想要一个状态,我可以决定将哪些数据插入到哪里,并且我有机会在某些列中插入一些默认值。如果您不介意进一步解释,我将不胜感激...... 嘿 - 做你的功课。这是基本的SQL insert syntax - insert into table_name (column_name1, column_name2, column_name3) select …。我更新了我的问题,它在插入中使用列名。 非常感谢。这就是我所需要的。我以前从未与 dblink 合作过.. 很抱歉很多 qns...干杯!

以上是关于postgresql - 计划将数据从 dblink 插入到本地表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgresql 中获取正在运行的查询的执行计划?

使用 Drill 查询获取 PostgreSQL 执行计划

从原始物理文件中恢复 postgreSQL 数据库

PostgreSql一个月学习计划

自动从Minecraft中读取聊天文本

PostgreSQL DBA(13) - 自顶往下的方法阅读执行计划