Αναγν. άρθρου: 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. -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. Βήμα 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 deadlockAfter 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:
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: To obtain the index, run the following code: 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: 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 Σύμπτυξη αυτού του πίνακα
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η δήλωση είναι παρόμοιο με το ακόλουθο: Εδώ είναι το σχέδιο εκτέλεσης. ΣΗΜΕΙΩΣΗΤο σχέδιο αυτό εκτέλεση συγκεκριμένης διαβάζεται δεξιά προς τα αριστερά και από κάτω προς τα επάνω. 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 και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης. Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:832524
(http://support.microsoft.com/kb/832524/en-us/
)
| Άλλοι πόροι Tοποθεσίες υποστήριξης
ΚοινότηταΆμεση λήψη βοήθειαςΜεταφράσεις άρθρων
|






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email


Επιστροφή στην αρχή
