Postgresql对象ID和元组
我有时会看到这样的消息 进程12990等待数据库17607的关系17720的元组(889,66)上的排他锁;被进程12992阻止 当然“流程”部分很清楚,但我不知道如何在关系ID和人类可读名称之间建立关联。我也不知道如何理解元组位 有人知道如何阅读这些信息以及如何从中收集有用的数据吗Postgresql对象ID和元组,postgresql,Postgresql,我有时会看到这样的消息 进程12990等待数据库17607的关系17720的元组(889,66)上的排他锁;被进程12992阻止 当然“流程”部分很清楚,但我不知道如何在关系ID和人类可读名称之间建立关联。我也不知道如何理解元组位 有人知道如何阅读这些信息以及如何从中收集有用的数据吗 谢谢 您可以在系统表中查找这一点:这里感兴趣的是 像这样做查询 SELECT OID, relname FROM pg_class oid | relname
谢谢 您可以在系统表中查找这一点:这里感兴趣的是 像这样做查询
SELECT OID, relname FROM pg_class
oid | relname
-------+------------------------------------
1247 | pg_type
11550 | user_mapping_options
11554 | user_mappings
11494 | triggered_update_columns
11497 | triggers
或者更确切地说
SELECT relname FROM pg_class WHERE OID=17720
“关系”是一个表,“元组”是一行
下面是从表id中获取表名的步骤(您也可以查询pg_类
table):
现在,这一排怎么样?“元组位”是一个数组,数据库中的每个表都有一个特殊的名为ctid
的表,其中存储了这些标识符。现在我们知道了所讨论的表格,我们可以做:
=> select * from my_table where ctid='(889,66)';
然而!从系统栏docs(强调添加):“[A]l尽管ctid可以很快地定位行版本,如果行的ctid被更新或移动,则该行的ctid将发生变化。因此,ctid作为长期行标识符是无用的。”换句话说,如果您足够快,您可能会相信返回的行就是死锁中涉及的行,但该信息不会永远可用。谢谢!我算出了id到关系的映射,但仍然不确定元组是什么…实际上,我应该澄清-不确定如何读取元组符号(x,y)以及如何使用它来理解导致死锁的原因OK,找到的另一位数据-这些数字是插入或删除该元组/行的事务id。有没有办法让我知道这些事务运行的是哪种SQL?
=> select * from my_table where ctid='(889,66)';