การสำรองข้อมูลฐานข้อมูล SQL Server คืนค่าในรุ่นที่ต่ำกว่า


185

วิธีการคืนค่าแฟ้มสำรองฐานข้อมูล SQL Server รุ่นที่สูงกว่าไปยัง SQL Server รุ่นที่ต่ำกว่าได้อย่างไร

ใช้ SQL Server 2008 R2 (10.50.1600)ฉันทำแฟ้มสำรองข้อมูลและตอนนี้ฉันต้องการที่จะเรียกคืนได้บนเซิร์ฟเวอร์อยู่ของฉันของ SQL Server 2008 (10.00.1600)

เมื่อฉันพยายามคืนค่าการสำรองข้อมูลไปยัง SQL Server 2008 จะทำให้เกิดข้อผิดพลาดเช่นRestore Failedเนื่องจาก:

ฐานข้อมูลถูกสำรองบนเซิร์ฟเวอร์ที่รันเวอร์ชัน 10.50.1600 รุ่นนั้นเข้ากันไม่ได้กับเซิร์ฟเวอร์นี้ซึ่งใช้รุ่น 10.00.1600

ฉันจะคืนค่าไฟล์สำรองข้อมูลบนเซิร์ฟเวอร์นี้ได้อย่างไร


2
คุณไม่สามารถทำสิ่งนี้ - มันเป็นไปไม่ได้ SQL Server ไม่อนุญาตให้มี * การลดระดับ "ฐานข้อมูลจากรุ่นที่สูงกว่าไปเป็นระดับที่ต่ำกว่า"
marc_s

18
Microsoft รู้ทุกอย่างเกี่ยวกับเซิร์ฟเวอร์ SQL (ตั้งแต่สร้างขึ้น) และการย้ายข้อมูลระหว่าง 2 เวอร์ชันนั้นเป็นไปไม่ได้ ฉันไม่เข้าใจว่าทำไมโหมดความเข้ากันได้บางประเภทไม่สามารถใช้งานได้ในการส่งออก มันยากเหลือเกิน
dvdmn

1
@dvdmn ยากพอ ๆ กับ Top Gear ตอนที่พวกเขาพูดว่า - ประเภทต่าง ๆ , ข้อความที่ต่างกัน, รูปแบบบล็อกที่แตกต่างกัน การย้ายข้อมูลระหว่างฐานข้อมูลนั้นง่ายมากไม่ว่าจะเกี่ยวข้องกับรุ่นใด ปรับลดก็คือไม่ได้
Panagiotis Kanavos

2
@PanagiotisKanavos ฉันไม่เห็นด้วยใน mysql คุณสามารถส่งออก db เป็นคำสั่ง sql และคุณสามารถเรียกคืนได้ใน mysql ทุกรุ่น (down หรือ up) ใช่คุณสามารถส่งออก sql db เป็นสคริปต์ด้วยเช่นกัน แต่การเรียกคืนมันไม่ง่ายถ้าคุณมีฟังก์ชั่น / ขั้นตอนการจัดเก็บที่ขึ้นอยู่กับแต่ละอื่น ๆ โดยทั่วไปไม่มีประโยชน์ / วิธีแก้ปัญหา
dvdmn

3
@dvdmn ส่งออกสคริปต์ของฐานข้อมูลเป็นอย่างสมบูรณ์แตกต่างจากการสำรองข้อมูล ฉันรู้ว่าผลิตภัณฑ์บางตัวไม่มีฟังก์ชั่นการสำรอง / กู้คืนหรือแย่กว่านั้นทำให้ทั้งสองอย่างยุ่งเหยิง สิ่งนี้มักจะเกิดขึ้นเนื่องจากเหตุผลในอดีต: ไม่มีการสำรองข้อมูลในอดีตผลิตภัณฑ์บางอย่างที่เรียกว่าการส่งออก / การเขียนสคริปต์ด้วยชื่อนั้น ตอนนี้พวกเขาทำแล้วพวกเขาต้องแก้ไขข้อขัดแย้งด้วยการพูดคุยเกี่ยวกับการสำรองข้อมูลทางกายภาพและตรรกะจากนั้นก็
สับสน

คำตอบ:


78

