Αποκρυπτογράφηση κλειδιού και πόρου αναμονής σελίδας σε αδιέξοδα και κλειδώματα

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

Waitresource="PAGE: 6:3:70133"

waitresource=“KEY: 6:72057594041991168 (ce52f92a058c)“

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

Αυτό το κείμενο θα σας βοηθήσει να τα αποκρυπτογραφήσετε.

Όλες οι πληροφορίες που υπάρχουν εδώ υπάρχουν στο Διαδίκτυο σε διάφορα μέρη, απλά είναι πολύ διαδεδομένες! Θέλω να τα συνδυάσω όλα μαζί, από DBCC PAGE έως hobt_id έως τις μη τεκμηριωμένες συναρτήσεις %%physloc%% και %%lockres%%.

Αρχικά, ας μιλήσουμε για τις αναμονές στα κλείδωμα ΣΕΛΙΔΩΝ και, στη συνέχεια, ας προχωρήσουμε στα κλειδώματα KEY.

1) waitresource="PAGE: 6:3:70133" = Database_Id: FileId: Page Number

Εάν το αίτημά σας περιμένει σε ένα κλείδωμα ΣΕΛΙΔΑΣ, ο SQL Server θα σας δώσει τη διεύθυνση αυτής της σελίδας.

Αναλύοντας το "PAGE: 6:3:70133" παίρνουμε:

  • Αναγνωριστικό_βάσης δεδομένων = 6
  • data_file_id = 3
  • αριθμός_σελίδας = 70133

1.1) Αποκρυπτογράφηση database_id

Βρείτε το όνομα της βάσης δεδομένων χρησιμοποιώντας το ερώτημα:

SELECT 
    name 
FROM sys.databases 
WHERE database_id=6;
GO

Είναι δημόσιο DB WideWorldImporters στον SQL Server μου.

1.2) Ψάχνετε για το όνομα του αρχείου δεδομένων - εάν σας ενδιαφέρει

Θα χρησιμοποιήσουμε data_file_id στο επόμενο βήμα για να βρούμε το όνομα του πίνακα. Μπορείτε απλώς να μεταβείτε στο επόμενο βήμα, αλλά αν σας ενδιαφέρει το όνομα του αρχείου, μπορείτε να το βρείτε εκτελώντας ένα ερώτημα στο πλαίσιο της βάσης δεδομένων που βρέθηκε, αντικαθιστώντας το data_file_id σε αυτό το ερώτημα:

USE WideWorldImporters;
GO
SELECT 
    name, 
    physical_name
FROM sys.database_files
WHERE file_id = 3;
GO

Στη βάση δεδομένων WideWorldImporters αυτό είναι ένα αρχείο που ονομάζεται WWI_UserData και το έχω επαναφέρει στο C:MSSQLDATAWideWorldImporters_UserData.ndf. (Ωχ, με πιάσατε να βάζω αρχεία στη μονάδα δίσκου συστήματος! Όχι! Είναι ντροπιαστικό).

1.3) Λήψη ονόματος αντικειμένου από τη σελίδα DBCC

Τώρα γνωρίζουμε ότι η σελίδα #70133 στο αρχείο δεδομένων 3 ανήκει στη βάση δεδομένων WorldWideImporters. Μπορούμε να δούμε τα περιεχόμενα αυτής της σελίδας χρησιμοποιώντας το μη τεκμηριωμένο DBCC PAGE και το trace flag 3604.
Σημείωση: Προτιμώ να χρησιμοποιήσω το DBCC PAGE σε ένα αποκατεστημένο αντίγραφο κάπου σε άλλο διακομιστή, επειδή είναι μη τεκμηριωμένα πράγματα. Σε ορισμένες περιπτώσεις, αυτή μπορεί να οδηγήσει σε χωματερή (περίπου. μεταφραστής - ο σύνδεσμος, δυστυχώς, δεν οδηγεί πουθενά, αλλά κρίνοντας από το url, μιλάμε για φιλτραρισμένα ευρετήρια).

