Nhập cơ sở dữ liệu MySQL vào MS SQL Server


89

Tôi có một tệp .sql từ một kết xuất MySQL chứa các bảng, định nghĩa và dữ liệu sẽ được chèn vào các bảng này. Làm cách nào để chuyển đổi cơ sở dữ liệu này được thể hiện trong tệp kết xuất thành cơ sở dữ liệu MS SQL Server?


1
Bạn có quyền truy cập vào cơ sở dữ liệu gốc không? Hay tệp xuất về cơ bản là tất cả những gì bạn có?
Whakkee

Tôi cũng có quyền truy cập vào DB ban đầu. Tôi chỉ nghĩ rằng việc sử dụng bãi chứa có thể dễ dàng hơn
marionmaiden

Câu trả lời:


62

Sử dụng SQL Server Migration Assistant (SSMA)

Ngoài MySQL, nó hỗ trợ Oracle, Sybase và MS Access.

Nó dường như khá thông minh và có khả năng xử lý các giao dịch chuyển tiền thậm chí không tầm thường. Nó cũng có một số giao diện dòng lệnh (ngoài GUI) nên về mặt lý thuyết, nó có thể được tích hợp vào một số quá trình tải hàng loạt.

Đây là liên kết tải xuống hiện tại cho phiên bản MySQL https://www.microsoft.com/en-us/download/details.aspx?id=54257

Phiên bản ổn định hiện tại (tháng 6 năm 2016) 6.0.1 gặp sự cố với trình điều khiển MySQL ODBC (5.3.6) hiện tại trong khi truyền dữ liệu. Tất cả mọi thứ 64 bit. Phiên bản 5.3 với trình điều khiển ODBC 5.1.13 hoạt động tốt.


9
Công cụ này chỉ hoạt động nếu bạn có thể cài đặt trình kết nối ODBC từ PC vào MySQL DB của mình. Nếu bạn chỉ có tệp kết xuất .sql, bạn không thể sử dụng SSMA.
Jake Munson

10
MySQL engine là phần mềm miễn phí và có cả phiên bản dành cho windows. Cài đặt nó và tải bãi chứa là một công việc tầm thường. Nếu bạn đang hy vọng tìm thấy một công cụ (thậm chí là thương mại, chưa nói đến miễn phí) có thể chuyển đổi đáng tin cậy một tập lệnh MySQL tùy ý sang SQL Server tương đương của nó - thì, chúc may mắn với điều đó.
Zar Shardan

1
Điểm tốt. Và đó là những gì tôi đã làm ngày hôm qua. Không cần viết tiện ích chuyển đổi tùy chỉnh của riêng bạn, cài đặt MySQL dường như là lựa chọn tốt nhất. Sử dụng SSMA là một cơn đau ở mông, nhưng cuối cùng tôi đã làm được.
Jake Munson

2
SSMA là một lựa chọn tuyệt vời, đây phải là câu trả lời được chấp nhận. Tôi không thấy khó sử dụng chút nào.
DonBecker

2
Nó yêu cầu SQL Server Agent không đi kèm với SQL Server Express.
Vinicius Rocha

18

Tôi đề nghị bạn sử dụng mysqldump như vậy:

mysqldump --compatible=mssql

phpMyAdmin vẫn là một ứng dụng web và có thể có một số hạn chế đối với cơ sở dữ liệu lớn (thời gian thực thi tập lệnh, bộ nhớ có thể phân bổ, v.v.).


6
Than ôi, điều này mang lại cho tôi tất cả các loại vấn đề về tính ổn định. Tập lệnh sẽ chứa dấu gạch ngược xung quanh tên cột, kiểu dữ liệu không tồn tại trong MSSQL, sẽ vi phạm giới hạn chèn tối đa 1000, từ khóa auto_increment, v.v. Câu trả lời này là một gợi ý hợp lý, nhưng tôi e rằng không 'không hoạt động quá tốt (ít nhất: nó không dành cho tôi).
Jeroen

mysqldump --comp Tương thích = ansi "Tạo đầu ra tương thích hơn với các hệ thống cơ sở dữ liệu khác hoặc với các máy chủ MySQL cũ hơn. Giá trị được phép duy nhất cho tùy chọn này là ansi, có cùng ý nghĩa với tùy chọn tương ứng để đặt chế độ SQL của máy chủ."
Thomas Taylor

14

Tôi đã tìm thấy một cách cho điều này trên mạng

Nó đòi hỏi một chút công việc, bởi vì nó phải được hoàn thành từng bàn một. Nhưng dù sao, tôi có thể sao chép các bảng, dữ liệu và các ràng buộc vào cơ sở dữ liệu MS SQL.

Đây là liên kết

http://www.codeproject.com/KB/database/migrate-mysql-to-mssql.aspx


1
Đó là khi cả Mysql và SQL nằm trong một máy hoặc chúng được kết nối qua mạng. Điều này không hữu ích khi tồn tại hai máy khác nhau và bạn có tệp Dump từ mysql. đúng?
Espanta

7

Nếu bạn thực hiện xuất với PhpMyAdmin , bạn có thể chuyển chế độ tương thích sql sang 'MSSQL'. Bằng cách đó, bạn chỉ cần chạy tập lệnh đã xuất dựa trên cơ sở dữ liệu MS SQL của mình và bạn đã hoàn tất.

