2011-07-03 50 views
42

Tôi có một cơ sở dữ liệu PostgreSQL mà tôi muốn chuyển sang SQL Server - cả lược đồ và dữ liệu. Tôi nghèo nên tôi không muốn trả tiền. Tôi cũng lười biếng, vì vậy tôi không muốn làm rất nhiều việc. Hiện tại tôi đang làm bảng này theo bảng, và có khoảng 100 bảng để làm. Điều này cực kỳ tẻ nhạt.Cách dễ nhất để di chuyển cơ sở dữ liệu PostgreSQL vào SQL Server

Có loại mẹo nào làm những gì tôi muốn không?

+2

Tôi phải hỏi, nếu bạn không có tiền, tại sao bạn chuyển sang SQL Server? Trong khi Express có thể miễn phí, cơ sở hạ tầng cần thiết để triển khai nó sẽ không ... –

+8

Những nhược điểm này là ngớ ngẩn; đó là một câu hỏi hoàn toàn hợp pháp và MS SQL -> MySQL câu hỏi di cư đã được upvoted trên đây. Tôi đang chuyển sang SQL Server bởi vì tôi đã có một cơ sở dữ liệu đó là MS SQL nhưng rất nhiều dữ liệu có giá trị mà tôi có thể sử dụng chỉ tồn tại trong một cơ sở dữ liệu PostgreSQL. Lưu trữ cho hầu hết các máy chủ có cùng mức giá và tôi thích ASP.NET MVC 3 vì không có tiện ích bổ sung của bên thứ ba. LINQ to SQL là flakey với PostgreSQL. – Hut8

+0

Bạn gặp vấn đề gì khi sử dụng phương thức SQL pg_dump và nhập DDL/DML trên SQL Server? Bạn có ý gì với "Tôi đang làm bảng này theo bảng"? –

Trả lời

43

Tôi tin rằng bạn có thể đã nhận được phiếu giảm giá do dễ dàng tạo ra một kịch bản lệnh SQL đơn giản từ PostgreSQL mà về mặt lý thuyết có thể chạy lại bất kỳ DBMS nào. Nếu một người dùng là người dùng PostgreSQL thông thường, thì phát ra âm thanh như một câu hỏi ngớ ngẩn.

Đó là không công bằng vì nó quay ra đây thực sự là một vấn đề khó khăn vừa phải (mặc dù nhiều hơn do cú pháp lẻ SQL Server và giao diện hơn bất kỳ thất bại của PostgreSQL).

Bạn sẽ có thể tìm thấy một số thông tin hữu ích trong câu trả lời được chấp nhận trong trang Serverfault này: https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql-2005.

Nếu bạn có thể nhận được các giản đồ chuyển đổi mà không có dữ liệu, bạn có thể rút ngắn các bước cho dữ liệu bằng cách sử dụng lệnh này:

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

tải Đây sẽ là khá chậm, nhưng các tùy chọn --column-inserts tạo các câu lệnh INSERT chung nhất có thể cho mỗi hàng dữ liệu và phải tương thích.

EDIT: Gợi ý về chuyển đổi sơ đồ sau:

tôi sẽ bắt đầu bằng cách bán phá giá các lược đồ, nhưng loại bỏ bất cứ điều gì đã làm với quyền sở hữu hoặc quyền. Điều này cần được đủ:

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

Chỉnh sửa tập tin này để thêm dòng BEGIN TRANSACTION; đến đầu và ROLLBACK TRANSACTION; đến cùng. Bây giờ bạn có thể tải nó và chạy nó trong một cửa sổ truy vấn trong SQL Server. Nếu bạn nhận được bất kỳ lỗi nào, hãy đảm bảo rằng bạn đi đến cuối tệp, đánh dấu câu lệnh ROLLBACK và chạy nó (bằng cách nhấn F5 trong khi câu lệnh được đánh dấu).

Về cơ bản, bạn phải giải quyết từng lỗi cho đến khi tập lệnh chạy qua sạch. Sau đó, bạn có thể thay đổi ROLLBACK TRANSACTION thành COMMIT TRANSACTION và chạy một lần cuối cùng.