/* This trace flag makes DBCC PAGE output go to our Messages tab
instead of the SQL Server Error Log file */
DBCC TRACEON (3604);
GO
/* DBCC PAGE (DatabaseName, FileNumber, PageNumber, DumpStyle)*/
DBCC PAGE ('WideWorldImporters',3,70133,2);
GO

Με κύλιση στα αποτελέσματα, μπορείτε να βρείτε το object_id και το index_id.
Αποκρυπτογράφηση κλειδιού και πόρου αναμονής σελίδας σε αδιέξοδα και κλειδώματα
Σχεδόν τελείωσα! Τώρα μπορείτε να βρείτε τα ονόματα του πίνακα και του ευρετηρίου με ένα ερώτημα:

USE WideWorldImporters;
GO
SELECT 
    sc.name as schema_name, 
    so.name as object_name, 
    si.name as index_name
FROM sys.objects as so 
JOIN sys.indexes as si on 
    so.object_id=si.object_id
JOIN sys.schemas AS sc on 
    so.schema_id=sc.schema_id
WHERE 
    so.object_id = 94623380
    and si.index_id = 1;
GO

Και εδώ βλέπουμε ότι η αναμονή στο κλείδωμα ήταν στο ευρετήριο PK_Sales_OrderLines του πίνακα Sales.OrderLines.

Σημείωση: Στον SQL Server 2014 και μεταγενέστερη έκδοση, το όνομα του αντικειμένου μπορεί επίσης να βρεθεί χρησιμοποιώντας το μη τεκμηριωμένο DMO sys.dm_db_database_page_allocations. Αλλά πρέπει να ρωτήσετε κάθε σελίδα στη βάση δεδομένων, κάτι που δεν φαίνεται πολύ ωραίο για μεγάλες βάσεις δεδομένων, γι' αυτό χρησιμοποίησα το DBCC PAGE.

1.4) Είναι δυνατό να δείτε τα δεδομένα στη σελίδα που αποκλείστηκε;

Nuuu, ναι. Αλλά… είστε σίγουροι ότι το χρειάζεστε πραγματικά;
Είναι αργό ακόμα και σε μικρά τραπέζια. Αλλά είναι κάπως ωραίο, οπότε αφού έχετε διαβάσει μέχρι εδώ...ας μιλήσουμε για %%physloc%%!

Το %%physloc%% είναι ένα μαγικό κομμάτι χωρίς έγγραφα που επιστρέφει ένα φυσικό αναγνωριστικό για κάθε καταχώρηση. μπορείς να χρησιμοποιήσεις %%physloc%% μαζί με το sys.fn_PhysLocFormatter στον SQL Server 2008 και μεταγενέστερα.

Τώρα που γνωρίζουμε ότι θέλαμε να αποκλείσουμε τη σελίδα στο Sales.OrderLines, μπορούμε να δούμε όλα τα δεδομένα σε αυτόν τον πίνακα, ο οποίος είναι αποθηκευμένος στο αρχείο δεδομένων #3 στη σελίδα #70133, με το ακόλουθο ερώτημα:

Use WideWorldImporters;
GO
SELECT 
    sys.fn_PhysLocFormatter (%%physloc%%),
    *
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO

Όπως είπα, είναι αργό ακόμα και σε μικροσκοπικά τραπέζια. Πρόσθεσα το NOLOCK στο αίτημα επειδή δεν έχουμε ακόμα καμία εγγύηση ότι τα δεδομένα που θέλουμε να εξετάσουμε είναι ακριβώς τα ίδια με αυτά τη στιγμή που ανακαλύφθηκε η κλειδαριά - ώστε να μπορούμε με ασφάλεια να κάνουμε βρώμικες αναγνώσεις.
Αλλά, ρε, το ερώτημα μου επιστρέφει τις 25 σειρές για τις οποίες αγωνίστηκε το ερώτημά μας.
Αποκρυπτογράφηση κλειδιού και πόρου αναμονής σελίδας σε αδιέξοδα και κλειδώματα
Αρκετά για τα κλειδώματα PAGE. Τι γίνεται αν περιμένουμε κλειδαριά KEY;

