นำเข้าฐานข้อมูล MySQL ไปยัง MS SQL Server


92

ฉันมีไฟล์. sql จากดัมพ์ MySQL ที่มีตารางคำจำกัดความและข้อมูลที่จะแทรกในตารางเหล่านี้ ฉันจะแปลงฐานข้อมูลนี้ที่แสดงในไฟล์ดัมพ์เป็นฐานข้อมูล MS SQL Server ได้อย่างไร


1
คุณมีสิทธิ์เข้าถึงฐานข้อมูลเดิมด้วยหรือไม่? หรือไฟล์ส่งออกโดยพื้นฐานแล้วทั้งหมดที่คุณมี?
Whakkee

ฉันได้เข้าถึงฐานข้อมูลเดิมด้วย ฉันแค่คิดว่าการใช้ดัมพ์อาจจะง่ายกว่า
marionmaiden

คำตอบ:


62

ใช้SQL Server Migration Assistant (SSMA)

นอกจาก MySQL แล้วยังรองรับ Oracle, Sybase และ MS Access

ดูเหมือนว่าจะค่อนข้างฉลาดและสามารถจัดการได้แม้กระทั่งการถ่ายโอนที่ไม่สำคัญ นอกจากนี้ยังมีอินเทอร์เฟซบรรทัดคำสั่ง (นอกเหนือจาก GUI) ดังนั้นในทางทฤษฎีจึงสามารถรวมเข้ากับกระบวนการโหลดแบทช์บางส่วนได้

นี่คือลิงค์ดาวน์โหลดปัจจุบันสำหรับเวอร์ชัน MySQL https://www.microsoft.com/en-us/download/details.aspx?id=54257

เวอร์ชันเสถียรปัจจุบัน (มิถุนายน 2016) 6.0.1 ล้มเหลวด้วยไดรเวอร์ MySQL ODBC ปัจจุบัน (5.3.6) ขณะถ่ายโอนข้อมูล ทุกอย่าง 64 บิต เวอร์ชัน 5.3 ที่มีไดรเวอร์ 5.1.13 ODBC ทำงานได้ดี


9
เครื่องมือนี้ใช้งานได้ก็ต่อเมื่อคุณสามารถติดตั้งตัวเชื่อมต่อ ODBC จากพีซีของคุณไปยัง MySQL DB ของคุณ หากคุณมีไฟล์ดัมพ์. sql คุณไม่สามารถใช้ SSMA ได้
Jake Munson

10
MySQL engine เป็นซอฟต์แวร์ฟรีและมีเวอร์ชันสำหรับ windows ด้วย การติดตั้งและโหลดดัมพ์เป็นงานที่ไม่สำคัญ หากคุณหวังที่จะหาเครื่องมือ (แม้แต่เชิงพาณิชย์ก็ปล่อยให้ฟรี) ที่จะแปลงสคริปต์ MySQL ตามอำเภอใจให้เทียบเท่ากับ SQL Server ได้อย่างน่าเชื่อถือขอให้โชคดี
Zar Shardan

1
จุดดี. และนั่นคือสิ่งที่ฉันทำเมื่อวานนี้ การไม่เขียนยูทิลิตี้การแปลงที่กำหนดเองการติดตั้ง MySQL ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุด SSMA ปวดก้นมาก แต่ในที่สุดฉันก็ใช้งานได้
Jake Munson

2
SSMA เป็นตัวเลือกที่ยอดเยี่ยมซึ่งควรเป็นคำตอบที่ได้รับการยอมรับ ฉันไม่พบว่ามันยากที่จะใช้เลย
DonBecker

2
ต้องใช้ SQL Server Agent ที่ไม่ได้มาพร้อมกับ SQL Server Express
Vinicius Rocha

18

ฉันแนะนำให้คุณใช้mysqldumpดังนี้:

mysqldump --compatible=mssql

phpMyAdminยังคงเป็นเว็บแอปและอาจมีข้อ จำกัด บางประการสำหรับฐานข้อมูลขนาดใหญ่ (เวลาเรียกใช้งานสคริปต์หน่วยความจำที่จัดสรรได้และอื่น ๆ )