Thật không may, tôi không thể giúp bạn gặp lỗi nào vì tôi chưa bao giờ chuyển từ PostgreSQL sang SQL Server, chỉ theo cách khác. Một số điều mà tôi mong chờ là một vấn đề, tuy nhiên (rõ ràng, không một danh sách đầy đủ):

  • PostgreSQL không lĩnh vực tự động tăng bằng cách liên kết một lĩnh vực NOT NULL INTEGER đến một SEQUENCE sử dụng một DEFAULT. Trong SQL Server, đây là một cột IDENTITY, nhưng chúng không hoàn toàn giống nhau. Tôi không chắc chắn nếu chúng là tương đương, nhưng nếu lược đồ ban đầu của bạn có đầy đủ các trường "id", bạn có thể gặp rắc rối. Tôi không biết liệu SQL Server có CREATE SEQUENCE hay không, vì vậy bạn có thể phải xóa chúng.
  • Chức năng cơ sở dữ liệu/Thủ tục lưu trữ không dịch giữa các nền tảng RDBMS. Bạn sẽ cần phải xóa bất kỳ câu lệnh CREATE FUNCTION nào và dịch các thuật toán theo cách thủ công.
  • Hãy cẩn thận về mã hóa tệp dữ liệu.Tôi là một người Linux, vì vậy tôi không có ý tưởng làm thế nào để xác minh mã hóa trong Windows, nhưng bạn cần phải chắc chắn rằng những gì SQL Server dự kiến ​​là giống như các tập tin bạn đang nhập từ PostgreSQL. pg_dump có tùy chọn --encoding= cho phép bạn đặt mã hóa cụ thể. Tôi dường như nhớ lại rằng Windows có xu hướng sử dụng hai byte, mã hóa UTF-16 cho Unicode, nơi PostgreSQL sử dụng UTF-8. Tôi đã có một số vấn đề đi từ SQL Server để PostgreSQL do đầu ra UTF-16 vì vậy nó sẽ có giá trị nghiên cứu.
  • Kiểu dữ liệu PostgreSQL TEXT chỉ đơn giản là một VARCHAR không có độ dài tối đa. Trong SQL Server, TEXT là ... phức tạp (và không được chấp nhận). Mỗi trường trong lược đồ ban đầu của bạn được khai báo là TEXT sẽ cần phải được xem xét cho một kiểu dữ liệu SQL Server thích hợp.
  • Máy chủ SQL có các loại dữ liệu bổ sung cho dữ liệu UNICODE. Tôi không quen thuộc với nó để đưa ra đề xuất. Tôi chỉ đang chỉ ra rằng nó có thể là một vấn đề.
+0

Thông tin tuyệt vời. Cảm ơn rất nhiều. Bất kỳ gợi ý nào về việc chuyển đổi lược đồ mà không có một sản phẩm thương mại?Tôi cũng đang ở đây. – Hut8

+0

Thêm chi tiết được thêm vào. Xin lưu ý, tôi cũng đã sửa phiên bản dữ liệu của lệnh pg_dump để thêm tùy chọn quan trọng: --data-only. –

1

Tôi đã tìm thấy cách nhanh hơn và dễ dàng hơn để thực hiện việc này.

Đầu tiên copy bảng của bạn (hoặc truy vấn) vào một tập tin phân định tab như vậy:

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'' 

Tiếp theo bạn cần tạo bảng trong SQL, điều này sẽ không xử lý bất kỳ sơ đồ cho bạn. Lược đồ phải khớp với tệp tsv đã xuất của bạn trong thứ tự trường và kiểu dữ liệu.

Cuối cùng bạn chạy tiện ích BCP SQL để mang lại trong file tsv như vậy:

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

Một vài điều đáng chú ý mà tôi gặp phải. Postgres và SQL Server xử lý các trường boolean khác nhau. Lược đồ SQL Server của bạn cần phải có các trường boolean của bạn được đặt thành varchar (1) và dữ liệu kết quả sẽ là 'f', 't' hoặc null. Sau đó, bạn sẽ phải chuyển đổi trường này thành bit. làm một cái gì đó như:

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; 

Một điều nữa là các trường địa lý/hình học rất khác nhau giữa hai nền tảng. Xuất các trường hình học dưới dạng WKT sử dụng ST_AsText(geo) và chuyển đổi một cách thích hợp trên đầu máy chủ SQL.

Có thể có nhiều sự không tương thích cần chỉnh sửa như thế này.

EDIT. Vì vậy, trong khi kỹ thuật này không hoạt động về mặt kỹ thuật, tôi đang cố gắng chuyển vài triệu bản ghi từ 100 bảng trở lên sang SQL Azure và bcp sang SQL Azure khá dễ dàng. Tôi liên tục bị gián đoạn Không thể mở tệp dữ liệu máy chủ BCP lỗi, máy chủ không liên tục định giờ và vì lý do nào đó, một số hồ sơ không được chuyển mà không có dấu hiệu lỗi hoặc sự cố. Vì vậy, kỹ thuật này không ổn định để chuyển lượng lớn dữ liệu sang Azure SQL.

Các vấn đề liên quan