2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (μαγικός κατακερματισμός που μπορεί να αποκρυπτογραφηθεί με %%lockres%% αν το θέλετε πραγματικά)

Εάν το ερώτημά σας προσπαθήσει να κλειδώσει σε μια καταχώρηση ευρετηρίου και κλειδωθεί από μόνο του, λαμβάνετε έναν εντελώς διαφορετικό τύπο διεύθυνσης.
Σπάζοντας το "6:72057594041991168 (ce52f92a058c)" σε μέρη, παίρνουμε:

  • Αναγνωριστικό_βάσης δεδομένων = 6
  • hobt_id = 72057594041991168
  • μαγικός κατακερματισμός = (ce52f92a058c)

2.1) Αποκρυπτογράφηση database_id

Λειτουργεί ακριβώς όπως στο παραπάνω παράδειγμα! Βρίσκουμε το όνομα της βάσης δεδομένων χρησιμοποιώντας το ερώτημα:

SELECT 
    name 
FROM sys.databases 
WHERE database_id=6;
GO

Στην περίπτωσή μου είναι το ίδιο DB WideWorldImporters.

2.2) Αποκρυπτογράφηση hobt_id

Στο πλαίσιο της βάσης δεδομένων που βρέθηκε, πρέπει να υποβάλετε ερώτημα στο sys.partitions με μερικές συνδέσεις που θα βοηθήσουν στον προσδιορισμό των ονομάτων του πίνακα και του ευρετηρίου ...

USE WideWorldImporters;
GO
SELECT 
    sc.name as schema_name, 
    so.name as object_name, 
    si.name as index_name
FROM sys.partitions AS p
JOIN sys.objects as so on 
    p.object_id=so.object_id
JOIN sys.indexes as si on 
    p.index_id=si.index_id and 
    p.object_id=si.object_id
JOIN sys.schemas AS sc on 
    so.schema_id=sc.schema_id
WHERE hobt_id = 72057594041991168;
GO

Μου λέει ότι το αίτημα περίμενε στο κλείδωμα Application.Countries χρησιμοποιώντας το ευρετήριο PK_Application_Countries.

2.3) Τώρα για κάποια %%lockres%% μαγεία - αν θέλετε να μάθετε ποια καταχώρηση κλειδώθηκε

Αν πραγματικά θέλω να μάθω σε ποια σειρά χρειαζόταν η κλειδαριά, μπορώ να το μάθω ρωτώντας τον ίδιο τον πίνακα. Μπορούμε να χρησιμοποιήσουμε τη συνάρτηση %%lockres%% χωρίς έγγραφα για να βρούμε μια καταχώρηση που ταιριάζει με το μαγικό κατακερματισμό.
Λάβετε υπόψη ότι αυτό το ερώτημα θα σαρώσει ολόκληρο τον πίνακα και σε μεγάλα τραπέζια αυτό μπορεί να μην είναι καθόλου διασκεδαστικό:

SELECT
    *
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO

πρόσθεσα το NOLOCK (κατόπιν συμβουλής του Klaus Aschenbrenner στο twitter) γιατί οι κλειδαριές μπορεί να είναι πρόβλημα. Θέλουμε απλώς να δούμε τι υπάρχει τώρα και όχι τι υπήρχε όταν ξεκίνησε η συναλλαγή - δεν νομίζω ότι η συνέπεια των δεδομένων είναι σημαντική για εμάς.
Voila, ο δίσκος για τον οποίο παλέψαμε!
Αποκρυπτογράφηση κλειδιού και πόρου αναμονής σελίδας σε αδιέξοδα και κλειδώματα

Ευχαριστίες και περαιτέρω ανάγνωση

Δεν θυμάμαι ποιος περιέγραψε πρώτος πολλά από αυτά τα πράγματα, αλλά εδώ είναι δύο δημοσιεύσεις σχετικά με τα λιγότερο τεκμηριωμένα πράγματα που μπορεί να σας αρέσουν:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο