2011-07-03 2 views
42

스키마와 데이터 모두 SQL Server로 이동하려는 PostgreSQL 데이터베이스가 있습니다. 나는 돈이 안되기 때문에 나는 가난하다. 나는 또한 게으르다. 그래서 나는 많은 일을하고 싶지 않다. 현재 저는이 테이블을 테이블별로 처리하고 있으며 약 100 개의 테이블이 있습니다. 이것은 매우 지루합니다.PostgreSQL 데이터베이스를 SQL Server로 쉽게 마이그레이션하는 방법

내가 원하는대로 할 수있는 트릭이 있습니까?

+2

돈이 없다면 왜 SQL Server로 이동해야합니까? Express는 무료 일 수 있지만 배포하기 위해 필요한 인프라는 없습니다 ... –

+8

이러한 downvotes 바보입니다; 그것은 완벽하게 정당한 질문이며, MS SQL -> MySQL 마이그레이션 질문은 여기에 upvoted되었습니다. MS SQL이 아직 데이터베이스이지만 PostgreSQL 데이터베이스에만 사용할 수있는 소중한 데이터가 많이 있기 때문에 SQL Server로 이동하고 있습니다. 대부분의 서버 호스팅 가격은 대략 같은 가격이며 제 3 자 애드온과 함께 제공되는 ASP.NET MVC 3을 좋아합니다. LINQ to SQL은 PostgreSQL을 사용하여 flakey입니다. – Hut8

+0

SQL Server에서 pg_dump SQL 메서드를 사용하고 DDL/DML을 가져 오는 데 어떤 문제가 있습니까? "나는이 테이블을 테이블로하고있다"는 것은 무엇을 의미합니까? –

답변

43

PostgreSQL에서 간단한 (이론적으로) 모든 DBMS에 대해 다시 실행할 수있는 간단한 SQL 스크립트를 생성하는 놀라운 기능 덕분에 투표 수가 줄어들 었다고 생각합니다. 정규 PostgreSQL 사용자 인 경우 은 바보 같은 질문 인을 들려줍니다.

실제로 이것은 적당히 어려운 문제입니다. (PostgreSQL의 실패보다 SQL Server의 이상한 구문과 인터페이스가 더 많기 때문에).

이 Serverfault 페이지의 허용 대답에서 유용한 정보를 찾으실 수 있습니다 : https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql-2005.

하면 데이터없이 변환 된 스키마를 얻을 수 있다면, 당신은이 명령을 사용하여 데이터에 대한 단계를 단축 할 수 있습니다 :

pg_dump --data-only --column-inserts your_db_name > data_load_script.sql 

이 부하가 매우 느릴 것,하지만 --column-inserts 옵션을 생성 각 데이터 행에 대해 가능한 가장 일반적인 INSERT 문이며 호환 가능해야합니다.

편집 : 스키마를 변환하는 방법에 대한 제안은 다음과 같습니다 내가 스키마 덤프하지만, 소유권 또는 권한과 관련이있다 아무것도 제거하여 시작할 것

. 이 충분해야한다 :

pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql 

편집이 파일이 마지막에 시작과 ROLLBACK TRANSACTION;에 선 BEGIN TRANSACTION;을 추가 할 수 있습니다. 이제로드하여 SQL Server의 쿼리 창에서 실행할 수 있습니다. 오류가 발생하면 파일의 맨 아래로 이동하여 ROLLBACK 문을 강조 표시하고 실행하십시오 (명령문이 강조 표시되어있는 동안 F5 키를 눌러 실행하십시오).

기본적으로 스크립트가 완전히 실행될 때까지 각 오류를 해결해야합니다. 그런 다음 ROLLBACK TRANSACTIONCOMMIT TRANSACTION으로 변경하고 마지막으로 한 번 실행하십시오.

불행히도 PostgreSQL에서 SQL Server로 옮겨 본 적이없는 오류는 도움이되지 않습니다. 나는 그러나, 문제가 될 기대 어떤 것들은 (분명하지 완전한 목록)하십시오 DEFAULT를 사용하여 SEQUENCENOT NULL INTEGER 필드를 연결하여

  • PostgreSQL을 않는 자동 증가 필드. SQL Server에서 이것은 IDENTITY 열이지만 정확히 똑같은 것은 아닙니다. 나는 그것들이 동등한 지 잘 모르겠다. 그러나 만약 당신의 원래 스키마가 "id"필드들로 가득 차 있다면, 당신은 약간의 문제에 봉착 할 것이다. SQL 서버에 CREATE SEQUENCE이 있는지 모르겠으므로 제거해야 할 수 있습니다.
  • 데이터베이스 함수/저장 프로시 저는 RDBMS 플랫폼간에 변환하지 않습니다. CREATE FUNCTION 문을 제거하고 알고리즘을 수동으로 변환해야합니다.
  • 데이터 파일의 인코딩에주의하십시오.필자는 리눅스 사용자이므로 Windows에서 인코딩을 확인하는 방법을 알지 못하지만 SQL Server에서 PostgreSQL에서 가져 오는 파일과 동일해야합니다. pg_dump에는 특정 인코딩을 설정할 수있는 --encoding= 옵션이 있습니다. 필자는 Windows가 PostgreSQL에서 UTF-8을 사용하는 유니 코드에 대해 2 바이트 UTF-16 인코딩을 사용하는 경향이 있음을 기억합니다. SQL Server에서 PostgreSQL으로 UTF-16 출력으로 인해 문제가 발생하여 조사 할 가치가있었습니다.
  • PostgreSQL 데이터 유형 TEXT은 최대 길이가없는 VARCHAR 일뿐입니다. SQL Server에서 TEXT은 복잡합니다 (더 이상 사용되지 않습니다). TEXT으로 선언 된 원래 스키마의 각 필드는 적절한 SQL Server 데이터 형식에 대한 검토가 필요합니다.
  • SQL Server에는 UNICODE 데이터에 대한 추가 데이터 형식이 있습니다. 나는 그것에 대한 제안을하기에 익숙하지 않다. 나는 그것이 문제일지도 모른다는 것을 지적하고있다.
+0

굉장한 정보. 매우 감사합니다. 상용 제품없이 스키마 변환에 대한 힌트가 있습니까?나도 여기 저기에 곤두박질 친다. – Hut8

+0

세부 사항이 추가되었습니다. 필자는 pg_dump 명령의 데이터 버전을 수정하여 중요한 옵션 인 --data-only를 추가했습니다. –

1

나는 이것을 성취 할 수있는 더 빠르고 쉬운 방법을 발견했다.

우선과 같이 탭으로 구분 된 파일 테이블 (또는 쿼리)을 복사 :

COPY (SELECT siteid, searchdist, listtype, list, sitename, county, street, 
    city, state, zip, georesult, elevation, lat, lng, wkt, unlocated_bool, 
    id, status, standard_status, date_opened_or_reported, date_closed, 
    notes, list_type_description FROM mlocal) TO 'c:\SQLAzureImportFiles\data_script_mlocal.tsv' NULL E'' 

다음이 당신을 위해,이 처리하지 않습니다 스키마를 SQL에서 테이블을 작성해야합니다. 스키마는 내 보낸 tsv 파일과 필드 순서 및 데이터 유형이 일치해야합니다.

마지막으로 그렇게 같이 TSV 파일에 가져다 SQL의 BCP 유틸리티를 실행합니다

bcp MyDb.dbo.mlocal in "\\NEWDBSERVER\SQLAzureImportFiles\data_script_mlocal.tsv" -S tcp:YourDBServer.database.windows.net -U YourUserName -P YourPassword -c 

나는 발생주의의 몇 가지를. Postgres와 SQL Server는 부울 필드를 다르게 처리합니다. SQL Server 스키마는 부울 필드를 varchar (1)로 설정해야하며 결과 데이터는 'f', 't'또는 null이됩니다. 이 필드를 조금 변환해야합니다.

ALTER TABLE mlocal ADD unlocated bit; 
UPDATE mlocal SET unlocated=1 WHERE unlocated_bool='t'; 
UPDATE mlocal SET unlocated=0 WHERE unlocated_bool='f'; 
ALTER TABLE mlocal DROP COLUMN unlocated_bool; 

또 다른 점은 두 플랫폼간에 지형/기하학 필드가 매우 다른 것입니다. 기하학 필드를 ST_AsText(geo)을 사용하여 WKT로 내보내고 SQL Server 끝에서 적절히 변환하십시오.

이렇게 비좁음이 필요한 비 호환성이있을 수 있습니다.

EDIT. 그래서이 기술이 기술적으로 효과가있는 반면 100 개 이상의 테이블을 SQL Azure로 변환하고 SQL Azure를 bcp로 변환하려고 시도하고 있습니다. 간헐적으로 계속 발생합니다. BCP 호스트 데이터 파일 오류를 열 수 없으면 서버가 간헐적으로 시간이 초과되어 일부 레코드가 오류나 문제의 표시없이 전송되지 않습니다. 따라서이 기술은 많은 양의 데이터를 Azure SQL로 전송할 때 안정적이지 못합니다.

관련 문제