IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Processus bloquant la base


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut Processus bloquant la base
    Bonjour à tous,


    J'ai récupéré les informations sur internet pour arriver à identifier quel processus bloque notre base de donnée:

    Voici le Script vbs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Option Explicit
    Dim strConnection, conn, rs, strSQL, objWMIService, objProcess, colProcess, User, Domain, Rtn
     Dim server, login, mdp, database, strComputer, strList, hostprocess, strMatricule
    server = inputbox( "Nom du serveur SQL", "Input","" )
    login = inputbox( "Nom Utilisateur SQL", "Input","" )
    mdp = inputbox( "Mot de passe SQL", "Input","" )
    database = inputbox( "bdd", "Input","master" )
    strConnection = "Driver={SQL Server};Server=" & server & ";Database=" & database & ";Uid="& login & ";Pwd=" & mdp & ";"
     
     
    Set conn = Wscript.CreateObject("ADODB.Connection")
    conn.Open strConnection
     
    Set rs = Wscript.CreateObject("ADODB.recordset")
    strSQL = "select LTRIM(RTRIM(hostname)) as 'hostname', LTRIM(RTRIM(hostprocess)) as 'hostprocess' from sysprocesses where dbid=DB_ID('IcarDMS') and kpid > '0' and blocked >'0'"
    rs.open strSQL, conn, 3,3
     
    rs.MoveFirst
    strMatricule = ">>>" & rs.fields("hostname") & "-" &  rs.fields("hostprocess")
    MsgBox (strMatricule)
    '-------------------
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & rs.fields("hostname") & "\root\cimv2")
    Set colProcess = objWMIService.ExecQuery ("Select * from Win32_Process WHERE ProcessId="& rs.fields("hostprocess") &"")
    For Each objProcess in colProcess
        If objProcess.GetOwner ( User, Domain ) = 0 Then
              strList = strList & vbCr & "Processus " & objProcess.Caption & " Executé " & Domain & "\" & User & "sur le serveur" & rs.fields("hostname") & "-" & rs.fields("hostprocess")
        Else
              strList = strList & vbCr & "Problem " & Rtn & " getting the owner for process " & objProcess.Caption
        End If
    'strList = strList & vbCr & objProcess.Name & "-" & objProcess.ProcessId
    Next
    WSCript.Echo strList
     
    '----------- 
     
     
    rs.Close
    Set rs = Nothing
     
    conn.Close
    Set conn = Nothing

    Je voudrais savoir si mon code est correcte? (Si j'ai pas commis erreur, qui pourrai bloquer le script)
    Est-il possible de savoir a quel moment le processus c'est bloqué jour/heure?

    Merci d'avance pour vos conseils et votre aide

    guigui69

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Si vous travaillez avec SQL Server 2000 ou version antérieure, c'est OK, sinon la table sysprocesses est obsolète depuis la version 2005 et votre code doit utiliser les vues sys.dm_exec_connections, sys.dm_exec_sessions, sys.dm_exec_requests...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre Expert
    Homme Profil pro
    DBA SQL Server
    Inscrit en
    Octobre 2012
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA SQL Server
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 862
    Par défaut
    sp_who2 ne vous aiderait pas pour faire ce que vous voulez ? Elle donne aussi les infos sur les process bloqués par xxxx

    Il y a aussi sp_WhoIsActive de Brent Ozar.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut
    Bonjour,

    Nous sommes en SQL 2008R2

    Je voudrais aussi arriver à récupérer la requête sql en entier qui block. Est possible ?



    guigui69

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut
    Bonjour,

    j'ai commencé à chercher sur "internet"



    J'ai trouvé ceci qui permet d'indiquer un blocage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *  FROM sys.dm_exec_requests WHERE blocking_session_id <> 0;

    J'ai trouvé aussi cette table qui ressort à la requête SQL

    J'ai vu des exemple sur internet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    SELECT
       r.session_id,
       r.request_id as session_request_id,
       --r.connection_id,
       r.status,
       s.host_name,
       c.client_net_address,
       CASE WHEN s.login_name = s.original_login_name THEN s.login_name ELSE s.login_name + ' (' + s.original_login_name + ')' END as login_name,
       s.program_name,
       db_name(r.database_id) as database_name,
     
       r.command,
       --r.sql_handle,
       --r.statement_start_offset,
       --r.statement_end_offset,
       --r.plan_handle,
       substring(st.text,r.statement_start_offset/2 ,(CASE WHEN r.statement_end_offset = -1 THEN len(convert(nvarchar(max), st.text)) * 2 ELSE r.statement_end_offset END - r.statement_start_offset)/2) as statement,
       --st.text as query_text, 
       --qp.query_plan as xml_query_plan,
     
       r.start_time,
       r.total_elapsed_time as total_elapsed_time_ms,
       r.cpu_time as cpu_time_ms,
       r.wait_type as current_wait_type,
       r.wait_resource as current_wait_resource,
       r.wait_time as current_wait_time_ms,
       r.last_wait_type,
       r.blocking_session_id,
     
       r.reads,
       r.writes,
       r.logical_reads,
     
       r.row_count,
       r.prev_error,
       r.nest_level,
       r.granted_query_memory,
       r.executing_managed_code,
     
       r.transaction_id,
       r.open_transaction_count,
       r.open_resultset_count,
       r.scheduler_id
     
     
    FROM
       sys.dm_exec_requests r
          LEFT OUTER JOIN sys.dm_exec_sessions s on s.session_id = r.session_id
          LEFT OUTER JOIN sys.dm_exec_connections c on c.connection_id = r.connection_id       
          CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) st 
          CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) qp
    WHERE
       r.status = N'suspended';
    Je ne comprend les 2 termes CROSS APPLY......
    Et est-ce que cette requête peut répondre à ma demande.

    Merci pour vos explications


    guigui69

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    sys.dm_exec_sql_text et sys.dm_exec_query_plan ne sont pas des tables mais des fonctions tables et CROSS APPLY sert à "appliquer" ces fonctions avec les paramètres transmis (handle) et faire le produit cartésien résultant de l'appel de fonction.

    Plus simplement, cette rerquête là fait le job :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DB_NAME(TL.resource_database_id) as DATABASE_NAME,
           TL.request_mode as LOCK_MODE,
           TL.request_session_id AS BLOQUEE,
           WT.blocking_session_id AS BLOQUEUR
    FROM   sys.dm_tran_locks as TL
           INNER JOIN sys.dm_os_waiting_tasks as WT 
    	          ON TL.lock_owner_address = WT.resource_address;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/03/2015, 08h53
  2. Processus bloquant un fichier
    Par KORTA dans le forum Windows XP
    Réponses: 8
    Dernier message: 04/09/2012, 12h55
  3. [Débutant] Processus bloquant un autre
    Par mecyber25 dans le forum C#
    Réponses: 2
    Dernier message: 22/03/2012, 09h43
  4. appel de processus bloquant et application qui gèle
    Par phoenixatareva dans le forum VB.NET
    Réponses: 2
    Dernier message: 09/08/2010, 20h33
  5. Obtenir la liste des processus tournant sous une base oracle
    Par mikawell3000 dans le forum Oracle
    Réponses: 8
    Dernier message: 26/07/2007, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo