显示非常长的postgres过程的进度(在事务结束之前传输数据)

时间:2012-01-25 11:14:18

标签: postgresql transactions

我试图创建表,但它没用,因为每个开始端块都包含在postgres中的事务中,所以在事务结束之前我看不到任何更改。 唯一的解决方案是上升INFO,我用它来显示当前的程序步骤,但它不完全是我正在寻找的。我需要知道当前计算的详细数据,因为每个步骤可能需要几个小时。 请建议我在交易结束之前传输数据的方式。

UPD:我找到了传输进度的方法:我可以从我的程序中增加序列,并从其他连接中读取它们。 http://blog.endpoint.com/2010/04/viewing-postgres-function-progress-from.html

1 个答案:

答案 0 :(得分:2)

您可以使用dblink扩展连接回数据库并在不同的连接上执行语句。例如,这通常用于在事务回滚之前记录错误。

快速演示:

CREATE EXTENSION dblink; -- or run the script from contrib before version 9.1

select * from dblink('dbname=steve', $$
       select datname, procpid, current_query from pg_stat_activity
      $$) r(datname name, pid int, current_query text);

产生

 datname | pid  |                            current_query                            
---------+------+---------------------------------------------------------------------
 steve   | 8535 | select * from dblink('dbname=steve', $$                            +
         |      |        select datname, procpid, current_query from pg_stat_activity+
         |      |       $$) r(datname name,                                          +
         |      |           pid int, current_query text);
 steve   | 9235 |                                                                    +
         |      |        select datname, procpid, current_query from pg_stat_activity+
         |      |       

所以你可以看到这是两个单独的会话。 dblink提供了打开持久连接等功能,这个简单的用法会跳过。如果您已经有一个架构将进度信息放入其中,那么您可以通过第二个连接调用dblink()来填充/更新它,同时第一个连接继续执行其长事务。