다음을 통해 공유


업데이트 데이터베이스 스크립트를 실행할 때 오류 코드 574로 SQL Server 업그레이드 실패

이 문서는 데이터베이스 업그레이드 스크립트를 실행할 때 SQL Server용 CU(누적 업데이트) 또는 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

해결

이 문제를 해결하려면 다음 단계를 수행합니다.

  1. 추적 플래그 902를 사용하여 SQL Server를 시작합니다. 자세한 내용은 추적 플래그 902를 사용하여 SQL Server를 시작하는 단계를 참조 하세요.

  2. SQL Server 오류 로그를 열고 오류 574 이전의 메시지를 검토하여 실패한 트랜잭션을 식별합니다(다음 예제 패턴 참조).

  3. 잠재적 원인 및 솔루션 섹션의 정보에 따라 실패한 트랜잭션을 수정합니다 .

  4. 시작 매개 변수 항목에서 추적 플래그 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 설정으로 인해 설정이 실패하는 경우가 있습니다. 또는 충돌하는 사용자 옵션을 식별할 수 없는 경우 SSMS(SQL Server Management Studio)에서 다음 스크립트를 사용하여 모든 사용자 옵션을 제거합니다.

    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 값을 표시하는 레코드는 해당 에이전트 작업의 소유자가 분리되었음을 나타냅니다. 작업을 편집하고 소유자를 유효한 로그인으로 변경합니다.