Udostępnij za pomocą


Uaktualnianie programu SQL Server kończy się niepowodzeniem z kodem błędu 574 podczas wykonywania skryptów bazy danych aktualizacji

Ten artykuł pomaga rozwiązać problem polegający na tym, że aktualizacja zbiorcza (CU) lub dodatek Service Pack (SP) dla programu SQL Server zgłasza błąd 574 podczas wykonywania skryptów uaktualniania bazy danych.

Symptomy

Po zastosowaniu aktualizacji CU lub SP program instalacyjny może zgłosić następujący błąd:

Oczekiwanie na dojście odzyskiwania dla aparatu bazy danych nie powiodło się. Sprawdź dziennik błędów programu SQL Server pod kątem potencjalnych przyczyn.

Podczas przeglądania dziennika błędów programu SQL Server mogą zostać wyświetlone następujące komunikaty o błędach:

Error: 574, Severity: 16, State: 0.
CONFIG statement cannot be used inside a user transaction.
Error: 912, Severity: 21, State: 2.
Script level upgrade for database 'master' failed because upgrade step 'sqlagent100_msdb_upgrade.sql' encountered error 574, state 0, severity 16.
This is a serious error condition which might interfere with regular operation and the database will be taken offline.
If the error happened during upgrade of the 'master' database, it will prevent the entire SQL Server instance from starting.
Examine the previous errorlog entries for errors, take the appropriate corrective actions and re-start the database so that the script upgrade steps run to completion.
Error: 3417, Severity: 21, State: 3.
Script level upgrade for database 'master' failed because upgrade step 'msdb110_upgrade.sql' encountered error 15173, state 1, severity 16

Przyczyna

Proces aktualizacji może uruchamiać niektóre skrypty uaktualniania w ramach transakcji. Te skrypty aktualizacji zostały zaprojektowane z założeniem, że użytkownicy nie wprowadzają zmian w obiektach systemowych i skojarzonych uprawnieniach. Jeśli przypadkowo wprowadzisz jakiekolwiek zmiany w obiektach lub uprawnieniach systemowych, niektóre z tych skryptów mogą zakończyć się niepowodzeniem, a skojarzona transakcja może zostać oddzielona i pozostać otwarta. W tym scenariuszu, gdy program instalacyjny później wykonuje skrypt uaktualniania, który używa sp_configure do ustawiania niektórych wartości konfiguracji, występuje błąd 574. Rzeczywista przyczyna błędu instalacji powinna zostać określona przez przejrzenie wpisów zarejestrowanych przed błędem 574.

Na przykład skrypt podobny do poniższego może spowodować błąd 574:

BEGIN TRAN
USE MASTER;
GO
EXEC sp_configure 'recovery interval', '4';
RECONFIGURE WITH OVERRIDE;
COMMIT TRAN

Rozwiązanie

Aby rozwiązać ten problem, wykonaj następujące kroki:

  1. Uruchom program SQL Server z flagą śledzenia 902. Aby uzyskać więcej informacji, zobacz Kroki uruchamiania programu SQL Server z flagą śledzenia 902.

  2. Otwórz dziennik błędów programu SQL Server i przejrzyj komunikaty przed błędem 574, aby zidentyfikować transakcję, która zakończyła się niepowodzeniem (zobacz poniższy przykładowy wzorzec).

  3. Napraw nieudaną transakcję zgodnie z informacjami w sekcji Potencjalne przyczyny i rozwiązania .

  4. Usuń flagę śledzenia 902 z elementu Parametry uruchamiania i uruchom ponownie program SQL Server.

    Po uruchomieniu programu SQL Server bez flagi śledzenia 902 skrypt uaktualniania zostanie wykonany ponownie.

    • Jeśli skrypt uaktualniania SP/CU zakończy się pomyślnie, możesz sprawdzić dziennik błędów programu SQL Server i folder bootstrap, aby sprawdzić.
    • Jeśli skrypt uaktualniania nie powiedzie się ponownie, sprawdź dziennik błędów programu SQL Server pod kątem innych błędów i rozwiąż problemy z nowymi błędami.

Przykładowy wzorzec: Problemy z udzielaniem uprawnień do roli systemu

2020-08-17 09:38:12.09 spid11s Adding user 'hostname\svc_sqlagent' to SQLAgentUserRole msdb role...
2020-08-17 09:38:12.09 spid11s
2020-08-17 09:38:12.09 spid11s Granting login access'##MS_SSISServerCleanupJobLogin##' to msdb database...
2020-08-17 09:38:12.10 spid11s A problem was encountered granting access to MSDB database for login '(null)'. Make sure this login is provisioned with SQLServer and rerun sqlagent_msdb_upgrade.sql
2020-08-17 09:38:12.10 spid11s A problem was encountered granting access to MSDB database for login '(null)'. Make sure this login is provisioned with SQLServer and rerun sqlagent_msdb_upgrade.sql
2020-08-17 09:38:12.10 spid11s
2020-08-17 09:38:12.10 spid11s Adding user '##MS_SSISServerCleanupJobLogin##' to SQLAgentUserRole msdb role...

Potencjalne przyczyny i rozwiązania

  • Opcje użytkownika powodują niepowodzenie transakcji.

    Rozwiązanie: Połącz się z programem SQL Server, użyj dokumentacji opcji konfiguracji serwera opcji użytkownika, aby zidentyfikować opcje, które mogą powodować problem, i usunąć ustawienie powodujące konflikt.

    Na przykład pomoc techniczna firmy Microsoft widziała wystąpienia, w których ustawienie dla IMPLICIT_TRANSACTIONS powoduje niepowodzenie instalacji. Alternatywnie, jeśli nie możesz zidentyfikować opcji powodującego konflikt użytkownika, usuń wszystkie opcje użytkownika przy użyciu następującego skryptu w programie SQL Server Management Studio (SSMS):

    EXEC sp_configure 'user options', '0'
    GO
    RECONFIGURE WITH OVERRIDE;
    GO
    
  • Oddzieloni użytkownicy powodują niepowodzenie transakcji.

    Rozwiązanie: Sprawdź użytkowników oddzielonych przy użyciu zapytania, takiego jak następujące:

    SELECT dp.type_desc, dp.SID, dp.name AS user_name
    FROM sys.database_principals AS dp
    LEFT JOIN sys.server_principals AS sp
         ON dp.SID = sp.SID
    WHERE sp.SID IS NULL
         AND authentication_type_desc = 'INSTANCE';
    

    Aby uzyskać więcej informacji na temat rozwiązywania problemów z oddzielonych użytkownikami, zobacz Rozwiązywanie problemów z oddzielonych użytkownikami (SQL Server).

  • Oddzielone zadania powodują niepowodzenie transakcji.

    Rozwiązanie: Sprawdź, czy nie ma oddzielonych zadań, używając zapytania podobnego do następującego:

    SELECT sj.name AS Job_Name,
         sl.name AS Job_Owner
    FROM msdb.dbo.sysjobs_view sj
    LEFT JOIN master.dbo.syslogins sl ON sj.owner_sid = sl.sid
    WHERE sl.name <> 'sa'
    ORDER BY sj.name
    

    Każdy rekord pokazujący wartość NULL w tym miejscu wskazuje, że właściciel odpowiedniego zadania agenta jest oddzielony. Edytuj zadanie i zmień właściciela na prawidłowy identyfikator logowania.