Công cụ tốt nhất để di chuyển cơ sở dữ liệu PostgreQuery sang MS SQL 2005?


8

Tôi có một cơ sở dữ liệu trong PostgreQuery 8.3.1 mà tôi muốn chuyển sang MS SQL Server 2005 (hoặc có thể là 2008), bao gồm cả lược đồ bảng và dữ liệu. Cơ sở dữ liệu có kích thước khoảng 50 GB với khoảng 400.000.000 hàng, vì vậy tôi nghĩ rằng các câu lệnh INSERT đơn giản nằm ngoài câu hỏi này. Bất cứ ai cũng có thể giới thiệu công cụ tốt nhất để thực hiện việc di chuyển này? Rõ ràng nó cần phải đáng tin cậy, vì vậy dữ liệu hoàn toàn giống nhau trong DB mục tiêu như trong nguồn một và nó cần có thể sao chép khối lượng dữ liệu này trong một thời gian hợp lý.


4
chỉ tò mò thôi: tại sao bạn muốn làm điều này?
wzzrd

Tôi đoán bạn đang chuyển sang một máy chủ Windows vì một số lý do khác ngoài chức năng db? Tôi hy vọng :)
warren

Câu trả lời:


6

Tôi đã kết thúc việc không sử dụng bất kỳ công cụ của bên thứ ba nào cho dữ liệu vì không có công cụ nào tôi từng thử làm việc cho các bảng lớn. Ngay cả SSIS cũng thất bại. Tôi đã sử dụng một công cụ thương mại cho lược đồ, mặc dù. Vì vậy, quá trình chuyển đổi của tôi là như sau:

  1. Full Convert Enterprise để sao chép lược đồ (không có dữ liệu).
  2. pg_dump để xuất dữ liệu từ Postgres ở định dạng "văn bản thuần túy", về cơ bản là tệp giá trị được phân tách bằng tab (TSV).
  3. Các kịch bản Python để chuyển đổi các tệp đã xuất thành định dạng bcp sẽ hiểu.
  4. bcp để nhập dữ liệu vào MSSQL.

Bước chuyển đổi quan tâm đến một số khác biệt trong các định dạng được sử dụng bởi pg_dump và bcp, chẳng hạn như:

  • pg_dump đặt một số nội dung cụ thể của Postgres vào đầu tệp và kết thúc dữ liệu bằng ".", trong khi bcp hy vọng toàn bộ tệp chứa dữ liệu
  • pg_dump lưu trữ các giá trị NULL dưới dạng "\ N", trong khi bcp không mong đợi gì ở vị trí của NULL (nghĩa là không có dữ liệu ở giữa các dấu tách cột)
  • pg_dump mã hóa các tab là "\ t" và dòng mới là "\ n", trong khi bcp xử lý các tab theo nghĩa đen
  • pg_dump luôn sử dụng các tab và dòng mới làm dấu phân cách, trong khi bcp cho phép người dùng chỉ định dấu phân cách. Điều này trở nên cần thiết nếu dữ liệu chứa bất kỳ tab hoặc dòng mới nào, vì chúng không được mã hóa.

Tôi cũng thấy rằng một số ràng buộc duy nhất ổn trong Postgres đã bị vi phạm trong MSSQL, vì vậy tôi đã phải loại bỏ chúng. Điều này là do NULL = NULL trong MSSQL (nghĩa là NULL được coi là một giá trị duy nhất), nhưng không phải trong Postgres.


Đó là một sự giải quyết SQL-Server. Thay vì một ràng buộc duy nhất, bạn cần đặt INDEX duy nhất được lọc (WHERE cột_name KHÔNG PHẢI).
Quandary

Bạn đã dẫn cho tôi một công cụ mà tôi đã thuyết phục ông chủ của tôi để mua. #FullConvert tuyệt vời của nó
Mugume david

6

Nếu bạn có các trình điều khiển hỗ trợ Postgres thích hợp được cài đặt trên hộp SQL 2005 của bạn (hoặc muốn sử dụng Postgres qua ODBC hoặc muốn chuyển dữ liệu từ Postgres sang tệp và nhập từ đó), bạn có thể sử dụng trình hướng dẫn nhập / xuất trong SQL Server trong để sao chép dữ liệu. Điều này sẽ hỏi bạn một loạt các câu hỏi và sau đó thực hiện nhập dưới dạng công việc gói Dịch vụ tích hợp máy chủ SQL (SSIS), sử dụng các thao tác chèn hàng loạt thích hợp.

Tuy nhiên, nếu trình hướng dẫn đó không phải là một tùy chọn, bạn nên cân nhắc rằng mặc dù bạn có số lượng hàng lớn, kích thước riêng của các hàng trung bình <135 byte và được cung cấp đủ không gian nhật ký giao dịch để cho phép giao dịch 50 GB xảy ra ' câu lệnh chèn đơn giản không phải là chính họ ra khỏi câu hỏi.


1
Hãy xem sử dụng BCP (nó là một tiện ích đi kèm với máy chủ SQL), nếu bạn kết thúc việc xuất dữ liệu và sau đó nhập vào SQL Server. Sử dụng SSIS là một ý tưởng tốt mặc dù nếu bạn muốn lấy nó trực tiếp từ máy chủ PG, nhưng có thể khiến bạn gặp rắc rối khi đăng nhập.
ColtonCat

Gói SSIS nghe có vẻ rất hứa hẹn và tôi đã thử nó, nhưng không may là nó hết bộ nhớ và không thành công. :( ERROR [HY000] Hết bộ nhớ trong khi đọc các bộ dữ liệu.; Lỗi khi thực hiện truy vấn (PSQLODBC35W.DLL)
EMP


0

Gần 10 năm trôi qua, và đây vẫn chưa phải là vấn đề thẳng thắn. Tôi đã kết thúc với một giải pháp lai, tôi đã tạo ra trình ánh xạ lược đồ của riêng mình bằng cách xuất các bình luận lược đồ và bảng / cột bằng lệnh sau:

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

Sau đó tôi đã viết một tập lệnh PHP đã dịch lược đồ sang T-SQL. Sau đó, tôi đã sử dụng phần mềm bên thứ 3 sau để thực hiện nhập hàng thực tế (không liên kết):

http://www.convert-in.com/pgs2mss.htm

Đó là một chút chậm, nhưng cho đến nay là rất tốt. Cơ sở dữ liệu của chúng tôi nhỏ hơn của bạn, chỉ có 15 GB, nhưng công cụ đó dường như xử lý tốt. Nó cũng là cái rẻ nhất tôi có thể tìm thấy ở mức khoảng 50 đô la. Cho đến nay nó là một giá trị trong khi đầu tư.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.