Freigeben über


Fehler beim SQL Server-Upgrade mit Fehlercode 574 beim Ausführen von Updatedatenbankskripts

Dieser Artikel hilft Ihnen bei der Problembehandlung und Behebung eines Problems, bei dem beim Ausführen von Datenbankupgradeskripts ein kumulatives Update (CU) oder Service Pack (SP) für SQL Server Den Fehler 574 meldet.

Problembeschreibung

Wenn Sie ein CU oder SP anwenden, meldet das Setupprogramm möglicherweise den folgenden Fehler:

Fehler beim Warten auf das Wiederherstellungshandle der Datenbank-Engine. Mögliche Ursachen finden Sie im SQL Server-Fehlerprotokoll.

Wenn Sie das SQL Server-Fehlerprotokoll überprüfen, werden möglicherweise die folgenden Fehlermeldungen angezeigt:

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

Ursache

Der Updatevorgang kann einige Upgradeskripts innerhalb einer Transaktion ausführen. Diese Updateskripts sind mit einer Annahme konzipiert, dass Benutzer keine Änderungen an Systemobjekten und zugehörigen Berechtigungen vornehmen. Wenn Sie versehentlich Änderungen an Systemobjekten oder Berechtigungen vornehmen, können einige dieser Skripts fehlschlagen, und die zugeordnete Transaktion wird möglicherweise verwaist und bleibt geöffnet. Wenn das Setupprogramm später ein Upgradeskript ausführt, das zum Festlegen einiger Konfigurationswerte verwendet sp_configure wird, tritt fehler 574 auf. Die tatsächliche Ursache des Setupfehlers sollte durch Überprüfen von Einträgen bestimmt werden, die vor Fehler 574 protokolliert werden.

Ein Skript wie der folgende kann beispielsweise zu Fehler 574 führen:

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

Lösung

Führen Sie die folgenden Schritte aus, um das Problem zu beheben:

  1. Starten Sie SQL Server mit Ablaufverfolgungskennzeichnung 902. Weitere Informationen finden Sie in den Schritten zum Starten von SQL Server mit Ablaufverfolgungskennzeichnung 902.

  2. Öffnen Sie das SQL Server-Fehlerprotokoll, und überprüfen Sie die Meldungen vor Fehler 574, um die fehlgeschlagene Transaktion zu identifizieren (siehe das folgende Beispielmuster).

  3. Beheben Sie die fehlgeschlagene Transaktion gemäß den Informationen im Abschnitt "Potenzielle Ursachen und Lösungen ".

  4. Entfernen Sie das Ablaufverfolgungskennzeichnung 902 aus dem Element " Startparameter ", und starten Sie SQL Server neu.

    Sobald SQL Server ohne Ablaufverfolgungskennzeichnung 902 gestartet wird, wird das Upgradeskript erneut ausgeführt.

    • Wenn das SP/CU-Upgradeskript erfolgreich abgeschlossen ist, können Sie das SQL Server-Fehlerprotokoll und den Bootstrap-Ordner überprüfen, um dies zu überprüfen.
    • Wenn das Upgradeskript erneut fehlschlägt, überprüfen Sie das SQL Server-Fehlerprotokoll auf andere Fehler, und beheben Sie die neuen Fehler.

Beispielmuster: Probleme beim Erteilen von Berechtigungen für die Systemrolle

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...

Mögliche Ursachen und Lösungen

  • Benutzeroptionen führen dazu, dass Transaktionen fehlschlagen.

    Lösung: Stellen Sie eine Verbindung mit SQL Server her, verwenden Sie die Dokumentation zur Serverkonfigurationsoption für Benutzeroptionen , um Optionen zu identifizieren, die das Problem verursachen können, und entfernen Sie die Konflikteinstellung.

    Der Microsoft-Support hat beispielsweise Instanzen gesehen, in denen die Einstellung für IMPLICIT_TRANSACTIONS bewirkt, dass das Setup fehlschlägt. Wenn Sie die konfliktierende Benutzeroption nicht identifizieren können, entfernen Sie alternativ alle Benutzeroptionen mithilfe des folgenden Skripts in SQL Server Management Studio (SSMS):

    EXEC sp_configure 'user options', '0'
    GO
    RECONFIGURE WITH OVERRIDE;
    GO
    
  • Verwaiste Benutzer führen dazu, dass Transaktionen fehlschlagen.

    Lösung: Überprüfen Sie verwaiste Benutzer mithilfe einer Abfrage wie der folgenden:

    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';
    

    Weitere Informationen zum Auflösen verwaister Benutzer finden Sie unter Problembehandlung für verwaiste Benutzer (SQL Server).

  • Verwaiste Aufträge führen dazu, dass Transaktionen fehlschlagen.

    Lösung: Suchen Sie mithilfe einer Abfrage wie der folgenden nach verwaisten Aufträgen:

    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
    

    Jeder Datensatz, der hier einen NULL-Wert anzeigt, gibt an, dass der Besitzer des entsprechenden Agentauftrags verwaist ist. Bearbeiten Sie den Auftrag, und ändern Sie den Besitzer in eine gültige Anmeldung.