Rozwiązywanie problemów z łącznością i innych błędów związanych z usługą Azure SQL Database i usługą Azure SQL Managed Instance

Dotyczy: Azure SQL DatabaseAzure SQL Managed Instance

Komunikaty o błędach są wyświetlane, gdy połączenie z usługą Azure SQL Database lub wystąpieniem zarządzanym azure SQL kończy się niepowodzeniem.

Jak zawsze zastosuj najlepsze rozwiązania i wytyczne dotyczące projektowania podczas procesu projektowania aplikacji.

Uwaga

Za pomocą narzędzia do sprawdzania Połączenie ivity usługi Azure SQL można wykrywać i naprawiać różne błędy łączności z usługą Azure SQL Database, usługą Azure SQL Managed Instance i środowiskami usługi Azure Synapse Analytics.

Steps to fix common connection issues (Kroki umożliwiające rozwiązywanie typowych problemów z połączeniem)

  1. Upewnij się, że protokół TCP/IP jest włączony jako protokół klienta na serwerze aplikacji. Na serwerach aplikacji, na których nie zainstalowano narzędzi SQL, sprawdź, czy protokół TCP/IP jest włączony, uruchamiając cliconfg.exe (narzędzie sieci klienta programu SQL Server).

  2. Sprawdź parametry połączenia aplikacji, aby upewnić się, że jest ona poprawnie skonfigurowana. Na przykład upewnij się, że parametry połączenia określa prawidłowy port (1433) i w pełni kwalifikowaną nazwę serwera. Zobacz Pobieranie informacji o połączeniu przy użyciu programu SQL Server Management Studio.

  3. Spróbuj zwiększyć wartość limitu czasu połączenia. Zalecamy użycie limitu czasu połączenia co najmniej 30 sekund.

  4. Przetestuj łączność między serwerem aplikacji i usługą Azure SQL Database przy użyciu programu SQL Server Management Studio (SSMS), pliku UDL, polecenia ping lub telnetu. Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z łącznością i Diagnostyka problemów z łącznością.

    Uwaga

    W ramach kroku rozwiązywania problemów można również przetestować łączność na innym komputerze klienckim.

  5. Najlepszym rozwiązaniem jest użycie logiki ponawiania prób przez aplikacje połączone z chmurą.

Jeśli te kroki nie rozwiążą problemu, spróbuj zebrać więcej danych, a następnie skontaktuj się z pomocą techniczną. Jeśli aplikacja jest usługą w chmurze, włącz rejestrowanie. Ten krok zwraca sygnaturę czasową UTC błędu. Aby uzyskać więcej informacji na temat włączania rejestrowania, zobacz Włączanie rejestrowania diagnostycznego dla aplikacji w usłudze aplikacja systemu Azure Service. Ponadto usługa SQL Database zwraca identyfikator śledzenia. Te informacje mogą być używane przez dział pomocy technicznej firmy Microsoft.

Implementowanie logiki ponawiania prób

Zdecydowanie zaleca się, aby aplikacje klienckie używały logiki ponawiania prób, aby można było ponownie utworzyć połączenie po podaniu przejściowego czasu błędu, aby się poprawić. Zalecamy opóźnienie przez 5 sekund przed pierwszą ponowną próbą. Ponawianie próby po opóźnieniu krótszym niż 5-sekundowe ryzyko przeciążenia usługi w chmurze. Dla każdego kolejnego ponawiania opóźnienie powinno rosnąć wykładniczo, maksymalnie do 60 sekund.

Aby zapoznać się z przykładami logiki ponawiania prób kodu, zobacz:

Aby uzyskać więcej informacji na temat obsługi błędów przejściowych w aplikacji, zobacz Rozwiązywanie problemów z przejściowymi błędami połączenia z usługą SQL Database

Omówienie okresu blokowania dla klientów korzystających z ADO.NET jest dostępne w Połączenie ion Pooling (ADO.NET).

Komunikaty o błędach przejściowych (40197, 40613 i inne)

Infrastruktura platformy Azure ma możliwość dynamicznego ponownego konfigurowania serwerów w przypadku wystąpienia dużych obciążeń w usłudze SQL Database. To dynamiczne zachowanie może powodować, że program kliencki utraci połączenie z bazą danych lub wystąpieniem. Ten rodzaj warunku błędu jest nazywany błędem przejściowym. Zdarzenia ponownej konfiguracji bazy danych występują z powodu zdarzenia zaplanowanego (na przykład uaktualnienia oprogramowania) lub zdarzenia niezaplanowanego (na przykład awarii procesu lub równoważenia obciążenia). Większość zdarzeń rekonfiguracji jest krótkotrwała i powinna zostać ukończona w czasie krótszym niż 60 sekund. Jednak te zdarzenia mogą czasami trwać dłużej, na przykład wtedy, gdy duża transakcja powoduje długotrwałe odzyskiwanie. W poniższej tabeli wymieniono różne błędy przejściowe, które aplikacje mogą odbierać podczas nawiązywania połączenia z usługą Azure SQL Database.

Lista przejściowych kodów błędów

Kod błędu Ważność opis
926 14 Database 'replicatedmaster' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server error log for more information.

Ten błąd może być rejestrowany w dzienniku błędów usługi SQL Managed Instance przez krótki okres czasu podczas ostatniego etapu ponownej konfiguracji, podczas gdy stary serwer podstawowy zamyka dziennik.
Inne nieprzejrzane scenariusze związane z tym komunikatem o błędzie są opisane w dokumentacji błędów MSSQL.
40000 16 Cannot open database "%.*ls" requested by the login. The login failed.

Aby uzyskać więcej informacji, zobacz Błędy od 4000 do 4999
40197 17 The service has encountered an error processing your request. Please try again. Error code %d.

Ten błąd występuje, gdy usługa nie działa z powodu uaktualnień oprogramowania lub sprzętu, awarii sprzętu lub innych problemów z trybem failover. Kod błędu (%d) osadzony w komunikacie o błędzie 40197 zawiera dodatkowe informacje na temat rodzaju awarii lub przejścia w tryb failover, który wystąpił. Niektóre przykłady kodów błędów są osadzone w komunikacie o błędzie 40197 to 40020, 40143, 40166 i 40540.

Ponowne nawiązywanie połączenia powoduje automatyczne połączenie z kopię bazy danych w dobrej kondycji. Aplikacja musi przechwycić błąd 40197, zarejestrować osadzony kod błędu (%d) w komunikacie na potrzeby rozwiązywania problemów i spróbować ponownie nawiązać połączenie z usługą SQL Database, dopóki zasoby nie będą dostępne, a połączenie zostanie nawiązane ponownie. Aby uzyskać więcej informacji, zobacz Błędy przejściowe.
40501 20 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Aby uzyskać więcej informacji, zobacz:
Limity zasobów serwera logicznego SQL.
Limity oparte na jednostkach DTU dla pojedynczych baz danych.
Limity oparte na jednostkach DTU dla pul elastycznych.
Limity oparte na rdzeniach wirtualnych dla pojedynczych baz danych.
Limity oparte na rdzeniach wirtualnych dla elastycznych pul.
Limity zasobów usługi Azure SQL Managed Instance.
40613 17 Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'.

Ten błąd może wystąpić, jeśli istnieje już istniejące dedykowane połączenie administratora (DAC) nawiązane z bazą danych. Aby uzyskać więcej informacji, zobacz Błędy przejściowe.
49918 16 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later.

Aby uzyskać więcej informacji, zobacz:
Limity zasobów serwera logicznego SQL.
Limity oparte na jednostkach DTU dla pojedynczych baz danych.
Limity oparte na jednostkach DTU dla pul elastycznych.
Limity oparte na rdzeniach wirtualnych dla pojedynczych baz danych.
Limity oparte na rdzeniach wirtualnych dla elastycznych pul.
Limity zasobów usługi Azure SQL Managed Instance.
49919 16 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld".

Usługa jest zajęta przetwarzaniem wielu żądań tworzenia lub aktualizowania dla subskrypcji lub serwera. Żądania są obecnie blokowane na potrzeby optymalizacji zasobów. Wykonywanie zapytań sys.dm_operation_status dla oczekujących operacji. Poczekaj na ukończenie oczekujących żądań utworzenia lub aktualizacji lub usunięcie jednego z oczekujących żądań i ponów próbę wykonania żądania później. Jeśli operacje wydają się być zablokowane, poczekaj na zakończenie innych operacji w toku lub anuluj je, jeśli to możliwe. Na przykład możesz anulować tworzenie kopii bazy danych lub repliki geograficznej przez usunięcie tworzonej bazy danych lub repliki. Jeśli nie można anulować najwyraźniej zablokowanej operacji, otwórz bilet pomocy technicznej z firmą Microsoft.
49920 16 Cannot process request. Too many operations in progress for subscription "%ld".

Usługa jest zajęta przetwarzaniem wielu żądań dla tej subskrypcji. Żądania są obecnie blokowane na potrzeby optymalizacji zasobów. Zapytanie sys.dm_operation_status o stan operacji. Poczekaj na ukończenie oczekujących żądań lub usuń jedno z oczekujących żądań i spróbuj ponownie później. Jeśli operacje wydają się być zablokowane, poczekaj na zakończenie innych operacji w toku lub anuluj je, jeśli to możliwe. Na przykład możesz anulować tworzenie kopii bazy danych lub repliki geograficznej przez usunięcie tworzonej bazy danych lub repliki. Jeśli nie można anulować najwyraźniej zablokowanej operacji, otwórz bilet pomocy technicznej z firmą Microsoft.
4221 16 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'.

Replika nie jest dostępna do logowania, ponieważ brakuje wersji wierszy dla transakcji, które były w locie podczas recyklingu repliki. Problem można rozwiązać przez wycofywanie lub zatwierdzanie aktywnych transakcji w repliki podstawowej. Wystąpienia tego warunku można zminimalizować, unikając długich transakcji zapisu na serwerze podstawowym.
615 21 Could not find database ID %d, name '%.*ls'

Oznacza to, że pamięć podręczna w pamięci nie jest zsynchronizowana z wystąpieniem programu SQL Server, a wyszukiwanie pobiera nieaktualny identyfikator bazy danych.

Identyfikatory logowania SQL używają pamięci podręcznej w pamięci, aby pobrać nazwę bazy danych do mapowania identyfikatorów. Pamięć podręczna powinna być zsynchronizowana z bazą danych zaplecza i aktualizowana za każdym razem, gdy wystąpi dołączanie i odłączanie bazy danych do/z wystąpienia programu SQL Server.
Ten błąd występuje, gdy przepływ pracy odłączania nie może wyczyścić pamięci podręcznej w pamięci na czas, a kolejne wyszukiwania do punktu bazy danych do nieaktualnego identyfikatora bazy danych.

Spróbuj ponownie nawiązać połączenie z usługą SQL Database, dopóki zasób nie będzie dostępny, a połączenie zostanie nawiązane ponownie. Aby uzyskać więcej informacji, zobacz Błędy przejściowe.

Kroki rozwiązywania przejściowych problemów z łącznością

  1. Sprawdź pulpit nawigacyjny usługi platformy Microsoft Azure pod kątem znanych awarii, które wystąpiły w czasie, w którym aplikacja raportuje.
  2. Aplikacje, które łączą się z usługą w chmurze, taką jak usługa Azure SQL Database, powinny oczekiwać okresowych zdarzeń rekonfiguracji i zaimplementować logikę ponawiania prób, aby obsłużyć te błędy, zamiast nadawać użytkownikom błędy aplikacji.
  3. Ponieważ baza danych zbliża się do limitów zasobów, może to być przejściowy problem z łącznością. Zobacz Limity zasobów.
  4. Jeśli problemy z łącznością będą kontynuowane lub czas trwania napotkania błędu przez aplikację przekracza 60 sekund lub jeśli w danym dniu zostanie wyświetlonych wiele wystąpień błędu, prześlij żądanie pomoc techniczna platformy Azure, wybierając pozycję Uzyskaj pomoc techniczną w witrynie pomocy technicznej platformy Azure.

Problem występuje, jeśli aplikacja nie może nawiązać połączenia z serwerem.

Aby rozwiązać ten problem, spróbuj wykonać kroki (w podanej kolejności) w sekcji Kroki rozwiązywania typowych problemów z połączeniem.

Nie znaleziono serwera/wystąpienia lub nie było dostępne (błędy 26, 40, 10053)

Błąd 26: Błąd podczas lokalizowania określonego serwera

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.(provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)

Błąd 40: Nie można otworzyć połączenia z serwerem

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

Błąd 10053: Wystąpił błąd na poziomie transportu podczas odbierania wyników z serwera

10053: A transport-level error has occurred when receiving results from the server. (Provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine)

Te problemy występują, jeśli aplikacja nie może nawiązać połączenia z serwerem.

