Αναγν. άρθρου: 832524 - Τελευταία αναθεώρηση: Τετάρτη, 22 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0

Ενημερωτικό δελτίο του SQL Server και τεχνικής - πώς να επιλύσετε μια αδιέξοδη κατάσταση

Συμβουλή συστήματοςΑυτό το άρθρο ισχύει για διαφορετικό λειτουργικό σύστημα από αυτό που χρησιμοποιείτε. Το περιεχόμενο του άρθρου που ενδέχεται να μην σας αφορά έχει απενεργοποιηθεί.

Σε αυτήν τη σελίδα


Ανάπτυξη όλων | Σύμπτυξη όλων

Τεχνικό δελτίο του SQL Server

Το θέμα καλύπτονται σε αυτό το θέμα:Τον τρόπο επίλυσης ενός αδιεξόδου

Στόχος

Για να προσδιορίσετε, για την αντιμετώπιση προβλημάτων και για να προτείνει μια λύση για την επίλυση ενός αδιεξόδου.

ΕΙΣΑΓΩΓΗ

Αυτό το άρθρο εξετάζει μια αδιέξοδη κατάσταση και παρέχει βήματα για την επίλυση του αδιεξόδου. Κάθε αδιέξοδο ενδέχεται να διαφέρουν και μπορεί να προκληθεί από πολλές μεταβλητές διαφορετικό περιβάλλον. Οι πληροφορίες που παρέχονται σε αυτό το άρθρο μπορεί να σας βοηθήσει να αναγνωρίσετε και να επιλύσετε μια αδιέξοδη κατάσταση.

Μελέτη της υπόθεσης

Σε μια μελέτη της υπόθεσης, εμείς να εξετάσετε ένα σύστημα 911 που διαθέτει έξι τελεστές. Κατά τη διάρκεια της κορυφής δραστηριότητα, η εφαρμογή περιβάλλοντος χρήστη της Microsoft Visual Basic που χρησιμοποιούν αντιμετωπίζει κατεστραμμένες συνδέσεις. Εξαιτίας της κατεστραμμένες συνδέσεις, οι τελεστές πρέπει να re-input δεδομένα. Για ένα σύστημα 911 που λειτουργεί 24 ώρες το εικοσιτετράωρο, επτά ημέρες την εβδομάδα, αυτή η συμπεριφορά είναι αποδεκτή.

Τι είναι μια αδιέξοδη κατάσταση;

Μια αδιέξοδη κατάσταση συμβαίνει όταν δύο διεργασία διακομιστή συστήματος αναγνωριστικών (SPID) βρίσκονται σε αναμονή για έναν πόρο και να προχωρήσετε καμία διαδικασία, επειδή η διαδικασία αποτρέπει την λήψη του πόρου.

Η Διαχείριση κλειδώματος νήμα ελέγχει για προβλήματα. Όταν τον αλγόριθμο εντοπισμού αδιεξόδου διευθυντή κλείδωμα εντοπίσει μια αδιέξοδη κατάσταση, η Διαχείριση κλειδώματος από το SPID επιλέγει ως θύμα. Η Διαχείριση κλειδώματος προετοιμάζει ένα μήνυμα λάθους 1205 που αποστέλλεται στον υπολογιστή-πελάτη και η Διαχείριση κλειδώματος kills το SPID. Killing το SPID απελευθερώνει τους πόρους και επιτρέπει το SPID για να συνεχίσετε. Killing το SPID που είναι το θύμα αδιέξοδο είναι τι κάνει η κατεστραμμένη σύνδεση που αντιμετωπίζει η Visual Basic εφαρμογή περιβάλλοντος χρήστη.

Σε μια καλά σχεδιασμένη εφαρμογή, η εφαρμογή περιβάλλοντος χρήστη πρέπει να παγιδεύσει το λάθος 1205 επανασυνδεθείτε με τον SQL Server και επανυποβολή μετά τη συναλλαγή.

Παρόλο που μπορεί να ελαχιστοποιηθεί προβλήματα, αυτά δεν μπορούν να είναι εντελώς αποφεύγονται. Αυτό συμβαίνει γιατί η εφαρμογή περιβάλλοντος χρήστη πρέπει να είναι σχεδιασμένες για να χειριστείτε τα προβλήματα.

Τρόπος αναγνώρισης ενός αδιεξόδου

Βήμα 1

