Postgresql对象ID和元组

use*_*221 15 postgresql

我有时看到像这样的消息

进程12990等待数据库17607的关系17720的元组(889,66)上的ExclusiveLock; 被进程12992阻止.

当然,"过程"部分非常清楚,但我不知道如何关联关系ID和人类可读的名称.我也不知道如何制作元组位.

任何人都知道如何阅读这些消息以及如何从中收集有用的数据?

谢谢!

whi*_*537 28

"关系"是表,"元组"是一行.

这是从表id获取表名的一个很好的快捷方式(您也可以查询pg_class表):

=> select 17720::regclass;
????????????
? regclass ?
????????????
? my_table ?
????????????
(1 row)
Run Code Online (Sandbox Code Playgroud)

那排怎么样?在"元组位"是一个元组标识符,并在数据库中的每个表都有一个特殊的系统列名为ctid其中这些标识符的存储位置.现在我们知道了有问题的表,我们可以这样做:

=> select * from my_table where ctid='(889,66)';
Run Code Online (Sandbox Code Playgroud)

然而!从系统列文档(强调添加):"[A]虽然ctid可以用来非常快速地定位行版本,但如果更新或由VACUUM FULL移动,行的ctid将会改变.因此ctid是无用的 - 行行标识符." 换句话说,如果你足够快,你可能会相信返回的行是死锁中涉及的行,但该信息将永远不可用.


Pet*_*ans 20

您可以查看系统表:这里感兴趣的是pg_class.

做一个像这样的查询

SELECT OID, relname FROM pg_class
 oid  |              relname               
-------+------------------------------------
  1247 | pg_type
 11550 | user_mapping_options
 11554 | user_mappings
 11494 | triggered_update_columns
 11497 | triggers
Run Code Online (Sandbox Code Playgroud)

更确切地说

SELECT relname FROM pg_class WHERE OID=17720
Run Code Online (Sandbox Code Playgroud)

可能会对锁具有所了解.