如何监视 DB2 中的死锁

Posted

技术标签:

【中文标题】如何监视 DB2 中的死锁【英文标题】:How to monitor a deadlock in DB2 【发布时间】:2018-08-09 05:08:17 【问题描述】:

我正在关注此链接并尝试模拟死锁问题:

http://www.dba-db2.com/2012/06/how-to-monitor-a-deadlock-in-db2.html

我可以看到我的命令运行成功了。

然后我通过DbVisualiser工具模拟死锁错误。但是我没有看到任何文件被生成到路径中。

有人能指出错误吗?

而且,我尝试回读那些旧的 0000000.evt 文件,它显示如下内容:

                            EVENT LOG HEADER
  Event Monitor name: DB2DETAILDEADLOCK
  Server Product ID: SQL10059
  Version of event monitor data: 12
  Byte order: BIG ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: db2inst1
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: MYDB   
  Database Path: /db2home/db2inst1/NODE0000/SQL00003/MEMBER0000/
  First connection timestamp: 01/29/2018 10:00:17.694784
  Event Monitor Start time:   01/29/2018 10:00:18.951331
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: MYDB   
  Database Path: /db2home/db2inst1/NODE0000/SQL00003/MEMBER0000/
  First connection timestamp: 01/29/2018 10:12:54.382936
  Event Monitor Start time:   01/29/2018 10:12:54.697223
--------------------------------------------------------------------------

这意味着没有死锁?

【问题讨论】:

是的,这意味着没有死锁。如果死锁并且当时事件监视器处于活动状态,那么您应该在 db2evmon 输出中看到“死锁事件”节。您还可以使用监控功能来确认是否发生了死锁(但不是它是如何发生的)。以下查询报告自数据库激活以来的累积值:SELECT deadlocks, lock_timeouts FROM TABLE (MON_GET_DATABASE(-2)); 【参考方案1】:

对我来说可以正常工作(linux,Db2 v11.1)。以下是一些带有注释的命令行。您需要对每个命令具有适当的授权/特权。我使用的是实例所有者帐户。

先禁用默认的 db2detaildeadlock 监视器,然后再创建自己的监视器:

$ db2 "set event monitor db2detaildeadlock state=0"      
DB20000I  The SQL command completed successfully.
$ 
$ db2 "create event monitor dlmon for deadlocks write to file '/tmp'"
DB20000I  The SQL command completed successfully.
$
$ db2 "set event monitor dlmon state=1"
DB20000I  The SQL command completed successfully.
$

生成死锁,确保您看到此 SQLCODE -911,原因代码为 2。 如果您没有看到原因代码 2,那么您没有有任何死锁,但您可能会遇到超时并且超时不会记录在死锁监视器中。

这里我展示了死锁的受害者收到回滚通知,你可以看到正确的原因代码:

$ db2 +c "select * from db2inst1.dlk where a=4 with rr"
SQL0911N  The current transaction has been rolled back because of a deadlock 
or timeout.  Reason code "2".  SQLSTATE=40001

使用 db2evmon 调查监视器输出并查看结果文件

$ db2evmon -db mydb -evm dlmon > /tmp/db2evmon.dlmon.1

Reading /tmp/00000000.evt ...

$ view /tmp/db2evmon.dlmon.1
...<snip>
...
3) Deadlock Event ...
  Deadlock ID:   2
  Number of applications deadlocked: 2
  Deadlock detection time: 01/03/2018 09:06:39.019854
  Rolled back Appl participant no: 2
  Rolled back Appl Id: *LOCAL.db2inst1.180301090546
  Rolled back Appl seq number: 00001
  Rolled back Appl handle: 11872

...<snip>

【讨论】:

嗨@mao,所以 0000000.evt 实际上是死锁日志?我实际上仍然不确定死锁文件名是什么。我在我的问题中添加了一些内容,我试图阅读那些旧的 0000000.evt,但它没有显示任何与死锁相关的内容,我认为它不是死锁日志。 如果您使用 db2evmon 命令显示的 exact 命令,则无需查看实际文件名(它们可能会有所不同)。证明确实发生了死锁(-911 原因代码 2)。 嗨@mao,另外一件事是,我有很多存储db2detaildeadlock日志文件的路径,例如/db2home/db2inst1/NODE0000/SQL00001/MEMBER0000/db2event/db2detaildeadlock/db2home/db2inst1/NODE0000/SQL00002/MEMBER0000/db2event/db2detaildeadlock/db2home/db2inst1/NODE0000/SQL00003/MEMBER0000/db2event/db2detaildeadlock等等。还有SQL00004SQL00005等等。我可以知道如何知道我的日志记录在哪个文件夹中吗?因为它来自生产,我必须让 IT 为我检索文件。 @Panadol Chong :当人们帮助你时,考虑投票或将答案标记为正确。不要在评论线程中提出新问题,而是创建一个新问题。

以上是关于如何监视 DB2 中的死锁的主要内容,如果未能解决你的问题,请参考以下文章

db2 如何查看死锁的详细信息

如何查询db2数据库表是不是被锁

DB2 操作超时或死锁

DB2数据库发生死锁了怎么办

db2 查杀死锁进程

db2数据库里面的一张表被锁定,怎么解锁