更新データベース スクリプトの実行時にエラー コード 574 で SQL Server のアップグレードが失敗する
この記事は、データベース アップグレード スクリプトの実行時に SQL Server の累積的な更新プログラム (CU) または Service Pack (SP) がエラー 574 を報告する問題のトラブルシューティングと解決に役立ちます。
現象
CU または SP を適用すると、セットアップ プログラムで次のエラーが報告されることがあります。
データベース エンジンの復旧ハンドルの待機に失敗しました。 考えられる原因については、SQL Server エラー ログを確認してください
SQL Server エラー ログを確認すると、次のエラー メッセージが表示されることがあります。
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
原因
更新プロセスでは、トランザクション内で一部のアップグレード スクリプトが実行される場合があります。 これらの更新スクリプトは、ユーザーがシステム オブジェクトと関連するアクセス許可に変更を加えないという前提で設計されています。 システム オブジェクトまたはアクセス許可に誤って変更を加えた場合、これらのスクリプトの一部が失敗し、関連するトランザクションが孤立して開いたままになる可能性があります。 このシナリオでは、セットアップ プログラムが後で sp_configure
を使用していくつかの構成値を設定するアップグレード スクリプトを実行すると、エラー 574 が発生します。 セットアップ エラーの実際の原因は、エラー 574 より前にログに記録されたエントリを確認することによって決定する必要があります。
たとえば、次のようなスクリプトでは、エラー 574 が発生する可能性があります。
BEGIN TRAN
USE MASTER;
GO
EXEC sp_configure 'recovery interval', '4';
RECONFIGURE WITH OVERRIDE;
COMMIT TRAN
解決方法
この問題を解決するには、次の手順に従います。
trace フラグ 902 で SQL Server を起動します。 詳細については、「 トレース フラグ 902 で SQL Server を起動する手順を参照してください。
SQL Server エラー ログを開き、エラー 574 より前のメッセージを確認して、失敗したトランザクションを特定します (次の サンプル パターンを参照してください)。
の原因と解決策セクションの情報に従って、失敗したトランザクションを修正します。
Startup パラメーター項目からトレース フラグ 902 を削除し、SQL Server を再起動します。
トレース フラグ 902 なしで SQL Server が起動すると、アップグレード スクリプトが再度実行されます。
- SP/CU アップグレード スクリプトが正常に完了した場合は、SQL Server エラー ログとブートストラップ フォルダーを確認して確認できます。
- アップグレード スクリプトが再度失敗した場合は、SQL Server エラー ログで他のエラーがないか確認し、新しいエラーのトラブルシューティングを行います。
パターン例: システム ロールへのアクセス許可の付与に関する問題
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...
考えられる原因と解決策
ユーザー オプションを指定すると、トランザクションが失敗します。
解決策: SQL Server に接続し、 ユーザー オプション サーバー構成オプションのドキュメントを使用して、問題の原因となる可能性のあるオプションを特定し、競合する設定を削除します。
たとえば、Microsoft サポートでは、 IMPLICIT_TRANSACTIONS の設定によってセットアップが失敗するインスタンスが見られました。 または、競合するユーザー オプションを特定できない場合は、SQL Server Management Studio (SSMS) で次のスクリプトを使用して、すべてのユーザー オプションを削除します。
EXEC sp_configure 'user options', '0' GO RECONFIGURE WITH OVERRIDE; GO
孤立したユーザーは、トランザクションが失敗します。
解決策: 次のようなクエリを使用して、孤立したユーザーを確認します。
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';
孤立したユーザーを解決する方法の詳細については、「 孤立したユーザーをトラブルシューティングする (SQL Server)」を参照してください。
孤立したジョブにより、トランザクションが失敗します。
解決策: 次のようなクエリを使用して、孤立したジョブを確認します。
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
ここで NULL 値を示すレコードは、該当するエージェント ジョブの所有者が孤立していることを示します。 ジョブを編集し、所有者を有効なログインに変更します。