Aby rozwiązać te problemy, spróbuj wykonać kroki (w podanej kolejności) w sekcji Kroki rozwiązywania typowych problemów z połączeniem.

Nie można nawiązać połączenia z serwerem z powodu problemów z zaporą

Błąd 40615: Nie można nawiązać < połączenia z nazwą serwera >

Aby rozwiązać ten problem, skonfiguruj ustawienia zapory w usłudze SQL Database za pośrednictwem witryny Azure Portal.

Błąd 5. Nie można nawiązać < połączenia z nazwą serwera >

Aby rozwiązać ten problem, upewnij się, że port 1433 jest otwarty dla połączeń wychodzących we wszystkich zaporach między klientem a Internetem.

Nie można zalogować się do serwera (błędy 18456, 40531)

Logowanie użytkownika "User name>"< nie powiodło się

Login failed for user '<User name>'.This session has been assigned a tracing ID of '<Tracing ID>'. Provide this tracing ID to customer support when you need assistance. (Microsoft SQL Server, Error: 18456)

Aby rozwiązać ten problem, skontaktuj się z administratorem usługi, aby podać prawidłową nazwę użytkownika i hasło.

Zazwyczaj administrator usługi może wykonać następujące kroki, aby dodać poświadczenia logowania:

  1. Zaloguj się do serwera przy użyciu programu SQL Server Management Studio (SSMS).

  2. Aby sprawdzić, czy nazwa logowania jest wyłączona, uruchom następujące zapytanie SQL w master bazie danych:

    SELECT name, is_disabled FROM sys.sql_logins;
    
  3. Jeśli odpowiednia nazwa jest wyłączona, możesz zdecydować się na jej włączenie przy użyciu następującej instrukcji:

    ALTER LOGIN <User name> ENABLE;
    
  4. Jeśli nazwa użytkownika logowania SQL nie istnieje, przeprowadź edycję i uruchom następujące zapytanie SQL, aby utworzyć nowe dane logowania SQL:

    CREATE LOGIN <SQL_login_name, sysname, login_name>
    WITH PASSWORD = '<password, sysname, Change_Password>';
    GO
    
  5. W programie SSMS Eksplorator obiektów rozwiń węzeł Bazy danych.

  6. Wybierz bazę danych, do której chcesz przyznać użytkownikowi uprawnienia.

  7. Kliknij prawym przyciskiem myszy pozycję Zabezpieczenia, a następnie wybierz pozycję Nowy, Użytkownik.

  8. W wygenerowany skrypt z symbolami zastępczymi wykonaj kroki , aby zastąpić parametry szablonu programu SSMS i wykonać go, na przykład:

    CREATE USER [<user_name, sysname, user_name>]
    FOR LOGIN [<login_name, sysname, login_name>]
    WITH DEFAULT_SCHEMA = [<default_schema, sysname, dbo>];
    GO
    
    -- Add user to the database owner role
    EXEC sp_addrolemember N'db_owner', N'<user_name, sysname, user_name>';
    GO
    

    Można również użyć sp_addrolemember do mapowania określonych użytkowników na określone role bazy danych.

    Uwaga

    W usłudze Azure SQL Database rozważ nowszą składnię ALTER ROLE do zarządzania członkostwem w roli bazy danych.

Aby uzyskać więcej informacji, zobacz Zarządzanie bazami danych i identyfikatorami logowania w usłudze Azure SQL Database.

Błędy przekroczenia limitu czasu Połączenie ionu wygasły

System.Data.SqlClient.SqlException (0x80131904): upłynął limit czasu Połączenie ion

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=3; handshake=29995;

System.Data.SqlClient.SqlException (0x80131904): Upłynął limit czasu

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

System.Data.Entity.Core.EntityException: Podstawowy dostawca nie powiódł się podczas otwierania

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. -> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. -> System.ComponentModel.Win32Exception: The wait operation timed out

Nie można nawiązać < połączenia z nazwą serwera >

Cannot connect to <server name>.ADDITIONAL INFORMATION:Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=231; handshake=983; [Login] initialization=0; authentication=0; [Post-Login] complete=13000; (Microsoft SQL Server, Error: -2) For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=-2&LinkId=20476 The wait operation timed out

Te wyjątki mogą wystąpić z powodu problemów z połączeniem lub zapytaniami. Aby potwierdzić, że problemy z łącznością spowodowały ten błąd, zobacz Potwierdzanie, czy błąd jest spowodowany przez problem z łącznością.

Połączenie przekroczenia limitu czasu, ponieważ aplikacja nie może nawiązać połączenia z serwerem. Aby rozwiązać ten problem, spróbuj wykonać kroki (w podanej kolejności) w sekcji Kroki rozwiązywania typowych problemów z połączeniem.

Błędy kończenia połączenia sieciowego

Biblioteki klienta SQL łączą się z usługami Azure SQL Database i Azure SQL Managed Instance przy użyciu protokołu sieciowego TCP. Biblioteka kliencka używa składnika niższego poziomu o nazwie dostawca TCP do zarządzania połączeniami TCP. Gdy dostawca TCP wykryje, że host zdalny nieoczekiwanie przerywa istniejące połączenie TCP, biblioteka klienta zgłasza błąd. Ponieważ błąd jest błędem klienta, a nie błędem programu SQL Server, nie ma dołączonego numeru błędu SQL. Zamiast tego numer błędu to 0, a komunikat o błędzie dostawcy TCP jest używany.

Przykłady błędów kończenia połączenia sieciowego:

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) An existing connection was forcibly closed by the remote host

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

The client was unable to establish a connection because of an error during connection initialization process before login. Possible causes include the following: the client tried to connect to an unsupported version of SQL Server; the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

Błędy zakończenia Połączenie ion mogą wystąpić, ponieważ baza danych lub elastyczna pula jest tymczasowo niedostępna. Występują one również z powodu różnych problemów w infrastrukturze sieciowej między serwerem bazy danych a aplikacją kliencją, w tym zaporami, urządzeniami sieciowymi itp. Te problemy mogą być przejściowe lub trwałe. Ogólnie rzecz biorąc, aplikacje powinny używać stałej liczby prób ponawiania prób dla tych błędów przed rozważeniem ich trwałych awarii.

Błędy nadzoru nad zasobami

Usługa Azure SQL Database używa implementacji ładu zasobów na podstawie zarządcy zasobów, aby wymusić limity zasobów. Dowiedz się więcej o zarządzaniu zasobami w usłudze Azure SQL Database.

Najbardziej typowe błędy ładu zasobów są wyświetlane najpierw ze szczegółowymi informacjami, a następnie tabelą komunikatów o błędach ładu zasobów.