Για να προσδιορίσετε μια αδιέξοδη κατάσταση, πρέπει πρώτα να αποκτήσετε πληροφορίες του αρχείου καταγραφής. Εάν υποψιάζεστε ότι μια αδιέξοδη κατάσταση, θα πρέπει να συγκεντρώσετε πληροφορίες σχετικά με (SPID) και τους πόρους που εμπλέκονται σε αδιέξοδο του. Για να το κάνετε αυτό, προσθέστε το - T1204 και -T3605 παραμέτρους εκκίνησης στον SQL Server. Για να προσθέσετε αυτές τις δύο παραμέτρους εκκίνησης, ακολουθήστε τα εξής βήματα:
  • Εκκίνηση του SQL Server Enterprise Manager.
  • Επιλέξτε και, στη συνέχεια, κάντε δεξιό κλικ στο διακομιστή.
  • Κάντε κλικΙδιότητες (Properties).
  • Κάντε κλικΠαράμετροι εκκίνησης.
  • ΣτοΠαράμετροι εκκίνησηςπαράθυρο διαλόγου, πληκτρολογήστε-T1204ΣτοΠαράμετροιπλαίσιο κειμένου και στη συνέχεια κάντε κλικADD.
  • ΣτοΠαράμετροιπλαίσιο κειμένου, πληκτρολογήστε-T3605, και στη συνέχεια κάντε κλικ στο κουμπίADD.
  • Κάντε κλικOk.

Οι παράμετροι εκκίνησης θα τεθούν σε ισχύ όταν διακοπεί και στη συνέχεια επανεκκίνηση του SQL Server.

-T1204 εκκίνησης παράμετρος συλλέγει πληροφορίες σχετικά με τη διαδικασία και τους πόρους κατά τον αλγόριθμο εντοπισμού αδιεξόδου συναντά μια αδιέξοδη κατάσταση. -T3605 παράμετρο εκκίνησης καταγράφει αυτές τις πληροφορίες στα αρχεία καταγραφής σφαλμάτων του SQL Server.

-T1205 εκκίνησης συλλέγει πληροφορίες παραμέτρων κάθε φορά που ο αλγόριθμος αδιέξοδο ελέγχει για μια αδιέξοδη κατάσταση, όχι όταν παρουσιαστεί μια αδιέξοδη κατάσταση. Δεν χρειάζεται να χρησιμοποιήσετε την παράμετρο-T1205 εκκίνησης.

Εάν χρησιμοποιήσετε την παράμετρο εκκίνησης-T1205, ακολουθεί ένα δείγμα των δεδομένων εξόδου που θα υπάρχουν στο αρχείο καταγραφής σφαλμάτων του SQL Server:

2003-05-14 11:46:26.76 spid4     Starting deadlock search 1
2003-05-14 11:46:26.76 spid4     Target Resource Owner:
2003-05-14 11:46:26.76 spid4      ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x43CAB580) Value:0x42bdf340
2003-05-14 11:46:26.76 spid4      Node:1       ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x43CAB580) Value:0x42bdf340
2003-05-14 11:46:26.76 spid4     
2003-05-14 11:46:26.76 spid4     End deadlock search 1 ... a deadlock was not found.
2003-05-14 11:46:26.76 spid4     ----------------------------------
2003-05-14 11:46:31.76 spid4     ----------------------------------
2003-05-14 11:46:31.76 spid4     Starting deadlock search 2


Σε ορισμένες περιπτώσεις, ενδέχεται να μην μπορείτε να διακόψετε την και επανεκκινήστε το διακομιστή SQL. Στην περίπτωση αυτή, μπορείτε να χρησιμοποιήσετε το Query Analyzer για να εκτελέσετε την ακόλουθη εντολή για να ενεργοποιήσετε τις σημαίες εντοπισμού αδιεξόδου.

ΣΗΜΕΙΩΣΗΜε αυτόν τον τρόπο μπορείτε να συγκεντρώσετε πληροφορίες σχετικά με τα προβλήματα αμέσως. Το "-1" δηλώνει όλα τα SPID.

dbcc traceon (1204, 3605, -1)
go
dbcc tracestatus(-1)
go

Βήμα 2

Στη συνέχεια, θα πρέπει να συλλέξετε ένα ίχνος SQL Profiler. Εάν ενεργοποιήσετε τη σημαία παρακολούθησης αδιέξοδο, θα λάβετε τις περισσότερες από τις απαιτούμενες πληροφορίες, αλλά όχι πάντα. Για παράδειγμα, σε μια υπόθεση μελέτη τη σημαία παρακολούθησης εξόδου αναγνωρίζονται που έναsp_cursoropenσύστημα αποθηκευμένη διαδικασία και ένα "UPDATE tblQueuedEvents ρύθμιση notifyid = 3, ResynchDate" πρόταση που σχετίζεται με μια αδιέξοδη κατάσταση. Δυστυχώς, δεν γνωρίζετε τον ορισμό τουsp_cursoropenσύστημα αποθηκευμένης διαδικασίας. Δεν έχετε επίσης την πλήρη πρόταση UPDATE επειδή ήταν ακεραιοποιείται.

