적용 대상
SQL Server 2012 Enterprise

증상

다음과 같은 경우를 생각해 볼 수 있습니다.

  • Microsoft SQL Server 2005, Microsoft SQL Server 2008 또는 Microsoft SQL Server 2008 R2의 instance 설치합니다.

  • SQL Server instance 이름이 INST1이며 Test_RO_FG_DB 데이터베이스를 호스트합니다.

  • 데이터베이스에는 다음 파일 그룹이 포함됩니다.

    • 기본

    • RO_FG

    • RW_FG

  • 이름이 RO_FG 파일 그룹은 READ_ONLY 표시됩니다.

  • Microsoft SQL Server 2012의 새 instance 설치합니다. SQL Server 2012의 이 instance INST2로 명명되었습니다.

  • INST1에서 Test_RO_FG_DB 데이터베이스를 분리합니다.

  • Test_RO_FG_DB 데이터베이스를 INST2에 연결하려고 합니다.

  • 다음과 유사한 오류 메시지가 표시됩니다.

    Msg 3415, Level 16, State 2, Line 1데이터베이스 'Test_RO_FG_DB'은 읽기 전용이거나 읽기 전용 파일이 있거나 사용자에게 일부 파일을 수정할 수 있는 권한이 없으므로 업그레이드할 수 없습니다. 데이터베이스 또는 파일을 쓰기 가능으로 만들고 복구를 다시 실행합니다.

  • Test_RO_FG_DB 데이터베이스를 INST1에 다시 연결하려고 합니다.

이 시나리오에서는 데이터베이스를 INST1에 다시 연결할 수 없습니다. SQL Server 오류 로그에 다음 오류 메시지가 표시됩니다.

참고 이 문제는 READ_ONLY 표시된 파일 그룹이 포함된 데이터베이스를 연결하려고 할 때만 발생합니다. 이 문제는 모든 데이터가 READ_ONLY 표시된 READ_ONLY 데이터베이스를 이동하려고 할 때 발생하지 않습니다.

원인

이 문제는 SQL Server 2012에서 데이터베이스 업그레이드를 시작하기 전에 읽기 전용 파일 그룹을 검색하지 못하기 때문에 발생합니다. 업그레이드가 시작된 후 SQL Server 2012에서 트랜잭션 로그에 항목을 씁니다. 이전 버전은 새 트랜잭션 로그 항목을 읽을 수 없습니다.

상태

Microsoft는 "적용 대상" 절에 나열한 Microsoft 제품에서 이 문제를 확인했습니다.

해결 방법

누적 업데이트 정보

SQL Server 2012

이 문제에 대한 수정 사항은 2012년 SQL Server 누적 업데이트 2에서 처음 릴리스되었습니다. 이 누적 업데이트 패키지에 대한 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료의 문서를 확인합니다.

2703275 SQL Server 2012용 누적 업데이트 패키지 2참조 빌드가 누적되므로 각 새 수정 릴리스에는 이전 SQL Server 2012 수정 릴리스에 포함된 모든 핫픽스 및 모든 보안 수정 사항이 포함됩니다. 이 핫픽스를 포함하는 최신 수정 릴리스를 적용하는 것이 좋습니다. 자세한 내용을 확인하려면 다음 문서 번호를 클릭하여 Microsoft 기술 자료 문서를 참조하십시오.

2692828 2012년 SQL Server 릴리스된 후 릴리스된 SQL Server 2012 빌드는 SQL Server 2012의 설치에 SQL Server 2012 핫픽스를 적용해야 합니다.

해결 방법 

