16 novembre 2010

Résoudre un verrouillage sur DB2

1 - Bilan


  db2pd -wlocks -db $DB2DBDFT

Cette commande liste les "applications DB2" (champ AppHandl) à la source d'un verrouillage et celles en attente de la levée du verrou. Si la commande n'affiche qu'une ligne avec l'heure - il n'y a pas de verrou - l'éventuel blocage n'est pas dû à DB2.



exemple :
  Database Partition 0 - Database HRADEV - Active - Up 0 days 10:38:38
 
  Locks being waited on :
  AppHandl [nod-index] TranHdl    Lockname                   Type    Mode Conv Sts CoorEDU    AppName  AuthID   AppID
  21917    [000-21917] 8          00020004000000000840000652 Row     ..X       G   5160       db2bp    HRADEV   *LOCAL.db2inst.100907081854
  22211    [000-22211] 2          00020004000000000840000652 Row     .NS       W   5913       db2bp    HRADEV   *LOCAL.db2inst.100907073126
  ...

2 - Détail

  db2pd -wlocks -db $DB2DBDFT | grep ^[0-9]| cut -d' ' -f1 | sort -u | while read AppHandl
  do
     echo "$AppHandl \c"
     db2pd -apinfo $AppHandl  -db $DB2DBDFT | grep 'Application Status'
  done

Cette boucle affiche le statut des applications DB2 listée par la commande précédente. Celles indiquant "Lock-wait" sont en attente. Logiquement celle qui ne l'est pas (en espérant qu'elle soit unique) est à la source du blocage.

exemple :
  21917    Application Status :     UOW-Waiting
  22211 Application Status :     Lock-wait
  22227 Application Status :     Lock-wait
  22507 Application Status :     Lock-wait
  22868 Application Status :     Lock-wait
  22989 Application Status :     Lock-wait

3 - Analyse

  db2pd  -db HRADEV -apinfo 21917

  Database Partition 0 - Database HRADEV - Active - Up 0 days 10:38:38
 
  Application :
  Address :                0x07800000010D3260
  AppHandl [nod-index] :   21917    [000-21917]
  TranHdl :                11
  Application PID :        635088
  Application Node Name :  unxdev
  IP Address:              n/a
  Connection Start Time :  (1283847533)Tue Sep  7 10:18:53 2010
  Client User ID :         hradev
  System Auth ID :         HRADEV
  Coordinator EDU ID :     10839
  Coordinator Partition :  0
  Number of Agents :       1
  Locks timeout value :    NotSet
  Locks Escalation :       No
  Workload ID :            1
  Workload Occurrence ID : 210
  Trusted Context :        n/a
  Connection Trust Type :  non trusted
  Role Inherited :         n/a
  Application Status :     UOW-Waiting
  Application Name :       db2bp
  Application ID :         *LOCAL.db2inst.100907081854
  ClientUserID :           n/a
  ClientWrkstnName :       n/a
  ClientApplName :         n/a
  ClientAccntng :          n/a

Cette commande permet de savoir ce que fait le traitement ... ici db2bp (background process db2) ... En l'occurrence une session SQL interactive. Sur un exemple ci dessous, ou voit que l'application DB2 est déclenchée par un RTSDGN (programme TYBXBGV)

  Application :
  Address :                0x0780000001166440
  AppHandl [nod-index] :   39810    [000-39810]
  TranHdl :                8
  Application PID :        1044586
  Application Node Name :  unxdev
  IP Address:              n/a
  Connection Start Time :  (1283947142)Wed Sep  8 13:59:02 2010
  Client User ID :         hradev
  System Auth ID :         HRADEV
  Coordinator EDU ID :     19909
  Coordinator Partition :  0
  Number of Agents :       1
  Locks timeout value :    NotSet
  Locks Escalation :       No
  Workload ID :            1
  Workload Occurrence ID : 34
  Trusted Context :        n/a
  Connection Trust Type :  non trusted
  Role Inherited :         n/a
  Application Status :     UOW-Executing
  Application Name :       RTSDGN
  Application ID :         *LOCAL.db2inst.100908115903
  ClientUserID :           n/a
  ClientWrkstnName :       n/a
  ClientApplName :         n/a
  ClientAccntng :          n/a
 
    List of active statements :
   *UOW-ID :          326
    Activity ID :     6
    Package Schema :  HR
    Package Name :    TYBXBGV
    Package Version :
    Section Number :  7
    SQL Type :        Static
    Isolation :       UR
    Statement Type :  DML, Select (blockable)

4 -     Contrôle de présence du processus db2bp :

  ps -fp 635088
    UID     PID    PPID   C    STIME    TTY  TIME CMD
  hradev  635088       1   0 10:18:52      -  0:00 /home/db2inst/sqllib/bin/db2bp 1335542A13 5 A

Il se trouve que le paramètre du db2bp affiché est le PID du processus père (suivi ici de A13) : 1335542. Affichez les propriétés du processus, déterminez son propriétaire (numéro de terminal) :

  ps -fp 1335542
    UID     PID    PPID   C    STIME    TTY  TIME CMD
  hradev 1335542       1   0 10:18:51      -  pts/19  0:00 -ksh

Ici le terminal est le pts/19. Pour savoir qui en est propriétaire (cela n'a un intérêt que si l'on utilise des comptes Unix nominatifs).

  who -X | grep pts/19
  pts/19      Sep 23 14:15   jduchemin   (192.168.141.73)

  grep ^jduchemin /etc/passwd | cut -d: -f5
  FR/Compte Admin Jean DUCHEMIN
   
Contacter la personne concernée pour lui demander de faire un "commit" ou "rollback" de son SQL.

5 - Terminaison

Si l'on souhaite forcer la fin du traitement, utiliser la commande FORCE - dans notre exemple : db2 "force application (21917)". Si cela est sans effet ... passer à la suite :

Contrôle de présence du processus :
  ps -fp 635088
    UID     PID    PPID   C    STIME    TTY  TIME CMD
  hradev  635088       1   0 10:18:52      -  0:00 /home/db2inst/sqllib/bin/db2bp 1335542A13 5 A

Assassinat :
  kill -9 635088
  ps -fp 635088
     UID     PID    PPID   C    STIME    TTY  TIME CMD

Aucun commentaire:

Enregistrer un commentaire