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

标签 postgresql transactions

是否有一个 postgres 工具可以让我监视交易并运行查询,就好像我是该交易的一部分一样。

我的 java 代码有一个断点,它已经开始一个事务但还没有提交事务,因为它正在断点处等待。我想要做的是能够以事务看到它的方式看到数据库的状态。

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

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

最佳答案

我不知道有任何开箱即用的方法可以“查看”或重播到底发生了什么,但是有一些隐藏的列、函数和目录可能对您的取证有帮助。

key 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贡献:

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

有一些可能有趣的 system information functions了解后者的作用。他们返回并使用 txid_snapshot(一种同样反复无常的类型)用于这些列。恐怕我不知道有什么方法可以在不进入正在进行的交易的情况下获得精确的 xip_list ,更不用说在运行 select 时伪装成它了然而,查看数据库的语句。

最后,有一个 View 和一个感兴趣的表:

select * from pg_stat_activity;
select * from pg_locks;

第一个,pg_stat_activity , 将为您提供交易的最后查询及其 pid

那一秒,pg_locks , 会给你有问题的 xid 给定一个 pid,连同它在其他表和表行上获得的各种锁,所以你知道从哪里开始看。

然后您可以通过运行以下查询来检查所触及的内容:

select * from table where xmax = 123::text::xid;

关于postgresql - 如何监视尚未在 Postgres 中提交的事务以进行调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20195088/

相关文章:

java - Kettle在java函数中启动改变系统属性

php - 事务中数据库查询的时间戳

linq-to-sql - LINQ + TransactionScope 不会更改 SQL Server Profiler 中的隔离级别

hibernate - 在不同的数据库中创建 envers 审计表,最好在不同的事务中完成日志记录

python - 使用 psycopg2 创建 postgresql 数据库

sql - PostgreSQL 数据库中的阿拉伯文和英文文本

postgresql - 从 pg_stat_activity 查看时不启动触发器

sql - PostgreSQL 中数字之间的异或

sql - 将列插入 postgres 区间

php - Mysql 注册事务