Błędy 10928 i 10936: Identyfikator zasobu: 1. Limit żądań dla [bazy danych lub puli elastycznej] wynosi %d i został osiągnięty

Jeśli zostanie osiągnięty limit poziomu bazy danych, w tym przypadku zostanie odczytany szczegółowy komunikat o błędzie: Resource ID : 1. The request limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

Jeśli limit puli elastycznej zostanie osiągnięty, szczegółowy komunikat o błędzie w tym przypadku brzmi: Resource ID : 1. The request limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance. Limity elastycznej puli są wyższe niż limity bazy danych, aby uzyskać więcej informacji, zobacz Limity zasobów. Limity mogą wystąpić, gdy wiele baz danych w puli korzysta z zasobu (na przykład procesów roboczych) jednocześnie.

Ten komunikat o błędzie wskazuje, że osiągnięto limit procesu roboczego dla bazy danych lub elastycznej puli. Maksymalna wartość współbieżnych procesów roboczych dla celu usługi bazy danych lub puli elastycznej będzie obecna zamiast symbolu zastępczego %d.

Uwaga

Początkowa oferta usługi Azure SQL Database obsługuje tylko pojedyncze zapytania wątkowe. W tym czasie liczba żądań była zawsze równoważna liczbie procesów roboczych. Komunikaty o błędach 10928 i 10936 w usłudze Azure SQL Database zawierają sformułowanie "Limit żądań [...] jest N i został osiągnięty" dla celów zgodności z poprzednimi wersjami. Osiągnięta wartość limitu to w rzeczywistości liczba procesów roboczych. Jeśli ustawienie maksymalnego stopnia równoległości (MAXDOP) jest równe zero lub jest większe niż jeden, liczba procesów roboczych może być znacznie wyższa niż liczba żądań, a limit może zostać osiągnięty znacznie wcześniej niż wtedy, gdy wartość MAXDOP jest równa jednej.

Dowiedz się więcej o sesjach, pracownikach i żądaniach.

Połączenie z dedykowanym Administracja Połączenie ionem (DAC) w razie potrzeby

Jeśli trwa zdarzenie na żywo, w którym osiągnięto limit procesów roboczych, może zostać wyświetlony błąd 10928 podczas nawiązywania połączenia przy użyciu programu SQL Server Management Studio (SSMS) lub narzędzia Azure Data Studio. Jedna sesja może nawiązać połączenie przy użyciu Połączenie ionu diagnostycznego dla usługi Database Administracja istrators (DAC), nawet jeśli osiągnięto maksymalny próg procesu roboczego.

Aby nawiązać połączenie z programem DAC z programu SSMS:

  • Z menu wybierz pozycję Plik > Nowy > aparat bazy danych Zapytanie
  • W oknie dialogowym połączenie w polu Nazwa serwera wprowadź ( admin:<fully_qualified_server_name> na przykład admin:servername.database.windows.net).
  • Wybieranie opcji >>
  • Wybierz kartę Właściwości Połączenie ion
  • W polu Połączenie do bazy danych wpisz nazwę bazy danych
  • Wybierz pozycję Połącz.

Jeśli zostanie wyświetlony błąd 40613, może to oznaczać, Database '%.&#x2a;ls' on server '%.&#x2a;ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing ID of '%.&#x2a;ls'że inna sesja jest już połączona z DAC. Tylko jedna sesja może nawiązywać połączenie z usługą DAC dla pojedynczej bazy danych lub elastycznej puli jednocześnie.

Jeśli po wybraniu Połączenie wystąpi błąd "Nie można nawiązać połączenia z serwerem", sesja DAC mogła zostać pomyślnie ustanowiona, jeśli używasz wersji programu SSMS przed 18.9. Wczesne wersje programu SSMS próbowały zapewnić funkcję IntelliSense dla połączeń z usługą DAC. Nie powiodło się to, ponieważ funkcja DAC obsługuje tylko jeden proces roboczy, a funkcja IntelliSense wymaga oddzielnego procesu roboczego.

Nie można użyć połączenia DAC z Eksplorator obiektów w programie SSMS.

Przeglądanie użycia max_worker_percent

Aby znaleźć statystyki użycia zasobów dla bazy danych przez 14 dni, wykonaj zapytanie dotyczące widoku katalogu systemu sys.resource_stats . W max_worker_percent kolumnie przedstawiono procent procesów roboczych używanych w stosunku do limitu procesów roboczych dla bazy danych. Połączenie do master bazy danych na serwerze logicznym, aby wysłać zapytanie do sys.resource_stats.

SELECT start_time, end_time, database_name, sku, avg_cpu_percent, max_worker_percent, max_session_percent 
FROM sys.resource_stats;

Możesz również wykonywać zapytania dotyczące statystyk użycia zasobów z ostatniej godziny z widoku dynamicznego zarządzania sys.dm_db_resource_stats . Połączenie bezpośrednio do bazy danych, aby wysłać zapytanie sys.dm_db_resource_statsdo .

SELECT end_time, avg_cpu_percent, max_worker_percent, max_session_percent
FROM sys.dm_db_resource_stats;

Mniejsze użycie procesów roboczych, gdy jest to możliwe

Łańcuchy blokujące mogą spowodować nagły wzrost liczby procesów roboczych w bazie danych. Duża liczba współbieżnych zapytań równoległych może spowodować dużą liczbę procesów roboczych. Zwiększenie maksymalnego stopnia równoległości (MAXDOP) lub ustawienie parametru MAXDOP na zero może zwiększyć liczbę aktywnych pracowników.

Klasyfikacja zdarzenia z niewystarczającymi pracownikami, wykonując następujące kroki:

  1. Sprawdź, czy blokowanie występuje, czy można zidentyfikować dużą liczbę współbieżnych procesów roboczych. Uruchom następujące zapytanie, aby zbadać bieżące żądania i sprawdzić, czy nie ma blokady, gdy baza danych zwraca błąd 10928. Aby wykonać zapytanie, może być konieczne nawiązanie połączenia z dedykowanym Administracja Połączenie ionem (DAC).

    SELECT
        r.session_id, r.request_id, r.blocking_session_id, r.start_time, 
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        (SELECT COUNT(*) 
            FROM sys.dm_os_tasks AS t 
            WHERE t.session_id=r.session_id and t.request_id=r.request_id) AS worker_count,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1;
    GO
    
    1. Wyszukaj wiersze z elementem , blocking_session_id aby zidentyfikować zablokowane sesje. Znajdź każdą blocking_session_id z nich na liście, aby określić, czy ta sesja jest również zablokowana. Po wartościach blocking_session_id i session_id w końcu nastąpi zablokowanie nagłówka: sesja, która nie jest zablokowana, ale blokuje. Dostosuj zapytanie blokujące głowę.

      Napiwek

      Aby uzyskać bardziej szczegółowe informacje na temat rozwiązywania problemów z długotrwałym lub blokującym zapytaniami, zobacz Omówienie i rozwiązywanie problemów z blokowaniem usługi Azure SQL Database.

    2. Aby zidentyfikować dużą liczbę współbieżnych procesów roboczych, przejrzyj ogólną liczbę żądań i kolumnę worker_count dla każdego żądania. Worker_count jest liczbą procesów roboczych w czasie próbkowania i może się zmieniać wraz z upływem czasu podczas wykonywania żądania. Dostrajanie zapytań w celu zmniejszenia wykorzystania zasobów, jeśli przyczyną zwiększenia liczby procesów roboczych są zapytania współbieżne, które działają w optymalnym stopniu równoległości. Aby uzyskać więcej informacji, zobacz Podpowiedzi i dostrajanie zapytań.

  2. Oceń maksymalny stopień równoległości (MAXDOP) dla bazy danych.

Zwiększanie limitów procesów roboczych

Jeśli baza danych lub elastyczna pula stale osiąga limit procesu roboczego pomimo blokowania, optymalizowania zapytań i sprawdzania poprawności ustawienia MAXDOP, rozważ skalowanie bazy danych lub elastycznej puli w celu zwiększenia limitu procesów roboczych.

Znajdź limity zasobów dla usługi Azure SQL Database według warstwy usługi i rozmiaru obliczeniowego:

Dowiedz się więcej o zarządzaniu zasobami usługi Azure SQL Database procesów roboczych.

Błąd 10929: Identyfikator zasobu: 1

10929: Resource ID: 1. The %s minimum guarantee is %d, maximum limit is %d and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database. See http://go.microsoft.com/fwlink/?LinkId=267637 for assistance. Otherwise, please try again later.

Błąd 40501: Usługa jest obecnie zajęta

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Błąd 40501 to błąd ograniczania aparatu, co oznacza, że limity zasobów są przekraczane.

Aby uzyskać więcej informacji na temat limitów zasobów, zobacz Logiczne limity zasobów serwera SQL.

Błąd 40544: Baza danych osiągnęła limit przydziału rozmiaru

40544: The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. Incident ID: <ID>. Code: <code>.

Ten błąd występuje, gdy baza danych osiągnęła limit przydziału rozmiaru.

Poniższe kroki mogą pomóc w obejście problemu lub udostępnić więcej opcji:

  1. Sprawdź bieżący rozmiar bazy danych przy użyciu pulpitu nawigacyjnego w witrynie Azure Portal.

    Uwaga

    Aby określić, które tabele zużywają najwięcej miejsca i dlatego są potencjalnymi kandydatami do oczyszczenia, uruchom następujące zapytanie SQL:

    SELECT o.name,
     SUM(p.row_count) AS 'Row Count',
     SUM(p.reserved_page_count) * 8.0 / 1024 AS 'Table Size (MB)'
    FROM sys.objects o
    JOIN sys.dm_db_partition_stats p on p.object_id = o.object_id
    GROUP BY o.name
    ORDER BY [Table Size (MB)] DESC;
    GO
    
  2. Jeśli bieżący rozmiar nie przekracza maksymalnego rozmiaru obsługiwanego przez edycję, możesz użyć polecenia ALTER DATABASE, aby zwiększyć ustawienie MAXSIZE.

  3. Jeśli baza danych jest już wcześniejsza niż maksymalny obsługiwany rozmiar wersji, spróbuj wykonać co najmniej jedną z następujących czynności:

    • Wykonaj normalne działania oczyszczania bazy danych. Na przykład wyczyść niepożądane dane przy użyciu obcinania/usuwania lub przenoszenia danych przy użyciu usług SQL Server Integration Services (SSIS) lub narzędzia do kopiowania zbiorczego (bcp).
    • Podziel na partycje lub usuń dane, porzuć indeksy albo skorzystaj z dokumentacji, aby zapoznać się z możliwymi rozwiązaniami”.
    • Aby uzyskać informacje na temat skalowania bazy danych, zobacz Skalowanie zasobów pojedynczej bazy danych i Skalowanie zasobów elastycznej puli.

Błąd 40549: Sesja została zakończona, ponieważ masz długotrwałą transakcję

40549: Session is terminated because you have a long-running transaction. Try shortening your transaction.

Jeśli ten błąd występuje wielokrotnie, spróbuj rozwiązać ten problem, wykonując następujące kroki:

  1. Uruchom następujące zapytanie, aby wyświetlić wszystkie otwarte sesje, które mają wysoką wartość dla kolumny duration_ms :

    SELECT
        r.start_time, DATEDIFF(ms,start_time, SYSDATETIME()) as duration_ms, 
        r.session_id, r.request_id, r.blocking_session_id,  
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1
    ORDER BY start_time ASC;
    GO
    

    Możesz zignorować wiersze, w których kolumna input_buffer pokazuje odczyt zapytania z sys.fn_MSxe_read_event_stream: te żądania są powiązane z sesjami zdarzeń rozszerzonych.

  2. Przejrzyj kolumnę, blocking_session_id aby sprawdzić, czy blokowanie przyczynia się do długotrwałych transakcji.

    Uwaga

    Aby uzyskać więcej informacji na temat rozwiązywania problemów z blokowaniem w usłudze Azure SQL Database, zobacz Omówienie i rozwiązywanie problemów z blokowaniem usługi Azure SQL Database.

  3. Rozważ przetwarzanie wsadowe zapytań. Aby uzyskać informacje na temat dzielenia na partie, zobacz How to use batching to improve SQL Database application performance (Jak używać przetwarzania wsadowego w celu zwiększenia wydajności aplikacji usługi SQL Database).

Błąd 40551: Sesja została zakończona z powodu nadmiernego użycia bazy danych tempdb

40551: The session has been terminated because of excessive TEMPDB usage. Try modifying your query to reduce the temporary table space usage.

Aby obejść ten problem, wykonaj następujące kroki:

  1. Zmień zapytania, aby zmniejszyć tymczasowe użycie miejsca w tabeli.
  2. Porzucanie obiektów tymczasowych po tym, jak nie są już potrzebne.
  3. Obcinaj tabele lub usuwaj nieużywane tabele.