SQL Profiler can obtain the full statements in addition to the execution plans of the statements. A SQL Profiler trace also has a lock event for "deadlock" and for "deadlock chain." "Deadlock" corresponds to the -T1204 flag, and "deadlock chain" corresponds to the -T1205 flag. Turning on the deadlock trace flags and running a SQL Profiler trace during the occurrence of a deadlock should provide you the data that you must have to troubleshoot a deadlock. In this case, and in others, running SQL Profiler changes the timing of execution enough to prevent the deadlock. Therefore, you will typically capture the deadlock information with the trace flags, and then you run SQL Profiler.

Troubleshooting a deadlock

After a deadlock occurs, you can gather information about the deadlock by using thesqldiagutility and by using SQL Profiler. In the output of the SQLDiag.txt file, look for a "Wait-for-graph" entry. A "Wait-for graph" entry indicates that a deadlock was encountered.

The following is a sample of the output that you might see in the SQL Server error log when you use the -T1205 startup parameter.

2003-05-05 15:11:50.80 spid4    Wait-for graph
2003-05-05 15:11:50.80 spid4    Node:1
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x33AE1538) Value:0x193
2003-05-05 15:11:50.80 spid4    Victim Resource Owner:
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: X SPID:60 ECID:0 Ec:(0x1F1BB5B0) Value:0x193
2003-05-05 15:11:50.80 spid4    Requested By: 
2003-05-05 15:11:50.80 spid4    Input Buf: RPC Event: sp_cursoropen;1
2003-05-05 15:11:50.80 spid4    SPID: 55 ECID: 0 Statement Type: EXECUTE Line #: 1
2003-05-05 15:11:50.80 spid4    Owner:0x1937f2a0 Mode: S        Flg:0x0 Ref:1 Life:00000000 SPID:55 ECID:0
2003-05-05 15:11:50.80 spid4    Grant List 0::
2003-05-05 15:11:50.80 spid4    KEY: 8:1653632984:2 (da00ce043a9e) CleanCnt:1 Mode: U Fl ags: 0x0
 
2003-05-05 15:11:50.80 spid4    Node:2
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x33AE1538) Value:0x193
2003-05-05 15:11:50.80 spid4    Requested By: 
2003-05-05 15:11:50.80 spid4    Input Buf: Language Event: Update tblQueuedEvents Set NotifyID = 2, ResynchDate
2003-05-05 15:11:50.80 spid4    SPID: 60 ECID: 0 Statement Type: UPDATE Line #: 1
2003-05-05 15:11:50.80 spid4    Owner:0x1936e420 Mode: X        Flg:0x0 Ref:0 Life:02000000 SPID:60 ECID:0
2003-05-05 15:11:50.80 spid4    Grant List 0::
2003-05-05 15:11:50.80 spid4    KEY: 8:1653632984:1 (2d018af70d80) CleanCnt:1 Mode: X Flags: 0x0


In the "Wait-for-graph" entry, you have Node 1 and Node 2. In each node, you have a grant section and a request section. The grant section is the "Grant List", and the request section is the "Request By."
In each node, you can identify the following:
  • The SPID.
  • The command the SPID was executing.
  • The resource.
  • The lock mode on the resource.

For example, in Node 1, the Grant List, SPID 55 had been granted an update lock, Mode: U, on resource KEY: 8:1653632984:2. 8=DBID, 1653632984=ObjectID, and 2=Indid. To obtain the database identification number, run thesp_helpdbαποθηκευμένη διαδικασία. To obtain the table, run the following code:
select * from sysobjects where id = 1653632984


To obtain the index, run the following code:
select * from sysindexes where indid = 2 and id = 1653632984

If IndexId is equal to 2, you know the index is a nonclustered index. The command that SPID 55 was executing was thesp_cursoropenαποθηκευμένη διαδικασία.

In Node 2, the Grant List, SPID 60 has been granted an exclusive lock, Mode: X, on resource KEY: 8:1653632984:1. 8=DBID, 1653632984=ObjectID, 1=Indid. This is on the same table but index 1 is the clustered index. The command that SPID 60 was executing was:
Update tblQueuedEvents Set NotifyID = 2, ResynchDate

