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

DB2数据库发生死锁了怎么办,第1张

db2 get snapshot for locks on sample

db2 get db cfg for sample

db2 update db cfg using dlchktime 10000

-查看数据库管理器级别快照信息

db2 get snapshot for dbm

-查看数据库级别快照信息

db2 get snapshot for database on dbname

-查看应用级别快照信息

db2 get snapshot for application agentid appl-handler

注:appl-handler可以从list applicaitions的输出中得到

-查看表级别快照信息

db2 get snapshot for tables on dbname

注:需要把tables快照开关设为ON才会有作用

-查看锁快照信息

db2 get snapshot for locks on dbname

db2 get snapshot for locks on for application agentid appl-handler

-查看动态sql语句快照信息

db2 get snapshot for dynamic sql on dbname

db2 get monitor switches

db2 update monitor switches using lock on statement on

create event monitor mymonitor for deadlocks,statements write to file 'c:/temp'

set event monitor mymonitor state 1

db2evmon - path 'c:/temp'

--转自:http://blog.csdn.NET/rodjohnsondoctor/article/details/4323514

---

第1页:上线前的准备

第2页:维护时的注意事项

第3页:发生死锁后的对策

【IT168 技术文档】在新的数据库应用系统上线初期,由于测试不完善或不熟悉DB2的机制,常会出现锁等待死锁等现象存在于我们的应用系统中,如何捕获锁等待或死锁信息并解决锁问题,是保证平稳上线必须面对的问题。目前应用系统最常使用的DB2数据库版本有多个,有8.1,8.2,9.1还有新推出的9.5,对于不同版本的DB2数据库提供的解决办法不尽相同,下面对于上述问题的解决作了一个简单说明,希望对大家有用。

首先在上线前有几件跟锁相关的事情需要开发设计人员一定要做好

1. 相关参数的更改

注册表变量参数:

DB2_EVALUNCOMMITTED=on 当启用此变量时,在可能的情况下,它将进行表或索引访问扫描以延迟或避免行锁定,直到知道数据记录满足谓词求值为止。

DB2_SKIPDELETED=on 当启用此变量时,在可能的情况下,它允许使用无条件地跳过已删除的键或跳过已删除的行。

DB2_SKIPINSERTED=on 当启用此变量时,在可能的情况下,它允许跳过未落实的已插入行,就好像从未插入这些行一样。

数据库参数:

LOCKLIST 锁定列表的内存量,当此参数设置为 AUTOMATIC 时,就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。如果不是自动,需要设置相对大一些;DB2默认是行锁,每个行锁大约占64或128个字节(64位数据库),计算锁定列表内存的大小公式是: ( 每个应用程序的平均锁定数目的估计值 * 每个锁定所需的字节数(128或64) * maxappls(或者max_coordagents) /4096 ) * 120%,这里只是建议公式,实际情况还要视 *** 作系统实际的内存量来定。

MAXLOCKS 升级前锁定列表的最大百分比,默认是22%(windows)或10%(unix),可以根据要求自行改动,计算公式是 2 * 100 / maxappls

DLCHKTIME 死锁检测时间间隔,默认是10000毫秒(10秒),可以根据要求自行改动,也可不动。增大此参数以降低检查死锁的频率,因此增加应用程序必须等待消除死锁的时间。 减小此参数会增大检查死锁的频率,从而减少应用程序必须等待死锁解决的时间,但是会增加数据库管理器检查死锁所花的时间。

LOCKTIMEOUT 锁等待时间,默认是 -1,也就是永远等待,请改成固定的值,在事务处理(OLTP)环境中,可以使用 30 秒的初始启动值。在一个只查询的环境中,您可以从一个较高的值开始。

LOGFILSIZ 日志文件大小,此参数定义每个主日志文件和辅助日志文件的大小。如果数据库要运行大量更新、删除或插入事务,而这将导致日志文件很快变满,则应增大日志文件,了解您的并发应用程序的日志记录需求,来确定一个不会分配过量而浪费空间的日志文件大小。

LOGPRIMARY 主日志文件数,了解您的并发应用程序的日志记录需求,适当增大日志文件数。

注意: 在更新参数时,需要注意有些参数在更改后需要重新启动数据库DB2实例才可以生效;有些参数需要断开当前所有的应用程序,重新链接才能生效;有些参数可以立即生效,使用者请参考相关文档,注意参数生效特性。

2. 应用程序设计

-程序尽量短小精悍

-程序尽量晚地访问关键资源

-程序尽可能快地提交工作

-程序尽可能快地关闭游标

