如何监视Postgres中尚未提交的事务进行调试?

时间:2013-11-25 14:04:40

标签: postgresql transactions

是否有postgres工具允许我监视事务并运行查询,就好像我是该事务的一部分一样。

我的java代码有一个断点,它已启动一个事务但尚未提交事务,因为它正在等待一个断点。我想要做的是能够以事务看待它的方式查看数据库的状态。

理想情况下,我想要一个工具,让我拥有某种类型的SQL控制台,我可以在其中输入内容作为tx的一部分,所以我可以编写select语句来查看尚未提交的内容。

我的开发工作站只需要这样的工具,我使用的是postgres 9.1,但如果需要可以轻松升级到9.2或9.3。

2 个答案:

答案 0 :(得分:6)

我不知道任何开箱即用意味着“查看”或重播正在发生的事情,但有一些隐藏的列,功能和目录可能对您的取证有所帮助。

您感兴趣的关键system columns是xmin和xmax。您可以像这样查询它们:

SELECT xmin, xmax, ... FROM table

顺便说一句,要小心他们的类型是xid。这是一个非常反复无常的整数版本,仅作为运算符响应=。此外,它只能转换为文本和背面:

select 1::text::xid::text::int, not(1::text::xid = 2::text::xid);

如果行被更新或被后者删除,那么从违规交易的外部,xmax将保留违规交易的ID。 我不知道有任何方法可以看到新插入的行。

要查看新行(虽然信息非常少),您可以使用pageinspect contrib:

SELECT * FROM heap_page_items(get_raw_page('table', 0));

有一些可能有趣的system information functions来理解后者的作用。他们返回并使用txid_snapshot(同样反复无常的类型)与这些列一起使用。我恐怕没有任何方法可以获得正在进行的事务的精确xip_list而不在其中,更不用说在运行select语句时将其伪装成以查看数据库为但它确实如此。

最后,有一个感兴趣的视图和表格:

select * from pg_stat_activity;
select * from pg_locks;

第一个pg_stat_activity将为您提供最后一次查询,以及pid

第二个pg_locks,会给你一个xid的{​​{1}},以及它在其他表和表行上获得的各种锁,所以你知道去哪里开始看。

然后,您可以通过运行查询来查看触及的内容,例如:

pid

答案 1 :(得分:1)

你可能会使用pgbouncer一起破解某些东西。 Pgbouncer是一个连接池,它代表您直接连接到db。我要做的是将pgbouncer连接限制降低到1连接..然后,运行你的应用程序到你的失败点,并以某种方式断开与数据库的连接。 db和pgbouncer之间的连接仍然是开放的 - 你必须将pgbouncer中的“server_reset_query”调整为不会回滚所有内容并丢弃所有内容的东西。我没有对此进行测试,但这是我唯一的领导,我认为你可以让它发挥作用。