Błąd 40552: Sesja została zakończona z powodu nadmiernego użycia miejsca w dzienniku transakcji

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Aby rozwiązać ten problem, wypróbuj poniższe metody:

Błąd 40553: Sesja została zakończona z powodu nadmiernego użycia pamięci

40553: The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Aby obejść ten problem, spróbuj zoptymalizować zapytanie.

Aby uzyskać szczegółową procedurę rozwiązywania problemów, zobacz Czy moje zapytanie działa prawidłowo w chmurze?.

Aby uzyskać więcej informacji na temat innych błędów braku pamięci i przykładowych zapytań, zobacz Rozwiązywanie problemów z błędami braku pamięci w usłudze Azure SQL Database.

Tabela komunikatów o błędach ładu zasobów

Kod błędu Ważność opis
10928 20 Resource ID: %d. The %s limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

Identyfikator zasobu wskazuje zasób, który osiągnął limit. Gdy identyfikator zasobu = 1, oznacza to, że osiągnięto limit procesu roboczego. Dowiedz się więcej w artykule Błąd 10928: Identyfikator zasobu: 1. Limit żądań dla bazy danych to %d i został osiągnięty. Gdy identyfikator zasobu = 2, oznacza to, że osiągnięto limit sesji.

Dowiedz się więcej o limitach zasobów:
Limity zasobów serwera logicznego SQL.
Limity oparte na jednostkach DTU dla pojedynczych baz danych.
Limity oparte na rdzeniach wirtualnych dla pojedynczych baz danych.
Limity zasobów usługi Azure SQL Managed Instance.
10936 20 Resource ID: %d. The %s limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

Identyfikator zasobu wskazuje zasób, który osiągnął limit. Gdy identyfikator zasobu = 1, oznacza to, że osiągnięto limit procesu roboczego. Dowiedz się więcej w artykule Błąd 10936: Identyfikator zasobu: 1. Limit żądań dla puli elastycznej to %d i został osiągnięty. Gdy identyfikator zasobu = 2, oznacza to, że osiągnięto limit sesji.

Dowiedz się więcej o limitach zasobów:
Limity zasobów serwera logicznego SQL.
Limity oparte na jednostkach DTU dla pul elastycznych.
Limity oparte na rdzeniach wirtualnych dla elastycznych pul.
Limity zasobów usługi Azure SQL Managed Instance.
10929 20 Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

Identyfikator zasobu wskazuje zasób, który osiągnął limit. W przypadku wątków roboczych identyfikator zasobu = 1. W przypadku sesji identyfikator zasobu = 2. Aby uzyskać więcej informacji, zobacz:
Limity zasobów serwera logicznego SQL.
Limity oparte na jednostkach DTU dla pojedynczych baz danych.
Limity oparte na jednostkach DTU dla pul elastycznych.
Limity oparte na rdzeniach wirtualnych dla pojedynczych baz danych.
Limity oparte na rdzeniach wirtualnych dla elastycznych pul.
Limity zasobów usługi Azure SQL Managed Instance.
W przeciwnym razie spróbuj ponownie później.
40544 20 The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions.

Aby uzyskać informacje na temat skalowania bazy danych, zobacz Skalowanie zasobów pojedynczej bazy danych i Skalowanie zasobów elastycznej puli.
40549 16 Session is terminated because you have a long-running transaction. Try shortening your transaction.

Aby uzyskać informacje na temat dzielenia na partie, zobacz How to use batching to improve SQL Database application performance (Jak używać przetwarzania wsadowego w celu zwiększenia wydajności aplikacji usługi SQL Database).
40550 16 The session has been terminated because it has acquired too many locks. Try reading or modifying fewer rows in a single transaction.

Aby uzyskać informacje na temat dzielenia na partie, zobacz How to use batching to improve SQL Database application performance (Jak używać przetwarzania wsadowego w celu zwiększenia wydajności aplikacji usługi SQL Database).
40551 16 The session has been terminated because of excessive tempdb usage. Try modifying your query to reduce the temporary table space usage.

Jeśli używasz obiektów tymczasowych, oszczędzaj miejsce w tempdb bazie danych, upuszczając obiekty tymczasowe po tym, jak sesja nie jest już potrzebna. Aby uzyskać więcej informacji na tempdb temat limitów w usłudze SQL Database, zobacz Baza danych Tempdb w usłudze SQL Database.
40552 16 The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Aby uzyskać informacje na temat dzielenia na partie, zobacz How to use batching to improve SQL Database application performance (Jak używać przetwarzania wsadowego w celu zwiększenia wydajności aplikacji usługi SQL Database).

Jeśli wykonujesz operacje zbiorcze wstawiania przy użyciu bcp.exe narzędzia lub System.Data.SqlClient.SqlBulkCopy klasy, spróbuj użyć -b batchsize opcji lub BatchSize , aby ograniczyć liczbę wierszy skopiowanych do serwera w każdej transakcji. Jeśli ponownie kompilujesz indeks za pomocą instrukcji ALTER INDEX , spróbuj użyć REBUILD WITH ONLINE = ON opcji . Aby uzyskać informacje na temat rozmiarów dziennika transakcji dla modelu zakupów rdzeni wirtualnych, zobacz:
Limity oparte na rdzeniach wirtualnych dla pojedynczych baz danych.
Limity oparte na rdzeniach wirtualnych dla elastycznych pul.
Limity zasobów usługi Azure SQL Managed Instance.
40553 16 The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Zmniejszenie liczby operacji ORDER BY i GROUP BY w kodzie Języka Transact-SQL zmniejsza wymagania dotyczące pamięci zapytania. Aby uzyskać informacje na temat skalowania bazy danych, zobacz Skalowanie zasobów pojedynczej bazy danych i Skalowanie zasobów elastycznej puli. Aby uzyskać więcej informacji na temat błędów braku pamięci i przykładowych zapytań, zobacz Rozwiązywanie problemów z błędami braku pamięci w usłudze Azure SQL Database.

Błędy puli elastycznej

Następujące błędy są związane z tworzeniem i używaniem pul elastycznych:

Kod błędu Ważność opis Działanie naprawcze
1132 17 The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (%d) MBs.

