SQL Server 2008에서 2005로 다운 그레이드


32

SQL 2008을 사용하여 작성된 데이터베이스 파일은 2005와 호환되지 않습니다. 해결 방법이 있습니까?


서버 로그인도 내보내는 것을 잊지 마십시오.
StanleyJohns

2008 년에 개발 중이지만 프로덕션 서버는 여전히 2005 년입니까? 당신이 제공하는 모든 솔루션은 피할 수없는 시간을 지연시키는 동시에 당신의 인생을 비참하게 만듭니다. 정기적으로 다운 그레이드를하게 될 것입니다.
datagod

답변:


16

타사 도구가 필요하지 않습니다. SQL Server 2008 Management Studio는 "스크립트 데이터베이스"마법사에 "스크립트 데이터"옵션을 추가했기 때문에 데이터베이스를 다운 컨버전 할 수있는 강력한 도구를 제공했습니다.

SQL2008 SSMS에서 DB를 마우스 오른쪽 버튼으로 클릭하고 작업으로 이동 한 다음 "스크립트 생성"

마법사를 진행하면서 테이블 / 뷰 옵션에서 "스크립트 데이터"로 "참"을 선택했는지 확인하십시오. 모든 개체를 선택한 다음 2005 서버에서 생성 한 스크립트를 실행하십시오. ( 원래 데이터베이스가 매우 큰 경우 생성 된 스크립트가 방대 할 수 있습니다 !)

SQL2005 서버에 대해 마법사를 실행하여 SQL2005 데이터베이스를 SQL2000으로 다운 변환 할 수도 있습니다 (물론 워크 스테이션에 2008 도구가 설치되어 있어야 함).


4
공격은 없지만 데이터베이스가 큰 경우에는 해결책이 될 수 없습니다. 수백만 개의 행이있는 테이블 에서이 기술을 시도하고 (varchar (max)를 단일 열의 데이터 유형으로 생각하십시오.) Management Studio 가이 파일을 열고 구문 분석 할 수 있다면 행복 할 것입니다. 열리지 않으면 충돌이 발생합니다. 죄송하지만 db가 실제로 작은 경우를 제외 하고는이 문제에 대한 해결책이 아닙니다.
Marian

3
물론, 데이터베이스가 너무 큰 경우 데이터베이스 구조 만 스크립팅 한 다음 자주 사용하는 방법 (SSIS, BCP, 가져 오기 마법사)을 사용하여 데이터를 푸시하십시오.
BradC

SSMS 11.0에는 구조와 함께 데이터를 스크립팅하는 옵션이없는 것으로 보입니다. i.imgur.com/SGkG8oZ.png
jcollum

아, 이제 테이블 / 뷰 옵션 바로 위에있는 "스크립트 유형의 데이터"아래에 있습니다.
jcollum

16

한 SQL Server 인스턴스에서 다른 인스턴스로 데이터를 BCP 할 수 있습니다. 그것은 한 버전에서 다른 버전으로 데이터를 복사하는 가장 빠른 방법입니다. 데이터 양에 따라 시간이 오래 걸릴 수 있습니다.


2
데이터의 양에 따라 거의 항상 오랜 시간이 걸립니다
jcolebrand

그렇습니다. 큰 데이터베이스를 이전 버전의 SQL Server로 옮기는 것은 쉬운 일이 아닙니다.
mrdenny

2
BCP의 장점은 스크립트 데이터를 사용하는 것보다 빠릅니다. 예, 느리지 만 많은 대안보다 빠릅니다.
Jeremiah Peschka

15

불행히도 DB를 2008 형식에서 2005 형식으로 다운 그레이드하는 직접적인 방법은 없습니다.

과거 에이 작업을 수행 한 방법 (실제로 이전 버전의 SQL Server에서 프로세스는 동일하지만)은 다음과 같습니다.

  1. 아직 수행하지 않은 경우 SQL2008 인스턴스에서 DB 복원
  2. SQL2005 인스턴스에서 올바른 구조 (테이블, 인덱스, 제약 조건, 뷰, 프로세스, 트리거 등)로 빈 DB를 구축하십시오. 기존 빌드 절차 및 / 또는 소스 코드에서이 작업을 수행 할 수 있기를 원하지만 SQL Server Manager를 사용하여 2005 DB의 모든 스크립트를 생성하고 2008 인스턴스의 빈 스크립트에서 결과를 실행할 수 있습니다.
  3. 두 인스턴스가 서로를 볼 수 있는지 확인하고 (즉, 인스턴스가 다른 시스템에있는 경우 연결을 차단하는 방화벽이 없음) sp_addlinkedserver를 사용하여 연결하십시오 .
  4. 한 DB에서 다른 DB로 모든 데이터를 복사하십시오. 걱정할 트리거에 외래 키 제약 및 유사한 문제가없는 경우 DB를 함께 연결하고 테이블 목록 (sys.objects에서 선택)을 실행하고 실행
    INSERT destinationserver.destinationdb.schema.table SELECT * FROM sourcedb.schema.table
    하거나 INSERT schema.table SELECT * FROM sourceserver.sourcedb.schema.table인스턴스를 연결 한 경우 )
    를 기준으로합니다. 제약 조건 및 트리거를 적용하는 테이블 간 일관성이있는 경우 특히 이러한 작업의 순서에 대해 좀 더 영리해야합니다. 특히 자체 기반 제약 조건이있는 테이블과 같은 순환 제약 조건이있는 경우 (하나의 계층 구조를 유지하는 경우) 가능한 예로서 데이터).

데이터를 먼저 복사하고 3 단계 이후에 다른 모든 구조 (인덱스, 프로세스, 트리거 등)를 추가하는 것이 더 효율적일 수 있습니다. 이렇게하면 제약 조건 및 트리거로 인한 행 삽입 순서 문제를 피하고 인덱스를 이론적으로는 모든 데이터가 추가 될 때이를 구축하는 것보다 더 빠릅니다.하지만 테이블에 클러스터 된 인덱스가있는 경우 데이터를 추가하기 전에 이러한 인덱스를 생성하면 사실 이후에 더 빨리 생성되지 않습니다.

물론 이것은 모두 SQL 2008 특정 기능을 사용하는 개체가 없다고 가정합니다. 스키마를 다시 작성할 때 오류가 발생했을 때 그러한 것을 찾아 수정하면 좋을 것입니다. 코드 중 하나가 SQL Server 버전간에 다양하게 발생하는 공식적으로 정의되지 않은 동작에 의존하는 경우 나중에 찾아서 제거하기 위해 훨씬 더 미묘하고 찾기 어려운 버그가있을 수 있습니다.


1
-1 BCP와 비교할 때 실제로 비효율적이므로 (select * into from).
jcolebrand

@jcolebrand 효율성에 충분합니다. 기술은 내가 일한 것이지만.
David Spillett

그것은 공정한 시스템입니다. 나는 미래의 독자들 때문에 여기에 포함시킬 것이라고 생각했습니다. 문제가되지 않기 위해 현재 upvotes가 있습니다. ;)
jcolebrand


1

먼저 데이터베이스를 스크립팅하고 다운 그레이드 할 유형을 지정하는 버전을 확인해야합니다. 그리고 상위 버전에서 하위 버전으로 데이터를 복사하는 경우 SQL 데이터 비교를 통해 유용한 정보를 얻을 수 있습니다.

행운을 빕니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.