SQL Server 2012에서 SQL Server 2005로 데이터베이스를 이동하는 방법


30

데이터베이스를 SQL Server 2012 (32bit)에서 SQL Server 2005 (64bit)로 이동해야하는 경우 어떤 옵션이 있습니까?

나는 할 수 없다는 것을 안다.

  • SQL Server 2005에서 데이터베이스 백업 복원
  • 분리 및 부착

나는 내가 할 수 있다는 것을 안다.

  • 데이터 가져 오기 마법사를 사용하고 하나의 데이터베이스에서 시도했지만 데이터를 이동하는 것만으로도 ID 열을 유지하기 위해 임시 테이블을 작성하고 모든 FK, 색인 등을 다시 작성하는 많은 작업을 수행해야하기 때문에 번거로 웠습니다.

더 쉬운 옵션이 있습니까?


12
더 쉬운 옵션은 정직하게 대상을 2012로 업그레이드하는 것입니다.
Aaron Bertrand

답변:


40

아래의 방법을 따를 수 있습니다.

참고 : 새로운 데이터 유형 등과 같은 새로운 기능을 사용하는 경우 오류가 발생하므로 테스트해야합니다.

방법 1 : 기본 도구 사용

  1. SCHEMA_ONLY 데이터베이스를 스크립팅하고 대상 서버에서 빈 데이터베이스를 다시 작성하십시오. 아래는 스크린 샷입니다.

    여기에 이미지 설명을 입력하십시오

    여기에 이미지 설명을 입력하십시오

    여기에 이미지 설명을 입력하십시오

  2. BCP OUT 및 BULK INSERT를 사용하여 데이터를 삽입하십시오.

다음은 Part 2에 도움이되는 스크립트입니다.

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- save below output in a bat file by executing below in SSMS in TEXT mode
-- clean up: create a bat file with this command --> del D:\BCP_OUT\*.dat 

select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" '-- path to BCP.exe
        +  QUOTENAME(DB_NAME())+ '.'                                    -- Current Database
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP_OUT\'                                           -- Path where BCP out files will be stored
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SSERVERNAME\INSTANCE -n'                         -- ServerName, -E will take care of Identity, -n is for Native Format
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'                       -- sysdiagrams is classified my MS as UserTable and we dont want it
and schema_name(schema_id) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- Execute this on the destination server.database from SSMS.
--- Make sure the change the @Destdbname and the bcp out path as per your environment.