Próba zapisania danych w bazie danych po osiągnięciu limitu magazynu elastycznej puli . Aby uzyskać informacje na temat limitów zasobów, zobacz:
Limity oparte na jednostkach DTU dla pul elastycznych.
Limity oparte na rdzeniach wirtualnych dla elastycznych pul.
Rozważ zwiększenie liczby jednostek DTU i/lub dodanie magazynu do puli elastycznej, jeśli jest to możliwe, aby zwiększyć limit magazynu, zmniejszyć ilość miejsca używanego przez poszczególne bazy danych w elastycznej puli lub usunąć bazy danych z puli elastycznej. Aby uzyskać informacje na temat skalowania elastycznej puli, zobacz Skalowanie zasobów elastycznej puli. Aby uzyskać więcej informacji na temat usuwania nieużywanego miejsca z baz danych, zobacz Zarządzanie miejscem na pliki dla baz danych w usłudze Azure SQL Database.
10929 16 The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

Aby uzyskać informacje na temat limitów zasobów, zobacz:
Limity oparte na jednostkach DTU dla pul elastycznych.
Limity oparte na rdzeniach wirtualnych dla elastycznych pul.
W przeciwnym razie spróbuj ponownie później. Jednostka DTU/minimalna liczba rdzeni wirtualnych na bazę danych; Maksymalna liczba rdzeni DTU/rdzeni wirtualnych na bazę danych. Całkowita liczba współbieżnych procesów roboczych we wszystkich bazach danych w elastycznej puli próbowała przekroczyć limit puli.
Rozważ zwiększenie liczby jednostek DTU lub rdzeni wirtualnych elastycznej puli, jeśli jest to możliwe, aby zwiększyć limit procesu roboczego, lub usunąć bazy danych z puli elastycznej.
40844 16 Database '%ls' on Server '%ls' is a '%ls' edition database in an elastic pool and cannot have a continuous copy relationship. Nie dotyczy
40857 16 Elastic pool not found for server: '%ls', elastic pool name: '%ls'. Specified elastic pool does not exist in the specified server. Podaj prawidłową nazwę puli elastycznej.
40858 16 Elastic pool '%ls' already exists in server: '%ls'. Specified elastic pool already exists in the specified server. Podaj nową nazwę puli elastycznej.
40859 16 Elastic pool does not support service tier '%ls'. Specified service tier is not supported for elastic pool provisioning. Podaj poprawną wersję lub pozostaw pustą warstwę usługi, aby użyć domyślnej warstwy usługi.
40860 16 Elastic pool '%ls' and service objective '%ls' combination is invalid. Elastic pool and service tier can be specified together only if resource type is specified as 'ElasticPool'. Określ poprawną kombinację elastycznej puli i warstwy usług.
40861 16 The database edition '%.*ls' cannot be different than the elastic pool service tier which is '%.*ls'. The database edition is different than the elastic pool service tier. Nie należy określać wersji bazy danych innej niż warstwa usługi elastycznej puli. Nie trzeba określać wersji bazy danych.
40862 16 Elastic pool name must be specified if the elastic pool service objective is specified. Elastic pool service objective does not uniquely identify an elastic pool. Określ nazwę puli elastycznej, jeśli używasz celu usługi elastycznej puli.
40864 16 The DTUs for the elastic pool must be at least (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool below the minimum limit. Spróbuj ponownie ustawić jednostki DTU dla puli elastycznej na co najmniej minimalny limit.
40865 16 The DTUs for the elastic pool cannot exceed (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool above the maximum limit. Spróbuj ponownie ustawić jednostki DTU dla puli elastycznej na wartość nie większą niż maksymalny limit.
40867 16 The DTU max per database must be at least (%d) for service tier '%.*ls'. Attempting to set the DTU max per database below the supported limit. Rozważ użycie warstwy usługi elastycznej puli, która obsługuje odpowiednie ustawienie.
40868 16 The DTU max per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU max per database beyond the supported limit. Rozważ użycie warstwy usługi elastycznej puli, która obsługuje odpowiednie ustawienie.
40870 16 The DTU min per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU min per database beyond the supported limit. Rozważ użycie warstwy usługi elastycznej puli, która obsługuje odpowiednie ustawienie.
40873 16 The number of databases (%d) and DTU min per database (%d) cannot exceed the DTUs of the elastic pool (%d). Attempting to specify DTU min for databases in the elastic pool that exceeds the DTUs of the elastic pool. Rozważ zwiększenie liczby jednostek DTU puli elastycznej lub zmniejszenie minimalnej liczby jednostek DTU na bazę danych lub zmniejszenie liczby baz danych w elastycznej puli.
40877 16 An elastic pool cannot be deleted unless it does not contain any databases. The elastic pool contains one or more databases and therefore cannot be deleted. Usuń bazy danych z elastycznej puli, aby je usunąć.
40881 16 The elastic pool '%.*ls' has reached its database count limit. The database count limit for the elastic pool cannot exceed (%d) for an elastic pool with (%d) DTUs. Attempting to create or add database to elastic pool when the database count limit of the elastic pool has been reached. Rozważ zwiększenie jednostek DTU puli elastycznej, jeśli jest to możliwe, aby zwiększyć limit bazy danych lub usunąć bazy danych z elastycznej puli.
40889 16 The DTUs or storage limit for the elastic pool '%.*ls' cannot be decreased since that would not provide sufficient storage space for its databases. Attempting to decrease the storage limit of the elastic pool below its storage usage. Rozważ zmniejszenie użycia magazynu poszczególnych baz danych w elastycznej puli lub usunięcie baz danych z puli w celu zmniejszenia limitu jednostek DTU lub magazynu.
40891 16 The DTU min per database (%d) cannot exceed the DTU max per database (%d). Attempting to set the DTU min per database higher than the DTU max per database. Upewnij się, że minimalna liczba jednostek DTU na bazy danych nie przekracza maksymalnej liczby jednostek DTU na bazę danych.
Do ustalenia 16 The storage size for an individual database in an elastic pool cannot exceed the max size allowed by '%.*ls' service tier elastic pool. The max size for the database exceeds the max size allowed by the elastic pool service tier. Ustaw maksymalny rozmiar bazy danych w granicach maksymalnego rozmiaru dozwolonego przez warstwę usługi elastycznej puli.

Nie można otworzyć bazy danych "master" żądanej podczas logowania. Logowanie nie powiodło się

Ten problem występuje, ponieważ konto nie ma uprawnień dostępu do master bazy danych. Jednak domyślnie program SQL Server Management Studio (SSMS) próbuje nawiązać połączenie z bazą master danych.

Aby rozwiązać ten problem, wykonaj poniższe czynności:

  1. Na ekranie logowania programu SSMS wybierz pozycję Opcje, a następnie wybierz pozycję właściwości Połączenie ion.

  2. W polu Połączenie do bazy danych wprowadź domyślną nazwę bazy danych użytkownika jako domyślną bazę danych logowania, a następnie wybierz pozycję Połączenie.

    Zrzut ekranu przedstawiający okno dialogowe Połączenie w programie SSMS z wyświetloną kartą Właściwości Połączenie ion.

Błędy tylko do odczytu

Jeśli próbujesz zapisać w bazie danych, która jest tylko do odczytu, zostanie wyświetlony błąd. W niektórych scenariuszach przyczyna stanu tylko do odczytu bazy danych może nie być od razu jasna.

Błąd 3906: Nie można zaktualizować bazy danych "databaseName", ponieważ baza danych jest tylko do odczytu.

Podczas próby zmodyfikowania bazy danych tylko do odczytu jest zgłaszany następujący błąd.

Msg 3906, Level 16, State 2, Line 1
Failed to update database "%d" because the database is read-only.

Istnieje wiele możliwych wyjaśnień, dlaczego baza danych jest tylko do odczytu.

Po ręcznym przejściu w tryb failover aplikacje nadal łączą się ze starą repliką

W usłudze Azure SQL Database po przejściu w tryb failover do innej repliki aplikacja może nadal łączyć się z poprzednią repliką podstawową z powodu systemu DNS. Routing połączeń grupy trybu failover jest implementowany przy użyciu systemu DNS.

Potencjalne główne przyczyny:

  1. Podczas pracy w trybie failover punkty końcowe grupy trybu failover są aktualizowane w celu wskazania odpowiednich nowych serwerów podstawowych i nowych pomocniczych przez zmianę celu odpowiedniego wpisu DNS. Domyślnie wpisy DNS są tworzone z TTL 30 sekund, co oznacza, że klienci DNS buforują te wpisy przez 30 sekund. W związku z tym aktualizacje rekordów DNS nie są natychmiast propagowane; wpisy będą nieaktualne, dopóki wszyscy klienci i węzły pośrednie nie odświeżą pamięci podręcznych. W związku z tym logowanie do punktów końcowych grupy trybu failover może potrwać od 0 do około 10 minut (w zależności od topologii sieci). Opróżnianie pamięci podręcznych DNS może lub nie może pomóc w problemie, ponieważ pośrednie węzły sieciowe, które odpowiadają na żądania DNS, również buforować wyniki DNS przez pewien czas.

    Zalecane obejście tego problemu polega po prostu na oczekiwaniu na odświeżenie wpisów DNS na kliencie. Obecnie to obejście doprowadziłoby do rozwiązania problemu w ciągu 10 minut.

  2. Niektóre biblioteki klienckie SQL używają funkcji o nazwie "buforowanie połączeń", która ponownie używa połączeń z tym samym źródłem danych, a nie zamykania i ponownego otwierania ich za każdym razem, gdy jest potrzebne nowe połączenie z bazą danych. W szczególności buforowanie połączeń jest domyślnie włączone w ADO.NET. W połączeniu, gdy problem opisany w 1), buforowanie połączeń może spowodować ponowne użycie połączenia ze starą bazą danych, co uniemożliwia aplikacji nawiązywanie połączenia z nową podstawową bazą danych na czas nieokreślony.

Rozwiązania:

Istnieją trzy potencjalne obejścia tego problemu DNS po przejściu grupy trybu failover w tryb failover:

  1. Zmodyfikuj aplikację tak, aby wywołała SQLConnection.ClearAllPools metodę lub SQLConnection.ClearPool(conn) za każdym razem, gdy wystąpi błąd "tylko do odczytu".
  2. W parametry połączenia aplikacji określPooling=False, aby wyłączyć buforowanie połączeń. Należy to przetestować, ponieważ może to znacząco wpłynąć na wydajność, jeśli aplikacja otworzy się i często zamyka połączenia.
  3. Inną opcją uniknięcia opóźnień replikacji/buforowania DNS jest bezpośrednie połączenie przy użyciu nazwy serwera logicznego usługi Azure SQL Database (oryginalnego serwera pomocniczego, teraz nowego podstawowego) przez przedział czasu po wystąpieniu 3906.

Być może masz połączenie z repliką tylko do odczytu

W przypadku usług Azure SQL Database i Azure SQL Managed Instance możesz nawiązać połączenie z bazą danych w repliki tylko do odczytu. W tym przypadku następujące zapytanie przy użyciu funkcji DATABASEPROPERTYEX() zwraca wartość READ_ONLY:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');
GO

Jeśli łączysz się przy użyciu programu SQL Server Management Studio, sprawdź, czy ApplicationIntent=ReadOnly określono to na karcie Dodatkowe parametryPołączenie ion w opcjach połączenia.

Jeśli połączenie pochodzi z aplikacji lub klienta przy użyciu parametry połączenia, sprawdź, czy parametry połączenia określono ApplicationIntent=ReadOnly. Dowiedz się więcej w Połączenie do repliki tylko do odczytu.

Baza danych może być ustawiona na tylko do odczytu

Jeśli używasz usługi Azure SQL Database, sama baza danych mogła zostać ustawiona na tylko do odczytu. Stan bazy danych można sprawdzić za pomocą następującego zapytania:

SELECT name, is_read_only
FROM sys.databases
WHERE database_id = DB_ID();

Stan tylko do odczytu bazy danych w usłudze Azure SQL Database można zmodyfikować przy użyciu języka Transact-SQL ALTER DATABASE. Obecnie nie można ustawić bazy danych w wystąpieniu zarządzanym na tylko do odczytu.

Potwierdzanie, czy błąd jest spowodowany problemem z łącznością

Aby sprawdzić, czy błąd jest spowodowany przez problem z łącznością, przejrzyj ślad stosu ramek, które pokazują wywołania, aby otworzyć połączenie podobne do następujących (zwróć uwagę na odwołanie do klasy Sql Połączenie ion):

System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.Open()
 at AzureConnectionTest.Program.Main(String[] args)
ClientConnectionId:<Client connection ID>

Gdy wyjątek jest wyzwalany przez problemy z zapytaniami, zauważysz stos wywołań podobny do poniższego (zwróć uwagę na odwołanie do klasy SqlCommand ). W takiej sytuacji dostosuj zapytania.

  at System.Data.SqlClient.SqlCommand.ExecuteReader()
  at AzureConnectionTest.Program.Main(String[] args)
  ClientConnectionId:<Client ID>

Aby uzyskać więcej informacji na temat wydajności dostosowywania, zobacz następujące zasoby: