ams*_*ams 7 postgresql transactions
是否有postgres工具,允许我监视一个事务并运行查询,就像我是该事务的一部分一样.
我的java代码有一个断点,它已启动一个事务但尚未提交事务,因为它正在等待一个断点.我想要做的是能够以事务看待它的方式查看数据库的状态.
理想情况下,我想要一个工具,让我有一个类型的SQL控制台,我可以输入东西作为该tx的一部分,所以我可以编写select语句来查看尚未提交的东西.
我只需要这个工具用于我的开发工作站,我使用postgres 9.1但如果需要可以轻松升级到9.2或9.3.
我不知道任何开箱即用意味着"查看"或重播正在发生的事情,但有一些隐藏的列,功能和目录可能对你的取证有所帮助.
您感兴趣的关键系统列是xmin和xmax.您可以像这样查询它们:
SELECT xmin, xmax, ... FROM table
Run Code Online (Sandbox Code Playgroud)
顺便说一句,要小心他们的类型xid.这是一个非常反复无常的整数版本,它只响应=作为运算符.此外,它只能转换为文本和后面:
select 1::text::xid::text::int, not(1::text::xid = 2::text::xid);
Run Code Online (Sandbox Code Playgroud)
xmax如果行被更新或被后者删除,则从违规交易的外部将保留违规交易的ID.我不知道有任何方法可以看到新插入的行.
要查看新行(尽管有很少的有用信息),您可以使用pageinspect contrib:
SELECT * FROM heap_page_items(get_raw_page('table', 0));
Run Code Online (Sandbox Code Playgroud)
有一些可能有趣的系统信息函数可以理解后者的作用.他们返回并使用txid_snapshot(同样反复无常的类型)与这些列一起使用.我担心我没有意识到任何方法可以xip_list在不在其中的情况下获得正在进行的事务的精确度,更不用说在运行select语句时如同它一样伪装,以查看数据库.
最后,有一个视图和一个感兴趣的表:
select * from pg_stat_activity;
select * from pg_locks;
Run Code Online (Sandbox Code Playgroud)
第一个是pg_stat_activity,它将为您提供事务的最后一个查询及其查询pid.
第二个,pg_locks,会给你一个xid给出a 的冒犯pid,以及它在其他表和表行上获得的各种锁,所以你知道从哪里开始看.
然后,您可以通过运行查询来查看触及的内容,例如:
select * from table where xmax = 123::text::xid;
Run Code Online (Sandbox Code Playgroud)
您可能可以使用 pgbouncer 将一些东西组合在一起。Pgbouncer 是一个连接池,它代表您直接连接到数据库。我要做的是将 pgbouncer 连接限制降低到 1 个连接。然后,运行您的应用程序直至出现故障,并以某种方式与数据库断开连接。数据库和 pgbouncer 之间的连接仍然保持打开状态——您必须将 pgbouncer 中的“server_reset_query”调整为不会回滚所有内容并丢弃所有内容的内容。我还没有测试过这个,但这是我拥有的唯一线索,我认为你可以让它发挥作用。
| 归档时间: |
|
| 查看次数: |
3732 次 |
| 最近记录: |