6
อนิจจาสิ่งนี้ทำให้ฉันมีปัญหาเกี่ยวกับการคำนวณทุกประเภท สคริปต์จะมี backticks รอบ ๆ ชื่อคอลัมน์ชนิดข้อมูลที่ไม่มีใน MSSQL จะละเมิดข้อ จำกัด max-1000-inserts, auto_increment keywords ฯลฯ เป็นต้นคำตอบนี้เป็นข้อเสนอแนะเชิงตรรกะ แต่ฉันเกรงว่าจะไม่ ทำงานได้ไม่ดีนัก (อย่างน้อยมันก็ไม่เหมาะสำหรับฉัน)
Jeroen

mysqldump --compatible = ansi "สร้างเอาต์พุตที่เข้ากันได้กับระบบฐานข้อมูลอื่น ๆ หรือกับเซิร์ฟเวอร์ MySQL รุ่นเก่าค่าเดียวที่อนุญาตสำหรับตัวเลือกนี้คือ ansi ซึ่งมีความหมายเดียวกับตัวเลือกที่สอดคล้องกันสำหรับการตั้งค่าโหมด SQL ของเซิร์ฟเวอร์"
Thomas Taylor

14

ฉันพบวิธีนี้ในเน็ต

ต้องการงานเล็กน้อยเพราะต้องทำทีละโต๊ะ แต่อย่างไรก็ตามฉันสามารถคัดลอกตารางข้อมูลและข้อ จำกัด ลงในฐานข้อมูล MS SQL ได้

นี่คือลิงค์

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


1
นั่นคือเมื่อทั้ง Mysql และ SQL อยู่ในเครื่องเดียวหรือเชื่อมต่อผ่านเครือข่าย สิ่งนี้ไม่มีประโยชน์เมื่อมีเครื่องสองเครื่องที่แตกต่างกันและคุณมีไฟล์ Dump จาก mysql ขวา?
Espanta

7

หากคุณทำการส่งออกด้วยPhpMyAdminคุณสามารถเปลี่ยนโหมดความเข้ากันได้ของ sql เป็น 'MSSQL' ด้วยวิธีนี้คุณเพียงแค่เรียกใช้สคริปต์ที่ส่งออกกับฐานข้อมูล MS SQL ของคุณและคุณทำเสร็จแล้ว

หากคุณไม่สามารถหรือไม่ต้องการใช้ PhpMyAdmin ก็ยังมีตัวเลือกความเข้ากันได้ในmysqldumpแต่โดยส่วนตัวแล้วฉันอยากให้ PhpMyAdmin ทำเพื่อฉัน


1
คำตอบนี้ใช้ได้ผลสำหรับฉันโดยมีการปรับเปลี่ยนสคริปต์ที่สร้างขึ้นเพียงเล็กน้อย เอามาลง SQL Server 2012 ไม่เห็นโหมดความเข้ากันได้มาก่อน
Kiel

7

นี่คือแนวทางของฉันในการนำเข้าไฟล์. sql ไปยัง MS SQL:

  1. ส่งออกตารางจาก MySQL ด้วย--compatible=mssqlและ--extended-insert=FALSEตัวเลือก:

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

  2. แยกไฟล์ที่ส่งออกด้วย PowerShell 300000 บรรทัดต่อไฟล์:

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

  3. เรียกใช้แต่ละไฟล์ใน MS SQL Server Management Studio

มีเคล็ดลับในการเพิ่มความเร็วเม็ดมี

วิธีการอื่น ๆ คือการใช้ mysqldump–whereตัวเลือก เมื่อใช้ตัวเลือกนี้คุณสามารถแบ่งตารางของคุณตามเงื่อนไขใด ๆ ที่รองรับโดยwhereอนุประโยค sql


เราจะส่งออกฐานข้อมูลทั้งหมดแทนตารางต่อตารางได้อย่างไร
MonsterMMORPG

ลองใช้--databases [db_name]คีย์เวิร์ดตามที่อธิบายไว้ในคำตอบนี้: stackoverflow.com/a/26096339/155687
Vladislav

4

วันนี้ฉันมีปัญหาที่คล้ายกันมาก - ฉันต้องการคัดลอกตารางขนาดใหญ่ (5 ล้านแถว) จาก MySql ไปยัง MS SQL