이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.방법 1INST2의 INST1에서 데이터베이스 백업을 복원합니다.참고 이전 버전에서 백업을 복원할 때 "증상" 섹션에 설명된 문제는 2012년 SQL Server 발생하지 않습니다.방법 2이전 버전의 SQL Server 현재 위치 업그레이드를 SQL Server 2012로 수행합니다.방법 3읽기 전용 파일 그룹이 포함된 데이터베이스를 SQL Server 2012의 instance 이동합니다. 이를 위해 다음 작업을 수행하십시오.참고 2012년 SQL Server 실행 중인 서버에서 4~11단계를 수행합니다. 예를 들어 INST2에서 4~11단계를 수행합니다.

  1. INST1에서 데이터베이스를 분리합니다. 예를 들어 Test_RO_FG_DB 데이터베이스를 분리합니다.

  2. 데이터베이스 파일을 INST2 instance 호스트하는 서버로 이동합니다.

  3. 데이터베이스를 INST2에 연결해 보세요. 다음 샘플 코드는 이 작업을 수행하는 방법을 보여줍니다.

    CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG.mdf' ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_File1.ndf' ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RW_FG_File1.ndf' )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_log.ldf' )FOR ATTACH;GO

    참고 "증상" 섹션에 언급된 3425 오류 메시지가 표시됩니다.

  4. 명령 프롬프트에서 데이터베이스 파일의 이름을 바꿉니다. 다음 샘플 명령은 이 작업을 수행하는 방법을 보여줍니다.

    rename Test_RO_FG.mdf original_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf original_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf original_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf original_Test_RO_FG_log.ldf 
  5. SQL Server Management Studio 연결하려는 데이터베이스와 이름과 물리적 구조가 같은 데이터베이스를 만듭니다. 다음 샘플 코드는 이 작업을 수행하는 방법을 보여줍니다.

    CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_DB.mdf' , SIZE = 4072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RW_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO
  6. 데이터베이스를 오프라인으로 설정합니다. 이렇게 하려면 다음 명령을 실행합니다.

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  7. 명령 프롬프트에서 새 데이터베이스의 파일 이름을 바꿉니다. 다음 샘플 명령은 이 작업을 수행하는 방법을 보여줍니다.

    rename Test_RO_FG.mdf new_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf new_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf new_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf new_Test_RO_FG_log.ldf 
  8. 명령 프롬프트에서 2단계에서 이동한 데이터베이스의 파일 이름을 바꿉니다. 파일 이름을 4단계에서 만든 데이터베이스와 일치하도록 바꿉니다. 다음 샘플 명령은 이 작업을 수행하는 방법을 보여줍니다.

    rename original_Test_RO_FG.mdf Test_RO_FG.mdf rename original_Test_RO_FG_File1.ndf Test_RO_FG_File1.ndf rename original_Test_RW_FG_File1.ndf Test_RW_FG_File1.ndf rename original_Test_RO_FG_log.ldf Test_RO_FG_log.ldf 
  9. 데이터베이스를 ONLINE으로 설정합니다. 이렇게 하려면 다음 명령을 실행합니다.

    ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO 
  10. 데이터베이스가 온라인 상태인지 확인하고 Service Broker 기능을 다시 설정합니다.

  11. 필요하지 않은 데이터베이스 파일을 삭제합니다. 다음 샘플 명령은 이 작업을 수행하는 방법을 보여줍니다.

    del /P new_Test_RO_FG.mdfdel /P new_Test_RO_FG_File1.ndfdel /P new_Test_RW_FG_File1.ndfdel /P new_Test_RO_FG_log.ldf 