Nếu bạn không thể hoặc không muốn sử dụng PhpMyAdmin, cũng có một tùy chọn tương thích trong mysqldump , nhưng cá nhân tôi muốn PhpMyAdmin làm điều đó cho tôi.


1
Câu trả lời này phù hợp với tôi, với những sửa đổi tối thiểu đối với tập lệnh được tạo. Đã đưa nó vào SQL Server 2012. Không thấy chế độ tương thích trước đây.
Kiel

7

Đây là cách tiếp cận của tôi để nhập tệp .sql vào MS SQL:

  1. Xuất bảng từ MySQL với --compatible=mssql--extended-insert=FALSEcác tùy chọn:

    mysqldump -u [username] -p --compatible=mssql --extended-insert=FALSE db_name table_name > table_backup.sql

  2. Chia tệp đã xuất bằng PowerShell thành 300000 dòng cho mỗi tệp:

    $i=0; Get-Content exported.sql -ReadCount 300000 | %{$i++; $_ | Out-File out_$i.sql}

  3. Chạy từng tệp trong MS SQL Server Management Studio

Có một số mẹo làm thế nào để tăng tốc độ chèn .

Cách tiếp cận khác là sử dụng –wheretùy chọn mysqldump . Bằng cách sử dụng tùy chọn này, bạn có thể chia bảng của mình theo bất kỳ điều kiện nào được hỗ trợ bởi wheremệnh đề sql.


làm cách nào chúng ta có thể xuất toàn bộ cơ sở dữ liệu thay vì từng bảng
MonsterMMORPG

hãy thử --databases [db_name]từ khóa như nó được giải thích trong câu trả lời này: stackoverflow.com/a/26096339/155687
Vladislav

4

Hôm nay tôi gặp sự cố tương tự - tôi cần sao chép một bảng lớn (5 triệu hàng) từ MySql vào MS SQL.

Đây là các bước tôi đã thực hiện (trong Ubuntu Linux):

  1. Đã tạo một bảng trong MS SQL có cấu trúc khớp với bảng nguồn trong MySql.

  2. Dòng lệnh MS SQL đã cài đặt: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. Đã dồn bảng từ MySql vào một tệp:

mysqldump \
    --gọn nhẹ \
    --complete-insert \
    --no-create-info \
    - tương thích = mssql \
    --extended-insert = FALSE \
    - máy chủ "$ MYSQL_HOST" \
    --người dùng "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    "$ MYSQL_DB" \
    "$ TABLE"> "$ FILENAME"
  1. Trong trường hợp của tôi, tệp kết xuất khá lớn, vì vậy tôi quyết định chia nó thành một số phần nhỏ (mỗi phần 1000 dòng) - split --lines=1000 "$FILENAME" part-

  2. Cuối cùng, tôi đã lặp lại các tệp nhỏ này, thực hiện một số thay thế văn bản và thực thi từng phần một trên máy chủ MS SQL:

xuất SQLCMD = / opt / mssql-tools / bin / sqlcmd

x = 0

cho tệp trong một phần- *
làm
  echo "Đang xuất tệp [$ file] sang MS SQL. Đã xử lý $ x nghìn (s)"

  # thay thế \ 'bằng' '
  sed -i "s / \\\ '/' '/ g" "$ file"

  # loại bỏ tất cả "
  sed -i 's / "// g'" $ file "

  # cho phép chèn các bản ghi với PK (id) được chỉ định
  sed -i "1s / ^ / SET IDENTITY_INSERT $ TABLE ON; \ n /" "$ file"

  "$ SQLCMD" -S "$ AZURE_SERVER" -d "$ AZURE_DB" -U "$ AZURE_USER" -P "$ AZURE_PASS" -i "$ tệp"
  echo ""
  echo ""

  x = $ ((x + 1))
làm xong

echo "Đã xong"

Tất nhiên bạn sẽ cần phải thay thế các biến tôi như $AZURE_SERVER, $TABLE, vv với bạn.

Hy vọng rằng sẽ giúp.


2

Đối với tôi, cách tốt nhất là xuất tất cả dữ liệu bằng lệnh này:

mysqldump -u USERNAME -p --all-databases --complete-insert --extended-insert=FALSE --compatible=mssql > backup.sql

--extended-insert = FALSE là cần thiết để tránh giới hạn nhập 1000 hàng của mssql.

Tôi đã tạo các bảng của mình bằng công cụ di chuyển của mình, vì vậy tôi không chắc liệu CREATE từ tệp backup.sql có hoạt động hay không.

Trong SSMS của MSSQL, tôi phải nhập bảng dữ liệu theo bảng với IDENTITY_INSERT ON để ghi các trường ID:

SET IDENTITY_INSERT dbo.app_warehouse ON;
GO 
INSERT INTO "app_warehouse" ("id", "Name", "Standort", "Laenge", "Breite", "Notiz") VALUES (1,'01','Bremen',250,120,'');
SET IDENTITY_INSERT dbo.app_warehouse OFF;
GO 

Nếu bạn có các mối quan hệ, bạn phải nhập con trước và ngoài bảng có khóa ngoại.



0

Chạy:

mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql

Bạn có muốn xem thanh tiến trình không?

pv mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql
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.