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?
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?
Câu trả lời:
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.
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.).
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
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.
Đây là cách tiếp cận của tôi để nhập tệp .sql vào MS SQL:
Xuất bảng từ MySQL với --compatible=mssql
và --extended-insert=FALSE
các tùy chọn:
mysqldump -u [username] -p --compatible=mssql --extended-insert=FALSE db_name table_name > table_backup.sql
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}
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 –where
tù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 where
mệnh đề sql.
--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
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):
Đã tạo một bảng trong MS SQL có cấu trúc khớp với bảng nguồn trong MySql.
Dòng lệnh MS SQL đã cài đặt: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu
Đã 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"
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-
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.
Đố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.
Ngoài ra, bạn có thể sử dụng 'ODBC' + 'SQL Server Import and Export Wizard'. Liên kết dưới đây mô tả nó: https://www.mssqltips.com/sqlservertutorial/2205/mysql-to-sql-server-data-migration/
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