An IndexId that is equal to 1 is a clustered index.

An IndexId that is equal to 2 is a nonclustered index.

ΣΗΜΕΙΩΣΗDeadlocks are very time sensitive.

Next, in Node 1, Request By, SPID 55 requested a shared lock, Mode: S, on IndexId=1. In Node 2, Request By, SPID 60 requested an exclusive lock, Mode: X, on IndexId=2. Because these lock requests occur at the same time, the deadlock occurs. Each SPID’s granted locks are preventing the requested locks from continuing.

The following table shows the lock compatibility chart. For more information about lock compatibility, see the "Lock Compatibility" topic in SQL Server 2000 Books Online.

Lock compatibility chart
Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Requested modeISSUIXSIXX
Intent shared (IS)YESYESYESYESYESΟΧΙ,
Shared (S)YESYESYESΟΧΙ,ΟΧΙ,ΟΧΙ,
Update (U)YESYESΟΧΙ,ΟΧΙ,ΟΧΙ,ΟΧΙ,
Intent exclusive (IX)YESΟΧΙ,ΟΧΙ,YESΟΧΙ,ΟΧΙ,
Shared with intent exclusive (SIX)YESΟΧΙ,ΟΧΙ,ΟΧΙ,ΟΧΙ,ΟΧΙ,
Exclusive (X)ΟΧΙ,ΟΧΙ,ΟΧΙ,ΟΧΙ,ΟΧΙ,ΟΧΙ,


Next, by looking at the output, you identify ObjectId 1653632984 as thetblQueuedEventstable, and you obtain asp_helpstored procedure output for the table. There were two indexes on the table. The two indexes wereix_tblQueuedEventsANDPK_tblQueuedEvent.ix_tblQueuedEventsis a clustered index on ResynchDate, andPK_tblQueuedEventis a primary key, unique nonclustered index on EventSID.

Το ίχνος SQL Profiler δεν ήταν δυνατό να καταγράψει την εμφάνιση αδιεξόδου. Να θυμάστε προβλήματα είναι εξαρτάται πολύ χρόνο. Η επιβάρυνση της SQL Profiler προστίθενται μάλλον κάποιο χρόνο για την εκτέλεση μιας από τις διεργασίες και που εμποδίζεται γρήγορα σε μια κατάσταση αδιεξόδου SQL Profiler. Ωστόσο, αυτό παρείχε πληροφορίες που μπορείτε να χρησιμοποιήσετε για να αντιμετωπίσετε αυτό το ζήτημα. Εύρεση της πλήρους ενημέρωσηςtblQueuedEventsη δήλωση είναι παρόμοιο με το ακόλουθο:

Update tblQueuedEvents Set NotifyID = 2, ResynchDate = '5/7/2003 10:44:16' where eventSID = 73023
Βρίσκεται επίσης το σχέδιο εκτέλεσης. Δεν έχετε ακόμη την πλήρηsp_cursoropenαποθηκευμένη διαδικασία δήλωσης, αλλά διαθέτει επαρκείς πληροφορίες για να προτείνει μια λύση η οποία θα επιλύσει το αδιέξοδο.

Εδώ είναι το σχέδιο εκτέλεσης.

ΣΗΜΕΙΩΣΗΤο σχέδιο αυτό εκτέλεση συγκεκριμένης διαβάζεται δεξιά προς τα αριστερά και από κάτω προς τα επάνω.

StmtText                                                      
				                                                                           
				   
				                                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
				
Update tblQueuedEvents Set NotifyID = 2, ResynchDate = '5/7/2003 10:44:16'
				where eventSID = 73023                                                     
				   
				                    