메서드 4읽기 전용 파일 그룹이 포함된 데이터베이스를 SQL Server 이전 instance 다시 연결합니다. 이를 위해 다음 작업을 수행하십시오.노트

  • 데이터베이스에는 실패한 업그레이드의 새 트랜잭션 로그 항목도 포함됩니다.

  • 이전 버전의 SQL Server 실행하는 서버에서 3~10단계를 수행합니다. 예를 들어 INST1에서 3~10단계를 수행합니다.

  1. 데이터베이스 파일을 INST1을 호스팅하는 SQL Server instance 이동합니다.

  2. 데이터베이스를 INST1에 연결해 보세요. 다음 샘플 코드는 이 작업을 수행하는 방법을 보여줍니다.

    CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_DB.mdf' ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_File1.ndf' ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RW_FG_File1.ndf' )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_log.ldf' )FOR ATTACHGO

    참고 "증상" 섹션에 언급된 3624 오류 메시지가 표시됩니다. 1813 오류 메시지도 표시됩니다.

  3. 명령 프롬프트에서 INST1의 데이터베이스 파일 이름을 바꿉니다. 다음 샘플 명령은 이 작업을 수행하는 방법을 보여줍니다.

    rename Test_RO_FG.mdf original_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf original_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf original_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf original_Test_RO_FG_log.ldf 
  4. SQL Server Management Studio 연결하려는 데이터베이스와 이름과 물리적 구조가 같은 데이터베이스를 만듭니다. 다음 샘플 코드는 이 작업을 수행하는 방법을 보여줍니다.

    CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_DB.mdf' , SIZE = 4072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RW_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO
  5. 데이터베이스를 오프라인으로 설정합니다. 이렇게 하려면 다음 명령을 실행합니다.

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  6. 명령 프롬프트에서 새 데이터베이스의 파일 이름을 바꿉니다. 다음 샘플 명령은 이 작업을 수행하는 방법을 보여줍니다.

    rename Test_RO_FG.mdf new_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf new_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf new_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf new_Test_RO_FG_log.ldf 
  7. 명령 프롬프트에서 2단계에서 이동한 데이터베이스의 파일 이름을 바꿉니다. 파일 이름을 4단계에서 만든 데이터베이스와 일치하도록 바꿉니다. 다음 샘플 명령은 이 작업을 수행하는 방법을 보여줍니다.

    rename original_Test_RO_FG.mdf Test_RO_FG.mdf rename original_Test_RO_FG_File1.ndf Test_RO_FG_File1.ndf rename original_Test_RW_FG_File1.ndf Test_RW_FG_File1.ndf rename original_Test_RO_FG_log.ldf Test_RO_FG_log.ldf 
  8. 데이터베이스를 응급 모드로 설정하고 복구를 수행합니다. 이렇게 하려면 다음 명령을 실행합니다.참고 데이터베이스 트랜잭션 로그는 이 단계에서 다시 작성됩니다. 이로 인해 데이터가 손실 될 수 있습니다. 따라서 이 단계를 수행하기 전에 데이터베이스를 백업하는 것이 좋습니다.

    ALTER DATABASE Test_RO_FG_DB SET EMERGENCYGOALTER DATABASE Test_RO_FG_DB SET SINGLE_USERGODBCC CHECKDB (Test_RO_FG_DB, repair_allow_data_loss) WITH ALL_ERRORMSGSGOALTER DATABASE Test_RO_FG_DB SET MULTI_USERGO 
  9. 데이터베이스가 온라인 상태인지 확인하고 Service Broker 기능을 다시 설정합니다.

  10. 필요하지 않은 데이터베이스 파일을 삭제합니다. 다음 샘플 명령은 이 작업을 수행하는 방법을 보여줍니다.

    del /P new_Test_RO_FG.mdfdel /P new_Test_RO_FG_File1.ndfdel /P new_Test_RW_FG_File1.ndfdel /P new_Test_RO_FG_log.ldf 

추가 정보

데이터베이스가 SQL Server instance 연결할 때 발생하는 몇 가지 단계가 있습니다. 이러한 단계에는 데이터베이스 복구 및 이전 버전의 SQL Server 파일 업그레이드가 포함됩니다. "증상" 섹션에 설명된 문제에서 SQL Server 2012는 데이터베이스의 읽기 전용 파일이 검색되기 전에 업그레이드 프로세스를 시작합니다. 업그레이드 단계에는 데이터베이스의 부팅 페이지에서 "새로 종료" 비트를 지우는 트랜잭션 시작이 포함됩니다. 이전 버전의 SQL Server 시작 트랜잭션 레코드를 읽을 수 없습니다. 따라서 이전 버전의 SQL Server 데이터베이스를 사용할 수 없으며 SQL Server 3624 오류를 생성합니다.현재 위치 업그레이드 데이터베이스가 읽기 전용으로 표시되면 2012년 SQL Server Test_RO_DB 이라는 읽기 전용 데이터베이스가 포함된 SQL Server instance 현재 위치 업그레이드를 수행하는 경우 SQL Server 오류 로그에서 다음과 유사한 오류 메시지가 나타날 수 있습니다.

업그레이드 프로세스가 끝나면 Test_RO_DB 데이터베이스가 RECOVERY_PENDING 상태가 됩니다. ALTER DATABASE 명령을 사용하여 데이터베이스를 READ_WRITE 설정해야 합니다. 그런 다음 ALTER DATABASE 명령을 사용하여 데이터베이스를 READ_ONLY 설정합니다. 이렇게 하면 SQL Server 엔진이 데이터베이스를 올바른 버전으로 업그레이드할 수 있습니다.읽기/쓰기 데이터베이스에 읽기 전용으로 표시된 파일 그룹이 포함된 경우 현재 위치 업그레이드를 SQL Server 2012로 수행하면 SQL Server 오류 로그에서 다음과 유사한 메시지를 받을 수 있습니다. 이 문제는 SQL Server 이전 instance 읽기/쓰기 데이터베이스를 호스트하고 READ_ONLY 표시된 파일 그룹을 포함하는 경우에 발생합니다. 그러나 업그레이드 프로세스가 예상대로 완료되고 데이터베이스가 온라인으로 시작됩니다.참고 다음 오류 메시지에서 데이터베이스의 이름은 Test_RO_FG.

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.