我正在尝试使用 dblink 将远程数据库链接到本地数据库。这里想要实现的是:
我只想每 10 秒从远程数据库中的表中获取最新行的数据。
我希望将数据插入本地数据库到预先存在的表中。在这种情况下,我希望将我从远程数据库收集的数据以及其他一些数据(如主键)和一些我没有从远程数据库获得的序列插入到表中。
任何建议,将不胜感激。
我正在尝试使用 dblink 将远程数据库链接到本地数据库。这里想要实现的是:
我只想每 10 秒从远程数据库中的表中获取最新行的数据。
我希望将数据插入本地数据库到预先存在的表中。在这种情况下,我希望将我从远程数据库收集的数据以及其他一些数据(如主键)和一些我没有从远程数据库获得的序列插入到表中。
任何建议,将不胜感激。
您需要远程表中的索引列,每次插入或更新行时都会增加(不是时间戳,因为许多行可以具有相同的时间戳,计算机时钟有时可以倒退等)。如果您从不更新,那么串行主键就足够了(如果您决定依赖此触发器,则强制使用触发器不允许更新)。删除也不会同步,所以我建议强制他们也不允许使用触发器。
您需要一个 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`。