Applies ToSQL Server 2012 Enterprise

증상

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

  • Microsoft sql Server 2005, Microsoft SQL Server 2008 또는 Microsoft SQL Server 2008 R2의 인스턴스를 설치 합니다.

  • SQL Server 인스턴스는 INST1으로 명명 되며, 이름이 Test_RO_FG_DB 인 데이터베이스를 호스팅합니다.

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

    • 주요한

    • RO_FG

    • RW_FG

  • RO_FG 이라는 이름의 파일 그룹이 READ_ONLY으로 표시 되어 있습니다.

  • Microsoft SQL Server 2012의 새 인스턴스를 설치 합니다. 이 SQL Server 2012 인스턴스의 이름은 INST2입니다.

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

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

  • 다음과 같은 오류 메시지가 표시 됩니다.

    메시지 3415, 수준 16, 상태 2, 줄 1 데이터베이스 ' Test_RO_FG_DB '은 (는) 읽기 전용 이거나 읽기 전용 파일 이거나 사용자에 게 일부 파일을 수정할 수 있는 권한이 없기 때문에 업그레이드할 수 없습니다. 데이터베이스 또는 파일을 쓰기 가능 하 게 만든 다음 복구를 다시 실행 합니다.

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

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

참고 이 문제는 READ_ONLY 표시 된 파일 그룹이 포함 된 데이터베이스를 첨부 하는 경우에만 발생 합니다. 모든 데이터가 READ_ONLY 표시 된 READ_ONLY 데이터베이스를 이동 하려고 하면이 문제가 발생 하지 않습니다.

원인

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

상태

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

해결 방법

누적 업데이트 정보

SQL Server 2012

이 문제에 대 한 픽스는 SQL Server 2012의 누적 업데이트 2에서 처음 릴리스 되었습니다. 이 누적 업데이트 패키지에 대 한 자세한 내용은 다음 문서 번호를 클릭 하 여 Microsoft 기술 자료 문서를 참조 하세요.

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

2692828 SQL Server 2012이 출시 된 이후 출시 된 SQL Server 2012 빌드 Sql server 2012 설치에 SQL Server 2012 핫픽스를 적용 해야 합니다.

해결 방법

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

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

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

  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. 데이터베이스를 온라인으로 설정 합니다. 이렇게 하려면 다음 명령을 실행 합니다.

    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 인스턴스에 다시 연결 합니다. 이를 위해 다음 작업을 수행하십시오.참고

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

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

  1. INST1를 호스트 하는 SQL Server 인스턴스로 데이터베이스 파일을 이동 합니다.

  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 인스턴스에 연결 될 때 발생 하는 몇 가지 단계가 있습니다. 이러한 단계에는 데이터베이스를 복구 하 고 이전 버전의 SQL Server에서 파일을 업그레이드 하는 것이 포함 됩니다. "현상" 절에 설명 되어 있는 문제에서 SQL Server 2012는 데이터베이스의 읽기 전용 파일이 검색 되기 전에 업그레이드 프로세스를 시작 합니다. 업그레이드 단계에서는 데이터베이스의 부팅 페이지에서 "깨끗 하 게 종료" 비트를 지우는 트랜잭션 시작을 포함 합니다. 이전 버전의 SQL Server는 시작 트랜잭션 레코드를 읽을 수 없습니다. 따라서 데이터베이스는 이전 버전의 SQL Server에서 사용할 수 없으며 SQL Server는 3624 오류를 생성 합니다.데이터베이스가 읽기 전용으로 표시 된 경우 현재 위치 업그레이드Sql server 2012에 대 한 Test_RO_DB 라는 읽기 전용 데이터베이스가 포함 된 SQL Server 인스턴스의 현재 업그레이드를 수행 하는 경우 SQL Server 오류 로그에 다음과 유사한 오류 메시지가 나타날 수 있습니다.

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

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

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

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.