นี่คือขั้นตอนที่ฉันทำ (ภายใต้ Ubuntu Linux):

  1. สร้างตารางใน MS SQL ซึ่งโครงสร้างตรงกับตารางต้นทางใน MySql

  2. ติดตั้งบรรทัดคำสั่ง MS SQL: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. ทิ้งตารางจาก MySql ไปยังไฟล์:

mysqldump \
    - คอมแพ็ค \
    - แทรกสมบูรณ์ \
    - ไม่มีการสร้างข้อมูล \
    - เข้ากันได้ = mssql \
    - ขยายแทรก = FALSE \
    - โฮสต์ "$ MYSQL_HOST" \
    - ผู้ใช้ "$ MYSQL_USER" \
    -p "$ MYSQL_PASS" \
    "$ MYSQL_DB" \
    "$ TABLE"> "$ FILENAME"
  1. ในกรณีของฉันไฟล์ดัมพ์มีขนาดค่อนข้างใหญ่ดังนั้นฉันจึงตัดสินใจแบ่งเป็นชิ้นเล็ก ๆ จำนวนหนึ่ง (1,000 บรรทัดต่อ) - split --lines=1000 "$FILENAME" part-

  2. ในที่สุดฉันก็วนซ้ำไฟล์ขนาดเล็กเหล่านี้ทำการแทนที่ข้อความและดำเนินการทีละชิ้นกับเซิร์ฟเวอร์ MS SQL:

ส่งออก SQLCMD = / opt / mssql-tools / bin / sqlcmd

x = 0

สำหรับไฟล์ในส่วน - *
ทำ
  echo "การส่งออกไฟล์ [$ file] ไปยัง MS SQL ประมวลผลแล้ว $ x พัน"

  # แทนที่ \ 'ด้วย' '
  sed -i "s / \\\ '/' '/ g" "$ ไฟล์"

  # ลบทั้งหมด "
  sed -i 's / "// g'" $ file "

  # อนุญาตให้แทรกบันทึกด้วย PK (id) ที่ระบุ
  sed -i "1s / ^ / SET IDENTITY_INSERT $ TABLE ON; \ n /" "$ file"

  "$ SQLCMD" -S "$ AZURE_SERVER" -d "$ AZURE_DB" -U "$ AZURE_USER" -P "$ AZURE_PASS" -i "$ file"
  เสียงสะท้อน ""
  เสียงสะท้อน ""

  x = $ ((x + 1))
เสร็จแล้ว

ก้อง "เสร็จสิ้น"

แน่นอนคุณจะต้องแทนที่ตัวแปรของฉันเหมือน$AZURE_SERVER, $TABLEฯลฯ กับคุณ

หวังว่าจะช่วยได้


3

สำหรับฉันการส่งออกข้อมูลทั้งหมดด้วยคำสั่งนี้ทำได้ดีที่สุด:

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

--extended-insert = FALSE จำเป็นเพื่อหลีกเลี่ยงขีด จำกัด การนำเข้า mssql 1,000 แถว

ฉันสร้างตารางด้วยเครื่องมือการย้ายข้อมูลดังนั้นฉันไม่แน่ใจว่า CREATE จากไฟล์ backup.sql จะทำงานได้หรือไม่

ใน SSMS ของ MSSQL ฉันต้องนำเข้าตารางข้อมูลตามตารางโดยมี IDENTITY_INSERT ON เพื่อเขียนฟิลด์ 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 

หากคุณมีความสัมพันธ์คุณต้องนำเข้าลูกก่อนและกว่าตารางที่มีคีย์ต่างประเทศ



0

วิ่ง:

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

คุณต้องการดูแถบกระบวนการหรือไม่?

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

0

คุณสามารถใช้แอพพลิเคชั่น sqlie สำหรับการแปลงจาก mysql เป็น sqlserver คุณสามารถดูวิดีโอนี้ได้ https://www.youtube.com/watch?v=iTVEqys_vTQ&t=108s


1
ยินดีต้อนรับสู่ Stackoverflow @gorgino! หากคุณโพสต์ลิงก์โปรดโพสต์สรุปเนื้อหาสั้น ๆ ด้วยเผื่อว่าลิงก์จะไม่สามารถใช้งานได้ในอนาคต การเชื่อมโยงควรใช้เพื่อขยายคำตอบของคุณเป็นหลักไม่ใช่คำตอบของคุณ
Cribber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.