ไม่ไม่สามารถปรับลดรุ่นฐานข้อมูลได้ 10.50.1600 เป็น SQL Server 2008 R2รุ่น ไม่มีวิธีใดที่คุณสามารถกู้คืนหรือเชื่อมต่อฐานข้อมูลนี้กับอินสแตนซ์ของ SQL Server 2008 ที่คุณกำลังพยายามกู้คืน (10.00.1600 คือ SQL Server 2008) ทางเลือกเดียวของคุณคือ:

  • อัปเกรดอินสแตนซ์นี้เป็น SQL Server 2008 R2 หรือ
  • คืนค่าการสำรองข้อมูลที่คุณมีในอินสแตนซ์ SQL Server 2008 R2 ส่งออกข้อมูลทั้งหมดและนำเข้าในฐานข้อมูล SQL Server 2008

ฉันไม่สามารถอัปเกรดไคลเอ็นต์เซิร์ฟเวอร์ที่ใช้งานได้เนื่องจากข้อ จำกัด สิทธิ์ และฐานข้อมูลของฉันมีขนาดเกิน 2.5GB ดังนั้นฉันจึงไม่สามารถสร้างสคริปต์ข้อมูลได้เนื่องจากข้อผิดพลาดข้อยกเว้นหน่วยความจำ

9
@Gaurav อย่าเขียนสคริปต์ข้อมูล - แต่ให้ลบสคริปต์ฐานข้อมูลทั้งหมด (ตาราง procs ทริกเกอร์ข้อ จำกัด ฯลฯ ) โดยไม่มีข้อมูลสร้างฐานข้อมูลใหม่จากนั้นคลิกขวาที่ฐานข้อมูลต้นทางไปที่ "เครื่องมือ" จากนั้น "ส่งออกข้อมูล" เพื่อถ่ายโอนเนื้อหาของตารางไปยังฐานข้อมูลของคุณ
Jim McLeod

17
ฉันสงสัยคำตอบของ pat อย่างมาก "ไม่มีทางเป็นไปได้" - นั่นหมายความว่าคุณยังไม่พบวิธี อาจมีหลายสาเหตุที่คุณต้องการทำสิ่งนี้ดังนั้นจึงไม่ใช่คำตอบที่เป็นประโยชน์
Jay Imerman

6
ฉันไม่เห็นด้วย @Jay บางครั้งคำว่า "คุณทำไม่ได้" เป็นคำตอบที่สมบูรณ์แม้ว่าจะมีประโยชน์มากกว่าที่จะเสนอวิธีแก้ปัญหาหากมี
รัสเซลฟ็อกซ์

1
@ จางถ้าคุณมีคำถามให้ถามพวกเขาเป็นคำถามไม่ใช่ความคิดเห็น
Remus Rusanu

83

คุณสามารถใช้ฟังก์ชันที่เรียกว่าแอปพลิเคชันส่งออกข้อมูลระดับซึ่งสร้าง.bacpacไฟล์ที่ประกอบด้วยสกีมาฐานข้อมูลและข้อมูล

บนเซิร์ฟเวอร์ปลายทางคุณสามารถใช้ตัวเลือกนำเข้าข้อมูลระดับแอปพลิเคชันซึ่งสร้างและเติมฐานข้อมูลใหม่จาก.bacpacไฟล์ที่สร้างไว้ล่วงหน้า

หากคุณต้องการเพียงแค่ถ่ายโอนสกีมาฐานข้อมูลคุณสามารถใช้Extract Data-Tier Applicationสำหรับการสร้างไฟล์และDeploy Data-Tier Applicationสำหรับการปรับใช้สกีมาฐานข้อมูลที่สร้างขึ้น

ฉันได้ลองกระบวนการนี้กับ SQL Server รุ่นต่างๆตั้งแต่ SQL 2014 ถึง SQL 2012 และจาก SQL 2014 ถึง SQL 2008R2 และทำงานได้ดี


8
นี่คือคำตอบที่สมควรได้รับความสนใจมากขึ้น มันใช้งานได้จริงในกรณีส่วนใหญ่ หากคุณมีผู้ใช้ SQL ที่มี orphaned อยู่การดำเนินการส่งออกจะล้มเหลว คุณสามารถลบ / เพิ่มบิตเหล่านั้นด้วยตนเองเพื่อมิให้ชนะรุ่น SQL ได้
Doctor Blue

