如何监视 DB2 中的死锁
How to monitor a deadlock in DB2
我正在关注这个 link 并尝试模拟死锁问题:
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
--------------------------------------------------------------------------
这意味着没有死锁?
对我来说工作正常(linux,Db2 v11.1)。下面是一些带有注释的命令行。您需要为每个命令设置合适的 authorisation/privilege。我使用的是实例所有者帐户。
首先禁用默认的 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>
我正在关注这个 link 并尝试模拟死锁问题:
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
--------------------------------------------------------------------------
这意味着没有死锁?
对我来说工作正常(linux,Db2 v11.1)。下面是一些带有注释的命令行。您需要为每个命令设置合适的 authorisation/privilege。我使用的是实例所有者帐户。
首先禁用默认的 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>