|--Clustered Index
				Update(OBJECT:([SOTS].[dbo].[tblQueuedEvents].[ix_tblQueuedEvents ]),
				SET:([tblQueuedEvents].[NotifyID]=[@1],
				[tblQueuedEvents].[ResynchDate]=[Expr1004]))  
     |--Top(1)                                                                 
				                                                                           
				   
				               
           |--Compute Scalar(DEFINE:([Expr1004]=Convert([@2])))                
				                                                                           
				   
				                
                 |--Index
				Seek(OBJECT:([SOTS].[dbo].[tblQueuedEvents].[PK_tblQueuedEvents]),
				SEEK:([tblQueuedEvents].[EventSID]=[@3]) 

Προτείνουμε μια λύση για την επίλυση του αδιεξόδου

Σημειώστε ότι η πρόταση UPDATE εκτελεί "Ενημέρωση συγκεντρωτικό ευρετήριο" Συγκεντρωτικό ευρετήριο. Επομένως, το ευρετήριο nonclustered και το ευρετήριο συμπλέγματος πρέπει και τα δύο να ενημερωθούν. Συγκεντρωτικό ευρετήριο είναιix_tblQueuedEventsκαι ο δείκτης nonclusteredPK_tblQueuedEvents. Για να εκτελέσετε τις ενημερώσεις, η πρόταση UPDATE πρέπει να αποκτήσετε αποκλειστική κλειδώματα σε ευρετήρια και τα δύο. Τα ευρετήρια αυτά δύο είναι τα ευρετήρια που εμπλέκονται στη το αδιέξοδο. Εξετάζοντας τα ίχνη SQL Profiler, που δεν δείτε οποιαδήποτε ερωτήματα που χρησιμοποιούνται στο ResynchDate στον όρο WHERE. Όλες οι προτάσεις ήταν πολύ συγκεκριμένες και μπορούν να χρησιμοποιηθούν τα EventSID στον όρο WHERE. EventSID θα ήταν μια καλύτερη επιλογή από ένα συγκεντρωτικό ευρετήριο. Με αυτές τις πληροφορίες και μια συζήτηση με τον πελάτη, εμείς βρέθηκε ότι το ευρετήριο ResynchDate ήταν παλιά και δεν ήταν απαραίτητη. Που συνιστάται το αναπτυσσόμενο πελατών τουix_tblQueuedEventsτο ευρετήριο στο ResynchDate και θα κάνουνPK_tblQueuedEventένα ευρετήριο συμπλέγματος. Αυτό επιλύθηκε η αδιέξοδη κατάσταση.

Αυτό είναι μόνο ένα παράδειγμα ενός αδιεξόδου υπόθεσης που αφορά τα κλειδώματα. Επίσης περιλαμβάνουν parallelism, προβλήματα και να περιλαμβάνουν νημάτων. Αυτοί μπορούν να περιλαμβάνουν μία, δύο, τρεις, ή περισσότερες SPID και πόρους. Με κάθε περίπτωση αδιέξοδο, πρέπει να αποκτήσετε την έξοδο παράμετρο εκκίνησης –T1204 και την παρακολούθηση SQL Profiler για τον προσδιορισμό, για να αντιμετωπίσετε και να επιλύσετε το αδιέξοδο. Σας κατάσταση αδιεξόδου θα περιλαμβάνουν διάφορες διαδικασίες και τους πόρους. Επομένως, λύσεις διαφέρουν από σε περίπτωση. Τυπικές μέθοδοι που μπορείτε να χρησιμοποιήσετε για να επιλύσετε προβλήματα περιλαμβάνουν:
  • Προσθήκη και απόθεση ευρετηρίων.
  • Προσθήκη υποδείξεων στο ευρετήριο.
  • Τροποποίηση της εφαρμογής για πρόσβαση σε πόρους σε ένα παρόμοιο μοτίβο.
  • Κατάργηση της δραστηριότητας από τη συναλλαγή, όπως τα εναύσματα. Από προεπιλογή, οι συναλλαγής εναυσμάτων.
  • Διατηρώντας τις συναλλαγές ως μικρά όσο το δυνατό.

Επιπλέον ανάγνωσης

Για περισσότερες πληροφορίες σχετικά με τα προβλήματα, επισκεφθείτε τις ακόλουθες τοποθεσίες της Microsoft στο Web:

http://msdn2.Microsoft.com/en-us/library/Aa213040 (http://msdn2.microsoft.com/en-us/library/Aa213040)

.aspx http://msdn2.Microsoft.com/en-us/library/aa213042 (SQL.80) (http://msdn2.microsoft.com/en-us/library/aa213042(SQL.80).aspx)

.aspx http://msdn2.Microsoft.com/en-us/library/aa213028 (SQL.80) (http://msdn2.microsoft.com/en-us/library/aa213028(SQL.80).aspx)

.aspx http://msdn2.Microsoft.com/en-us/library/aa937573 (SQL.80) (http://msdn2.microsoft.com/en-us/library/aa937573(SQL.80).aspx)

.aspx http://msdn2.Microsoft.com/en-us/library/aa213041 (SQL.80) (http://msdn2.microsoft.com/en-us/library/aa213041(SQL.80).aspx)

Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft SQL Server 2000 Standard Edition
Μηχανικά μεταφρασμένοΜηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:832524  (http://support.microsoft.com/kb/832524/en-us/ )