3
ฉันเพิ่งลองทำเช่นนี้เพื่อสร้างฐานข้อมูลที่สร้างขึ้นบน MSSQLEX2014 (V12) บน MSSQLEX2012 ของฉัน (V11) ฉันเพิ่งได้รับข้อผิดพลาด "Microsoft.Data.Tools.Schema.Sql.Sql120DatabaseSchemaProvider ไม่ถูกต้อง" โดยไม่มีวิธีการเปลี่ยน
Craig

5
การนำเข้าจาก SQL Server 2014 ถึง 2012 โดยใช้. bakpac DOES ทำงานได้ แต่ต้องใช้ SSMS รุ่นที่ถูกต้อง ตัวอย่างเช่นฉันใช้ SSMS 2016 CTP3 และใช้งานได้อย่างไม่มีที่ติ มันไม่ทำงานสำหรับฉันที่ใช้ SSMS 2012 ฉันยังไม่ได้ทดสอบ SSMS 2014
Greg Gum

1
ทุกคนรู้ว่าสามารถสคริปต์ขั้นตอนนี้ใน T-SQL? อัปเดต (ตอบตัวเองหลังจากเล่น Google เล็กน้อย): คุณสามารถทำสิ่งนี้โดยอัตโนมัติผ่านทางsqlpackage.exeบรรทัดคำสั่ง Google มากขึ้น
Alex

1
นี่เป็นทางออกเดียวที่ทำงานสำหรับฉันสำหรับการลดระดับ SQL2017 ถึง SQL2016 ค่อนข้างใหญ่ / ซับซ้อน ประสิทธิภาพยังดีมาก
Keith Blows

35

จะไม่จำเป็นต้องทำงาน

จะทำงาน

  • สคริปต์รุ่น - งาน -> สร้างสคริป ให้แน่ใจว่าคุณตั้งค่าเป้าหมายที่ต้องการ SQL Server รุ่นในตั้งค่าตัวเลือกการเขียนสคริปต์ -> ขั้นสูงหน้า นอกจากนี้คุณยังสามารถเลือกได้ว่าจะคัดลอกสคีมาข้อมูลหรือทั้งสองอย่าง โปรดทราบว่าในสคริปต์ที่สร้างขึ้นคุณอาจต้องเปลี่ยนโฟลเดอร์ DATA สำหรับไฟล์ mdf / ldf หากย้ายจากที่ไม่ใช่ด่วนเป็นด่วนหรือกลับกัน

  • ฉันคิดว่าMicrosoft SQL Server Database Publishing Services - มาพร้อมกับ SQL Server 2005 ขึ้นไป ดาวน์โหลดรุ่นล่าสุดจากที่นี่ สิ่งที่จำเป็นต้องมี: sqlncli.msi/ sqlncli_x64.msi/ sqlncli_ia64.msi, SQLServer2005_XMO.msi/ SQLServer2005_XMO_x64.msi/ SQLServer2005_XMO_ia64.msi(ดาวน์โหลดที่นี่ )


7
การสร้างสคริปต์ไม่น่าเชื่อถือสำหรับฐานข้อมูลที่สำคัญหลีกเลี่ยงถ้าเป็นไปได้
Chris

ลิงก์ทั้งสองที่ด้านล่างคือ 404
Sнаđошƒаӽ

29

นี่คือ 2 เซ็นต์ของฉันในตัวเลือกที่แตกต่างกันสำหรับการทำสิ่งนี้:

เครื่องมือของบุคคลที่สาม : วิธีที่ง่ายที่สุดในการทำงานให้สำเร็จคือการสร้างฐานข้อมูลเปล่าในรุ่นที่ต่ำกว่าจากนั้นใช้เครื่องมือของบุคคลที่สามเพื่ออ่านข้อมูลสำรองและซิงโครไนซ์ฐานข้อมูลที่สร้างขึ้นใหม่ด้วยการสำรองข้อมูล

Red Gate เป็นหนึ่งในความนิยมมากที่สุด แต่ก็มีอีกหลายอย่างเช่นApexSQL Diff , ApexSQL Data Diff , SQL ที่เชี่ยวชาญ , Idera ... ทั้งหมดนี้เป็นเครื่องมือระดับพรีเมียม แต่คุณสามารถทำงานให้สำเร็จในโหมดทดลอง;)