declare @Destdbname sysname
set @Destdbname = 'destination_database_Name'               -- Destination Database Name where you want to Bulk Insert in
select 'BULK INSERT '                                       -- Remember Tables **must** be present on destination Database
        +  QUOTENAME(@Destdbname)+ '.'
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.' 
        +  QUOTENAME(name) 
        + ' from ''D:\BCP_OUT\'                             -- Change here for bcp out path
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
        +  REPLACE(name,' ','') 
        +'.dat'' 
        with (
        KEEPIDENTITY,
        DATAFILETYPE = ''native'',  
        TABLOCK
        )'  + char(10) 
        + 'print ''Bulk insert for '+REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'+  REPLACE(name,' ','')+' is done... '''+ char(10)+'go' 
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'           -- sysdiagrams is classified my MS as UserTable and we dont want it
and schema_name(schema_id) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)

방법 2 : 타사 도구 사용

대상 서버에서 빈 데이터베이스를 만듭니다. Redgate의 스키마 비교 및 ​​데이터 비교를 사용하여 대상 서버에 데이터를 작성하고로드하십시오.

참고 : Redgate의 스키마 및 데이터 비교를 사용했으며 이러한 유형의 작업에 가장 적합한 도구이므로 타사 도구를 사용하는 경우 권장 사항은 Redgate입니다.


7
+1이지만 대상에서 작동하지 않는 특정 항목이 있다는 것을 명심하십시오. (그리고 우아한 타사 도구가 모든 것을 처리하는 방법이 확실하지 않습니다). SEQUENCEs, OFFSET / FETCH, LAG / LEAD 등과 같은 코드와 같은 개체
Aaron Bertrand

1
이전 데이터베이스에 대해 해당 스크립트를 스크립팅하고 실행하여 스키마를 작성하면 데이터를 전송하는 또 다른 옵션은 연결된 서버를 설정하여 한 인스턴스에서 다른 인스턴스로 직접 복사하는 것입니다. 모든 작업을 수행하는 루프를 작성하는 것은 어렵지 않습니다. FK 제약 처리하기 위해 당신은 당신이 적절한 순서로 테이블을 복사 확인해야합니다 또는 일시적으로 FKS를 제거하고 복사 한 후이를 다시 활성화 할 수있다. 마찬가지로 복사하는 동안 대상에서 트리거를 비활성화하려고합니다.
David Spillett

4

여기에 이미 제안 된 방법 외에도 BACPAC 파일을 만들어 대상으로 가져올 수도 있습니다. 이는 온-프레미스에서 Azure 클라우드 데이터베이스로 데이터베이스를 마이그레이션하도록 Microsoft에서 권장하는 방법과 유사합니다.

그것의 장점은 데이터뿐만 아니라 스키마 내보내기의 조합이며 데이터베이스 버전에 의존하지 않으므로 이론적으로 모든 버전의 데이터베이스를 모든 버전으로 가져올 수 있다는 것입니다.

그것의 단점은 소스에서 BACPAC 파일을 생성하기 전에 데이터베이스 외부의 객체 (사용자 또는 시스템 데이터베이스)에 대한 참조가 있거나 사용자가있는 경우 쉽게 실패 할 수있는 일종의 엄격한 유효성 검사 프로세스를 실행한다는 것입니다 암호화 된 객체. 그러나 운이 좋고 실패하지 않으면 오히려 쉬운 해결책이 될 수 있습니다.

최신 SSMS 버전 (17 또는 18) 중 하나만 있으면됩니다. https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

BACPAC 파일 작성을 시작하려면 데이터베이스를 마우스 오른쪽 단추로 클릭하고 "데이터 계층 응용 프로그램 내보내기 ..."를 선택하십시오 (다른 "데이터 계층 응용 프로그램 추출 ..."과 혼동하지 마십시오).

데이터 계층 응용 프로그램 내보내기 ...

단계를 안내하는 간단한 마법사가 제공됩니다. 완료되면 대상 서버에서 "데이터 계층 응용 프로그램 가져 오기 ..."를 사용할 수 있습니다. "데이터베이스"노드를 마우스 오른쪽 단추로 클릭하면 볼 수 있습니다. "데이터 배포와 혼동하지 마십시오. 계층 애플리케이션 ... ") :

데이터 계층 응용 프로그램 가져 오기 ...

또한이 단계를 안내하는 간단한 마법사가 표시됩니다.


-1

Sql Server의 버전을 줄이는 것은 매우 어려운 일입니다.
다음과 같은 몇 가지 옵션이 있습니다.
우선, 모든 데이터베이스 오브젝트 스크립트를 작성하고 대상 서버에서 실행하십시오.
그 후에는 사용할 수 있습니다.

  • SSIS,
  • 데이터 가져 오기 도구,
  • RedGate 또는 기타와 같은 타사 도구.

그러나 RedGate 데이터 비교 도구의 경우

기본 키가있는 테이블 만 비교한다는 점을 고려해야합니다. 따라서 기본 키가없는 테이블 인 경우 다른 방법을 사용해야합니다


8
나는이 답변이 Kins 답변에서 개선되지 않는다고 생각합니다.
James Anderson

-3

SQL Server에서 데이터베이스를 다운 그레이드 할 수 없습니다. 그러나 해결 방법은 모든 DB 개체를 스크립팅하고 대상 데이터베이스에 스크립트를 적용하는 것입니다. SSIS는이를 수행하는 데 유용한 방법입니다.


4
이것이 Kin의 대답에 중요한 것을 추가한다고 생각 합니까?
dezso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.