Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule wyjaśniono, jak diagnostyka programu SQL Server pomaga wykrywać nieraportowane problemy z danymi wejściowymi lub wyjściowymi, które występują z powodu nieaktualnych odczytów lub utraconych zapisów.
Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 826433
Symptomy
Jeśli system operacyjny, sterownik lub problemy sprzętowe powodują utratę warunków zapisu lub nieaktualnego odczytu w ścieżce we/wy, mogą zostać wyświetlone komunikaty o błędach związane z integralnością danych, takie jak błędy 605, 823, 3448 i 3456 w programie SQL Server. Mogą pojawić się komunikaty o błędach podobne do następujących przykładów:
2003-07-24 16:43:04.57 spid63 Getpage: bstat=0x9, sstat=0x800, cache
2003-07-24 16:43:04.57 spid63 pageno is/should be: objid is/should be:
2003-07-24 16:43:04.57 spid63 (1:7040966)/(1:7040966) 2093354622/2039782424
2003-07-24 16:43:04.57 spid63 ... IAM indicates that page is allocated to this object
2003-07-24 16:52:37.67 spid63 Error: 605, Severity: 21, State: 1
2003-07-24 16:52:37.67 spid63 Attempt to fetch logical page (1:7040966) in database 'pubs' belongs to object 'authors', not to object 'titles'..
2003-07-24 16:52:40.99 spid63 Error: 3448, Severity: 21, State: 1
2003-07-24 16:52:40.99 spid63 Could not undo log record (63361:16876:181), for transaction ID (0:159696956), on page (1:7040977), database 'pubs' (database ID 12). Page information: LSN = (63192:958360:10), type = 2. Log information: OpCode = 2, context 1..
2003-07-09 14:31:35.92 spid66 Error: 823, Severity: 24, State: 2
2003-07-09 14:31:35.92 spid66 I/O error (bad page ID) detected during read at offset 0x00000016774000 in file 'h:\sql\MSSQL\data\tempdb.mdf'..
2010-02-06 15:57:24.14 spid17s Error: 3456, Severity: 21, State: 1.
2010-02-06 15:57:24.14 spid17s Could not redo log record (58997:5252:28), for transaction ID (0:109000187), on page (1:480946), database 'MyDatabase' (database ID 17). Page: LSN = (58997:5234:17), type = 3. Log: OpCode = 2, context 5, PrevPageLSN: (58997:5243:17). Restore from a backup of the database, or repair the database.
Nowe możliwości diagnostyczne we/wy w programie SQL Server
Program SQL Server wprowadził nowe funkcje diagnostyczne we/wy, począwszy od programu SQL Server 2000 z dodatkiem Service Pack 4, a od tego czasu ta diagnostyka jest częścią produktu. Te możliwości zostały zaprojektowane w celu ułatwienia wykrywania zewnętrznych problemów związanych z we/wy oraz rozwiązywania problemów z komunikatami o błędach opisanymi w sekcji Objawy .
Jeśli zostanie wyświetlony którykolwiek z komunikatów o błędach wymienionych w sekcji Objawy i nie zostaną wyjaśnione przez zdarzenie takie jak awaria dysku fizycznego, przejrzyj wszystkie znane problemy z programem SQL Server, systemem operacyjnym, sterownikami i sprzętem. Diagnostyka próbuje podać informacje o następujących dwóch warunkach:
Utracony zapis: Pomyślne wywołanie interfejsu API WriteFile, ale system operacyjny, sterownik lub kontroler buforowania nie opróżnia poprawnie danych do nośnika fizycznego, mimo że program SQL Server informuje o pomyślnym zapisie.
Nieodświeżony odczyt: Pomyślne wywołanie interfejsu API ReadFile, ale system operacyjny, sterownik lub kontroler buforowania niepoprawnie zwraca starszą wersję danych.
Aby zilustrować, firma Microsoft potwierdziła scenariusze, w których wywołanie interfejsu API WriteFile zwraca stan powodzenia, ale natychmiastowe pomyślne odczytanie tego samego bloku danych zwraca starsze dane, w tym dane, które prawdopodobnie są przechowywane w sprzętowej pamięci podręcznej odczytu. Czasami ten problem występuje z powodu problemu z pamięcią podręczną odczytu. W innych przypadkach dane zapisu nigdy nie są zapisywane na dysku fizycznym.
Jak włączyć diagnostykę
W programie SQL Server 2017 i nowszych wersjach ta funkcja diagnostyczna jest domyślnie włączona. W programie SQL Server 2016 i starszych wersjach te diagnostyki można włączyć tylko za pomocą flagi śledzenia 818. Możesz określić flagę śledzenia 818 jako parametr uruchamiania -T818 dla wystąpienia programu SQL Server lub uruchomić następującą instrukcję języka T-SQL, aby włączyć je w czasie wykonywania:
DBCC TRACEON(818, -1)
Flaga śledzenia 818 umożliwia bufor pierścienia w pamięci używany do śledzenia ostatnich 2048 pomyślnych operacji zapisu wykonywanych przez komputer z uruchomionym programem SQL Server, a nie w tym operacji we/wy sortowania i pliku roboczego. Gdy wystąpią błędy, takie jak 605, 823 lub 3448, wartość sekwencji dzienników (LSN) buforu przychodzącego jest porównywana z ostatnią listą zapisu. Jeśli nazwa LSN pobrana podczas operacji odczytu jest starsza niż ta używana w operacji zapisu, w dzienniku błędów programu SQL Server jest rejestrowany nowy komunikat o błędzie. Większość operacji zapisu programu SQL Server odbywa się jako punkty kontrolne lub jako leniwe zapisy (z opóźnieniem zapisu jest zadaniem w tle, które używa asynchronicznego we/wy). Implementacja buforu pierścieniowego jest uproszczona, a wpływ wydajności na system jest niewielki.
Szczegółowe informacje o komunikacie w dzienniku błędów
Poniższy komunikat nie pokazuje żadnych jawnych błędów z interfejsu API WriteFile ani wywołań interfejsu API ReadFile, które program SQL Server. Zamiast tego pokazuje logiczny błąd we/wy, który spowodował przejrzenie nazwy LSN, a oczekiwana wartość nie była poprawna:
Począwszy od programu SQL Server 2005, wyświetlany jest komunikat o błędzie:
Program SQL Server wykrył błąd we/wy oparty na spójności logicznej: Nieaktualny odczyt. Wystąpił podczas
<Read/Write>
strony w identyfikatorze<DBID>
bazy danych przy przesunięcie<PHYSICAL OFFSET>
w pliku<FILE NAME>
<PAGEID>
. Dodatkowe komunikaty w dzienniku błędów programu SQL Server lub dzienniku zdarzeń systemu mogą zawierać więcej szczegółów. Jest to poważny stan błędu, który zagraża integralności bazy danych i musi zostać natychmiast poprawiony. Wykonaj pełne sprawdzanie spójności bazy danych (DBCC CHECKDB). Ten błąd może być spowodowany wieloma czynnikami. Aby uzyskać więcej informacji, zobacz Sql Server Books Online.
Aby uzyskać więcej informacji na temat błędu 824, zobacz MSSQLSERVER_824.
W momencie lub raportowaniu tego błędu pamięć podręczna odczytu zawiera starszą wersję strony lub dane nie zostały poprawnie zapisane na dysku fizycznym. W obu przypadkach (utracony zapis lub nieaktualny odczyt) program SQL Server zgłasza zewnętrzny problem z systemem operacyjnym, sterownikiem lub warstwami sprzętowymi.
Jeśli błąd 3448 występuje podczas próby wycofania transakcji z błędem 605 lub 823, wystąpienie programu SQL Server automatycznie zamyka bazę danych i próbuje otworzyć ją i odzyskać. Pierwsza strona, która napotyka błąd 605 lub 823, jest uważana za złą stronę, a identyfikator strony jest przechowywany przez komputer z uruchomionym programem SQL Server. Podczas odzyskiwania (przed fazą ponownego uruchomienia) podczas odczytywania nieprawidłowego identyfikatora strony główne szczegóły nagłówka strony są rejestrowane w dzienniku błędów programu SQL Server. Ta akcja jest ważna, ponieważ ułatwia odróżnienie scenariuszy Utracony zapis i Nieaktualny odczyt.
Zachowanie zaobserwowane przy nieaktualnych odczytach i utraconych zapisach
W nieaktualnych scenariuszach odczytu mogą wystąpić następujące dwa typowe zachowania:
Jeśli pliki bazy danych zostaną zamknięte, a następnie otwarte, podczas odzyskiwania zwracane są poprawne i ostatnio zapisane dane.
Gdy wydasz punkt kontrolny i uruchomisz instrukcję
DBCC DROPCLEANBUFFERS
(aby usunąć wszystkie strony bazy danych z pamięci), a następnie uruchomiszDBCC CHECKDB
instrukcję w bazie danych, zwracane są ostatnio zapisane dane.
Zachowania wymienione w poprzednim akapicie wskazują problem z buforowaniem odczytu i są one często rozwiązywane przez wyłączenie pamięci podręcznej odczytu. Akcje opisane w poprzednim akapicie zwykle wymuszają unieważnienie pamięci podręcznej, a pomyślne operacje odczytu pokazują, że nośnik fizyczny jest poprawnie aktualizowany. Utracone zachowanie zapisu występuje, gdy strona odczytu z powrotem jest nadal starszą wersją danych, nawet po wymuszonym opróżnieniu mechanizmów buforowania.
Czasami problem może nie być specyficzny dla pamięci podręcznej sprzętu. Może to być problem ze sterownikiem filtru. W takich przypadkach przejrzyj oprogramowanie, w tym narzędzia do tworzenia kopii zapasowych i oprogramowanie antywirusowe, a następnie sprawdź, czy występują problemy ze sterownikiem filtru.
Opis różnych nieaktualnych odczytów i utraconych scenariuszy zapisu
Firma Microsoft zauważyła również, że warunki, które nie spełniają kryteriów błędu 605 lub 823, ale są spowodowane tym samym nieaktualnym odczytem lub utraconym działaniem zapisu. W niektórych przypadkach strona jest aktualizowana dwa razy, ale z tą samą wartością LSN. To zachowanie może wystąpić, jeśli identyfikator obiektu i identyfikator strony są poprawne (strona już przydzielona do obiektu), a zmiana zostanie wprowadzona na stronę i opróżniona na dysk. Następne pobieranie strony zwraca starszy obraz, a następnie następuje druga zmiana. Dziennik transakcji programu SQL Server pokazuje, że strona została dwukrotnie zaktualizowana o tę samą wartość LSN. Ta akcja staje się problemem podczas próby przywrócenia sekwencji dziennika transakcji lub problemów ze spójnością danych, takich jak błędy klucza obcego lub brakujące wpisy danych. Poniższy komunikat o błędzie ilustruje jeden przykład tego warunku:
Błąd: 3456, Ważność: 21, Stan: 1 Nie można ponownie utworzyć rekordu dziennika (276666:1664:19), identyfikator transakcji (0:825853240), na stronie (1:1787100), baza danych "autorzy" (7). Strona: LSN = (276658:4501:9), typ = 1. Dziennik: OpCode = 4, kontekst 2, PrevPageLSN: (275565:3959:31)..
Niektóre scenariusze zostały szczegółowo opisane na następujących listach:
LSN SequenceAction
1 Checkpoint
2 Begin Transaction
3 Table created or truncated
4 Inserts (Pages allocated)
5 Newly allocated page written to disk by Lazy Writer
6 Select from table - Scans IAM chain, newly allocated page read back from disk (LRU | HASHED = 0x9 in getpage message), encounters Error 605 - Invalid Object ID
7 Rollback of transaction initiated
LSN SequenceAction
1 Checkpoint
2 Begin Transaction
3 Page Modification
4 Page written to disk by Lazy Writer
5 Page read in for another modification (stale image returned)
6 Page Modified for a second time but because of stale image does not see first modification
7 Rollback - Fails - Transaction Log shows two different log records with the same PREV LSN for the page
Operatorzy programu SQL Server sort
wykonują działania we/wy, często w tempdb
bazie danych. Te operacje we/wy są podobne do operacji we/wy buforu; jednak zostały one już zaprojektowane tak, aby używać logiki ponawiania prób odczytu, aby spróbować rozwiązać podobne problemy. Dodatkowa diagnostyka wyjaśniona w tym artykule nie ma zastosowania do tych operacji we/wy.
Firma Microsoft zauważyła, że główną przyczyną następujących niepowodzeń odczytu sortowania jest zazwyczaj nieaktualny odczyt lub utracony zapis:
2003-04-01 20:13:31.38 spid122 SQL Server Assertion: File: <p:\sql\ntdbms\storeng\drs\include\record.inl>, line=1447 Failed Assertion = 'm_SizeRec > 0 && m_SizeRec <= MAXDATAROW'.
2003-03-29 09:51:41.12 spid57 Sort read failure (bad page ID). pageid = (0x1:0x13e9), dbid = 2, file = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf. Retrying.
2003-03-29 09:51:41.13 spid57 Error: 823, Severity: 24, State: 7
2003-03-29 09:51:41.13 spid57 I/O error (bad page ID) detected during read at offset 0x000000027d2000 in file 'e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf'..
* 00931097 Module(sqlservr+00531097) (utassert_fail+000002E3)
* 005B1DA8 Module(sqlservr+001B1DA8) (RecBase::Resize+00000091)
* 00407EE7 Module(sqlservr+00007EE7) (RecBase::LocateColumn+00000012)
* 00852520 Module(sqlservr+00452520) (mergerow+000000A4)
* 008522B3 Module(sqlservr+004522B3) (merge_getnext+00000285)
* 0085207D Module(sqlservr+0045207D) (mergenext+0000000D)
* 004FC5FB Module(sqlservr+000FC5FB) (getsorted+00000021)
Ponieważ nieaktualny odczyt lub utracony zapis powoduje, że magazyn danych nie jest oczekiwany, może wystąpić wiele różnych zachowań. Może się wydawać, że brakuje danych, ale niektóre z bardziej typowych skutków braku danych są wyświetlane jako uszkodzenia indeksu, takie jak błąd 644 lub 625:
Błąd 644 Poziom ważności 21 Tekst komunikatu Nie można odnaleźć wpisu indeksu identyfikatora RID "%.*hs" na stronie indeksu %S_PGID, identyfikator indeksu %d, baza danych '%.*ls'.
Błąd 625 Poziom ważności 21 Tekst wiadomości Nie można pobrać wiersza ze strony %S_PGID przez identyfikator RID, ponieważ identyfikator miejsca (%d) jest nieprawidłowy.
Niektórzy klienci zgłaszali brakujące wiersze po wykonaniu działań liczby wierszy. Ten problem występuje z powodu utraconego zapisu. Być może strona miała być połączona z klastrowanym łańcuchem stron indeksu. Jeśli zapis został fizycznie utracony, dane również zostaną utracone.
Ważne
Jeśli wystąpią jakiekolwiek zachowania lub jeśli masz podejrzane problemy wraz z wyłączeniem mechanizmów buforowania, firma Microsoft zdecydowanie zaleca uzyskanie najnowszej aktualizacji programu SQL Server. Firma Microsoft zdecydowanie zachęca również do przeprowadzenia ścisłego przeglądu systemu operacyjnego i skojarzonych z nim konfiguracji.
Należy pamiętać, że firma Microsoft potwierdziła, że w rzadkich i ciężkich obciążeniach we/wy niektóre platformy sprzętowe mogą zwracać nieaktualny odczyt. Jeśli rozszerzona diagnostyka wskazuje możliwy nieaktualny stan odczytu lub zgubienia zapisu, skontaktuj się z dostawcą sprzętu, aby uzyskać natychmiastową kontynuację i przetestować narzędzie SQLIOSim .
Program SQL Server wymaga, aby systemy obsługiwały gwarantowane dostarczanie do stabilnego nośnika zgodnie z opisem w temacie Wymagania dotyczące programu niezawodności we/wy programu SQL Server. Aby uzyskać więcej informacji na temat wymagań dotyczących danych wejściowych i wyjściowych aparatu bazy danych programu SQL Server, zobacz Wymagania dotyczące danych wejściowych/wyjściowych aparatu bazy danych programu Microsoft SQL Server.