在Postgres 9.6中调试AccessExclusiveLock

Duc*_*uck 6 postgresql

我们有一个由Postgres支持的应用程序,该应用程序已短暂锁定。Postgres日志显示了针对pg_database以下内容的一系列AccessExclusiveLock条目:

[13-1]  sql_error_code = 00000 LOG:  process 7045 still waiting for AccessExclusiveLock on object 0 of class 1262 of database 0 after 1000.123 ms 
[6-1]  sql_error_code = 00000 LOG:  process 7132 still waiting for AccessExclusiveLock on object 0 of class 1262 of database 0 after 1000.118 ms 
[6-1]  sql_error_code = 00000 LOG:  process 8824 still waiting for AccessExclusiveLock on object 0 of class 1262 of database 0 after 1000.133 ms 
[14-1]  sql_error_code = 00000 LOG:  process 7045 acquired AccessExclusiveLock on object 0 of class 1262 of database 0 after 39265.319 ms 
[7-1]  sql_error_code = 00000 LOG:  process 7132 acquired AccessExclusiveLock on object 0 of class 1262 of database 0 after 12824.407 ms 
[7-1]  sql_error_code = 00000 LOG:  process 8824 acquired AccessExclusiveLock on object 0 of class 1262 of database 0 after 6362.509 ms
Run Code Online (Sandbox Code Playgroud)

1262这里指的是pg_database

=> select 1262::regclass;
+-------------+
|  regclass   |
+-------------+
| pg_database |
+-------------+
Run Code Online (Sandbox Code Playgroud)

我们在Heroku上运行Postgres 9.6.5。

据我了解,AEL将用于“繁重”操作,例如DROP TABLE,TRUNCATE,REINDEX [1] ...我们的运行时操作由许多存储过程组成,每个存储过程都在多个存储过程中进行插入/更新/删除表(删除很少见)。在运行时,我们不会执行上面和链接的文档中列出的任何操作,并且目前没有(由我们执行)发行版/维护。

我还没有找到任何文档来举例说明在上述“正常操作”期间何时可以使用此锁定。我的问题是:

  1. 是什么引起了AEL(如果我提供了足够的信息来进行推测),并且有什么最佳实践可以避免日后再使用它们?
  2. 我还能看什么来帮助调试原因?

[1]:Postgres文档-显式锁定