การสร้างสคริปต์ : ตามที่คนอื่นพูดถึงแล้วคุณสามารถสร้างโครงสร้างสคริปต์และข้อมูลโดยใช้ SSMS ได้เสมอ แต่คุณต้องคำนึงถึงลำดับการดำเนินการ โดยค่าเริ่มต้นวัตถุสคริปต์จะไม่สั่งอย่างถูกต้องและคุณจะต้องดูแลการอ้างอิง นี่อาจเป็นปัญหาหากฐานข้อมูลมีขนาดใหญ่และมีวัตถุจำนวนมาก

ตัวช่วยสร้างการนำเข้าและส่งออก : นี่ไม่ใช่โซลูชันที่สมบูรณ์แบบเนื่องจากจะไม่กู้คืนวัตถุทั้งหมด แต่มีเพียงตารางข้อมูล แต่คุณสามารถพิจารณาได้เพื่อการแก้ไขที่รวดเร็วและสกปรกเมื่อจำเป็น


1
Red Gate Sql Clone ไม่สนับสนุนการโคลนระหว่างเซิร์ฟเวอร์ SQL รุ่นต่าง ๆ รายงานข้อผิดพลาดเดียวกันที่ฉันได้รับเมื่อพยายามทำด้วยตนเอง
DarkDeny

29

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

ป้อนคำอธิบายรูปภาพที่นี่

เลือก"สคีมาและข้อมูล" - หากคุณต้องการนำทั้งสองอย่างไปไว้ในไฟล์สคริปต์สำรอง
ให้เลือกสคีมาเท่านั้น - หากจำเป็นต้องใช้สคีมาเท่านั้น

ป้อนคำอธิบายรูปภาพที่นี่

ใช่ตอนนี้คุณได้สร้างสคริปต์ด้วยสคีมาและข้อมูลของฐานข้อมูลแล้ว


16

อีกวิธีในการทำเช่นนี้คือการใช้คุณสมบัติ "คัดลอกฐานข้อมูล":

ค้นหาโดยคลิกขวาที่ฐานข้อมูลต้นทาง> "Tasks"> "คัดลอกฐานข้อมูล"

คุณสามารถคัดลอกฐานข้อมูลไปยัง SQL Server Instance รุ่นที่ต่ำกว่า สิ่งนี้ใช้ได้กับฉันจาก SQL Server 2008 R2 (SP1) - 10.50.2789.0 ถึง Microsoft SQL Server 2008 (SP2) - 10.0.3798.0


3
โปรดทราบว่าสิ่งนี้จะไม่ทำงานหากเป้าหมายคือ SQL server express "เซิร์ฟเวอร์ปลายทางไม่สามารถเป็น SQL Server 2005 หรืออินสแตนซ์ Express ที่ใหม่กว่า" social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/…
Ohad Schneider

2
ไม่สามารถคัดลอกฐานข้อมูลจาก SQL Server 2012 ไปยัง SQL Server 2008 ด้วยวิธีนี้
Twinkles

1
คัดลอกฐานข้อมูลเป็นการดำเนินการแยก / แนบ
Panagiotis Kanavos

1
ขอบคุณสำหรับคำแนะนำนี้! นั่นช่วยฉันได้มาก ฉันคัดลอกข้อมูลจาก SQL 2008 R2 ไปยัง SQL 2008
dns_nx

8

คุณสามารถลองสิ่งนี้

  1. สร้างฐานข้อมูลไปยัง SQL Server 2008
  2. การใช้คุณสมบัตินำเข้าข้อมูลนำเข้าข้อมูลจาก SQL Server R2 (หรือรุ่นที่สูงกว่า)
  3. ใช้ "RedGate SQLCompare" เพื่อซิงโครไนซ์สคริปต์

6

ไปที่งาน - > สร้างสคริปต์ ...

ในขั้นสูงใน"ประเภทข้อมูลสำหรับสคริปต์"เลือก"Schema and data"แล้วลองเรียกใช้สคริปต์นี้ในเวอร์ชันที่ต่ำกว่าของคุณ


5
นี่เป็นวิธีที่ดีมาก แต่ทำงานได้ไม่ดีกับฐานข้อมูลขนาดใหญ่
veljasije

5

มันไม่สวย แต่นี่เป็นวิธีที่ฉันทำคุณได้รับตัวเลือกนี้ติดตั้งในการติดตั้ง SQL 2008 R2 ของคุณ