-建立合适索引

3. 性能测试

要根据将来实际的并发用户数和数据量进行测试

上线之后维护时我们要做的几件事情

1. 做好定期维护

通过使用如下命令进行维护:

-reorg表和索引定期重组

-runstats表和索引的统计信息定期更新

-rebind 程序包定期重新编译

步骤一:使用命令get snapshot来查询哪些进程锁了哪些表。

步骤二:使用命令force来断开这些进行了死锁的进程来。

步骤三: 使用命令list application查看是否已经断开了哪些进行了死锁的进程。

步骤一:使用命令get snapshot来查询哪些进程锁了哪些表。

步骤二:使用命令force来断开这些进行了死锁的进程来。

步骤三: 使用命令list application查看是否已经断开了哪些进行了死锁的进程。这样就可以解锁了

C:\>db2 get snapshot for locks on js

数据库锁定快照

数据库名称 = JS

数据库路径 = D:\DB2\NODE0000\SQL00001\

输入数据库别名 = JS

挂起的锁定 = 5

当前已连接的应用程序= 1

当前正等待锁定的代理程序数 = 0

快照时间戳记= 2007-09-04 12:54:33.121513

应用程序句柄 = 10

应用程序标识= *LOCAL.DB2.070904045330

序号= 00001

应用程序名 = db2taskd

CONNECT 授权标识 = ADMINISTRATOR

应用程序状态= 连接已完成

状态更改时间= 未收集

应用程序代码页 = 1208

挂起的锁定 = 0

总计等待时间(毫秒)= 未收集

应用程序句柄 = 9

应用程序标识= *LOCAL.DB2.070904045329

序号= 00001

应用程序名 = db2stmm

CONNECT 授权标识 = ADMINISTRATOR

应用程序状态= 连接已完成

状态更改时间= 未收集

应用程序代码页 = 1208

挂起的锁定 = 0

总计等待时间(毫秒)= 未收集

应用程序句柄 = 8

应用程序标识= *LOCAL.DB2.070904045327

序号= 00011

应用程序名 = javaw.exe

CONNECT 授权标识 = ADMINISTRATOR

应用程序状态= UOW 正在等待

状态更改时间= 未收集

应用程序代码页 = 1208

挂起的锁定 = 5

总计等待时间(毫秒)= 未收集

锁定列表

锁定名称 = 0x020010000D0080080000000052

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 142606349

对象类型 = 行

表空间名 = USERSPACE1

表模式 = JS

表名 = US_CATALOG

方式 = X

锁定名称 = 0x02001000090080080000000052

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 142606345

对象类型 = 行

表空间名 = USERSPACE1

表模式 = JS

表名 = US_CATALOG

方式 = X

锁定名称 = 0x01000000010000000100EA0056

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 0

对象类型 = 内部变化锁定

方式 = S

锁定名称 = 0x5359535348323030DDECEF2841

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 0

对象类型 = 内部方案锁定

方式 = S

锁定名称 = 0x02001000000000000000000054

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 2

挂起计数 = 0

锁定对象名 = 16

对象类型 = 表

表空间名 = USERSPACE1

表模式 = JS

表名 = US_CATALOG

方式 = IX

C:\>db2 list applications

授权标识程序 应用程序名应用程序句柄应用程序标识数据库名称代理序号

------------ -------------- -------------- ------------------------ ------------- ----------

ADMINIST db2taskd 10 *LOCAL.DB2.070904045330 JS 1

ADMINIST db2stmm9 *LOCAL.DB2.070904045329 JS 1

ADMINISTjavaw.exe 8 *LOCAL.DB2.070904045327 JS 1

在snapshot的第四段显示应用程序句柄为8的应用有锁存在,在其相应的锁定列表中显示锁定的表是US_CATALOG。

如果您确定是US_CATALOG表上发生了死锁,可以通过命令db2 "force application(8)"来杀掉该应用在数据库上

的连接。注意如果force命令导致该应用的事务回滚得话,force命令不能马上断开应用在数据库上的连接,而是

要等到回滚完成后才能断开该应用的数据库连接。

C:\>db2 list applications show detail

//list applications for database cmsbj3 show detail

如果DB2在Window上,则可以使用“控制中心”->实例->右键“应用程序”,可以看到当前的锁定情况,并且可以强行关闭某个进程,也可以显示“锁定链”。

1.DB2表锁定怎么解锁

http://www.chinaunix.net/jh/22/20020.html

2.DB2中怎么知道表的锁定情况:

http://www.chinaunix.net/jh/22/16766.html


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9457021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存