1) ฐานข้อมูลคลิกขวาใน SQL Server 2008 R2 "งาน" .. "สร้างสคริปต์" ในตัวช่วยสร้างเลือกฐานข้อมูลและวัตถุทั้งหมดในขั้นตอนแรก ในขั้นตอน "ตั้งค่าตัวเลือกการสคริปต์" คุณควรเห็นปุ่ม "ขั้นสูง" เลือกตัวเลือกนี้และตรวจสอบให้แน่ใจว่าคุณเลือก "สคริปต์สำหรับรุ่นเซิร์ฟเวอร์" = SQL Server 2008 "ไม่ใช่รุ่น R2 นี่เป็นขั้นตอนสำคัญเพราะ" นำเข้าข้อมูล " โดยตัวมันเองไม่ได้นำคีย์หลักทั้งหมด, ค่าคงที่และวัตถุอื่น ๆ เช่นขั้นตอนการจัดเก็บไว้ "

2) เรียกใช้สคริปต์ SQL ที่สร้างขึ้นบนอินสแตนซ์ติดตั้งหรือฐานข้อมูลใหม่ SQL Express หรือ SQL Server 2008 โดยใช้หน้าต่างคิวรีหรือเปิดสคริปต์. sql ที่บันทึกไว้และดำเนินการและคุณควรเห็นฐานข้อมูลใหม่

3) คลิกขวาที่ฐานข้อมูลใหม่แล้วเลือก "Tasks" .. "Import Data .. " เลือกแหล่งข้อมูลเป็นฐานข้อมูล R2 และปลายทางเป็นฐานข้อมูลใหม่ "คัดลอกข้อมูลจากหนึ่งหรือหลายตารางหรือมุมมอง" เลือกช่องทำเครื่องหมายด้านบนเพื่อเลือกตารางทั้งหมดจากนั้นขั้นตอนถัดไปเรียกใช้แพคเกจและคุณควรมีทุกอย่างในรุ่นที่เก่ากว่า สิ่งนี้ควรใช้สำหรับการกลับไปใช้รุ่น 2005 เช่นกัน หวังว่านี่จะช่วยให้ใครบางคนออกมา


สวัสดี @ motogeek ฉันมีปัญหาเดียวกัน แต่ฉันมี R2 บนเซิร์ฟเวอร์การผลิตและ 2008 ในท้องถิ่นในกรณีนี้ฉันไม่สามารถใช้ข้อมูลการนำเข้าและส่งออก อะไรจะเป็นทางออกที่ดีสำหรับสิ่งนี้
Abbas

2

คุณสามารถใช้ BCP เข้าและออกสำหรับตารางเล็ก ๆ

คำสั่ง BCP OUT: -

BCP "SELECT *  FROM [Dinesh].[dbo].[Invoices]" QUERYOUT C:\av\Invoices1.txt -S MC0XENTC -T -c -r c:\error.csv

คำสั่ง BCP IN: - สร้างโครงสร้างตารางสำหรับ Invoicescopy1

BCP [Dinesh].[dbo].[Invoicescopy1] IN C:\av\Invoices.txt -S MC0XENTC -T -c

0

ฉันซาบซึ้งนี่เป็นโพสต์เก่า แต่อาจเป็นประโยชน์สำหรับผู้ที่จะรู้ว่า Azure Migration Wizard (มีอยู่ใน Codeplex - ไม่สามารถเชื่อมโยงไปเป็นได้เพราะ Codeplex เป็นตอนที่ฉันพิมพ์นี้) จะทำได้อย่างง่ายดาย


เครื่องมือนั้นถูกแทนที่ด้วย SQL Server Data Migration Assistant ดู: stackoverflow.com/questions/46517060/…
ahwm

0

คุณต้องใช้ตัวช่วยสร้างการนำเข้า / ส่งออกใน SSMS เพื่อย้ายข้อมูลทุกอย่าง

ไม่มี "ลดระดับ" ที่เป็นไปได้โดยใช้การสำรองข้อมูล / เรียกคืนหรือถอด / แนบ ดังนั้นสิ่งที่คุณต้องทำคือ:

  1. สำรองฐานข้อมูลจากเซิร์ฟเวอร์ที่รัน SSMS / SQL เวอร์ชันใหม่
  2. นำเข้าข้อมูลจากไฟล์. bak ที่สร้างขึ้นโดยขยายเมนู "งาน" (หลังจากคลิกขวาที่ฐานข้อมูลเป้าหมาย) แล้วเลือกตัวเลือก "นำเข้าข้อมูล"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.