SQL Server 2012 เข้ากันได้แบบย้อนหลังสำหรับการสำรองข้อมูลกับ 2008


14

ฉันมีลูกค้าจำนวนมากที่มี SQL Server 2008 และนั่นคือสิ่งที่ฉันมีที่นี่บนเซิร์ฟเวอร์ของฉันด้วย ฉันใช้ไฟล์สำรองเพื่อส่งฐานข้อมูลไปมาระหว่างลูกค้าและที่สำนักงานของฉัน

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

ฉันต้องการส่งฐานข้อมูลไปยังลูกค้ารวมทั้งรับฐานข้อมูลจากลูกค้า นี่เป็นการอัปเกรดเวอร์ชันแรกของฉันบน SQL Server ดังนั้นฉันใหม่กับปัญหานี้ มีความคิดเห็นเกี่ยวกับวิธีการดำเนินการอย่างไร


4
คุณสามารถมีอินสแตนซ์หนึ่งของ SQL Server 2008 และ SQL Server 2012 อินสแตนซ์หนึ่งที่ติดตั้งที่เซิร์ฟเวอร์ของคุณในเวลาเดียวกันด้วยชื่ออินสแตนซ์ที่แตกต่างกัน บางทีนั่นอาจช่วยแก้ปัญหาของคุณกับลูกค้าในเวอร์ชันที่ต่างกันได้หรือไม่
Mikael Eriksson

คำถามที่คล้ายกันเกี่ยวกับ SO: stackoverflow.com/q/1744808/95710
DForck42

คำตอบ:


16

มีสองสิ่งที่เกี่ยวข้องที่นี่: หมายเลขเวอร์ชันของไฟล์และระดับความเข้ากันได้ เมื่อคุณแนบฐานข้อมูลไปยังเวอร์ชันหลักที่ใหม่กว่า (เช่นจาก 2008 ถึง 2008R2 หรือ 2008R2 ถึง 2012) เวอร์ชันฐานข้อมูลจะถูกเปลี่ยนอย่างถาวรและคุณไม่สามารถแนบฐานข้อมูลนั้นกับเวอร์ชันที่เก่ากว่าได้อีก

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

หากต้องการมอบฐานข้อมูลให้กับบุคคลอื่นบน SQL Server เวอร์ชันเก่าคุณจะต้องส่งออกข้อมูลและนำเข้าฐานข้อมูลอื่น เครื่องมือเช่นการเปรียบเทียบข้อมูลของ Red Gate มีประโยชน์สำหรับสิ่งนี้


ใช่ฉันเคยมีปัญหาเดียวกันนี้มาก่อน จบการสร้างสคริปต์ออกจากฐานข้อมูลทั้งหมดแล้วทำการสคริปต์ข้อมูลทั้งหมด การเปรียบเทียบ SQL ของ Red Gate และการเปรียบเทียบข้อมูลมาช่วยในวันนั้น
DForck42

@ DForck42: bcpในกรณีของฐานข้อมูลมีขนาดใหญ่เกินไปที่จะออกมาพร้อมกับสคริปต์ข้อมูลดังนั้นผมจึงจบลงด้วยการเขียนสคริปต์ออกสคีมาแล้วย้ายข้อมูลด้วย
ivan_pozdeev

@ivan_pozdeev คุณพูดว่าคุณส่งออกโดยใช้ SQL Server 2012 BCP และนำเข้าโดยใช้ SQL Server 2008R2 BCP หรือไม่ ดีใจที่ได้ทราบว่ารูปแบบไฟล์เข้ากันได้ขอบคุณ
Chris

2
@ Chris msdn.microsoft.com/en-us/library/ms162802.aspx "ใน SQL Server 2014 ยูทิลิตี้ BCP สนับสนุนข้อมูลพื้นเมืองไฟล์เข้ากันได้กับ SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2008 R2 และ SQL Server 2012 "
ivan_pozdeev

ขอบคุณ @ivan_posdeev นี่เป็นการเปิดเผย ฉันได้บันทึกขั้นตอนของฉันไว้ด้านล่างเพื่อช่วยคนอื่น
Chris

6

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

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


3

สำหรับการโยกย้าย SQL ให้ใช้ตัวช่วยสร้างการโยกย้ายฐานข้อมูล SQL แบบโอเพนซอร์สและฟรี

ฉันมีฐานข้อมูล 5GB ที่มีเร็กคอร์ดสองถึง 10 ล้านรายการแล้วลองใช้เส้นทางผ่าน Generate Script และวิ่งกว่าด้วย sqlcmd.exe ก่อนอื่นสคริปต์ที่สร้างขึ้นนั้นทำงานได้ไม่ถูกต้องเสมอไป ประการที่สอง sqlcmd.exe สามารถล้มเหลวในไฟล์ขนาดใหญ่เกินไปบ่นเกี่ยวกับหน่วยความจำที่มีอยู่ osql.exe ใช้งานได้ แต่ใช้เวลานาน (และมีอาร์กิวเมนต์บรรทัดคำสั่งเดียวกัน)

จากนั้นฉันเจอเครื่องมือที่ยอดเยี่ยมสำหรับการโอนย้ายเซิร์ฟเวอร์ SQL ไปยังฐานข้อมูล SQL Azure สิ่งนี้ใช้ได้สำหรับ SQL Server ไปยัง SQL Server เช่นกันหากคุณต้องการย้ายฐานข้อมูล SQL 2012 ไปยัง 2008 R2 มันใช้ bcp.exe ซึ่งใช้สำเนาจำนวนมาก มีเวอร์ชัน GUI และ command-line (Batch) และเป็นโอเพ่นซอร์ส ดูhttp://sqlazuremw.codeplex.com/ ในกรณีของฉันการผ่าตัดใช้เวลา 16 นาที

ในหน้าจอขั้นสูงคุณสามารถเลือกว่าเป้าหมายของคุณคือ SQL Server ไม่ใช่ SQL Azure


2

ฉันพบว่า BCP มีประสิทธิภาพมากกว่าเครื่องมือบางอย่างสำหรับรับข้อมูลลงใน SQL Server รุ่นก่อนหน้านี้และเพื่อดึงข้อมูลจาก RDS (ขอบคุณ @ivan_posdeev)

ฉันแรกสร้าง schema โดยคลิกขวาบนฐานข้อมูลใน SQL Server Management Studio, Tasks, Generate script ทำเครื่องหมายวัตถุทั้งหมดในวัตถุขั้นสูงเพื่อให้มั่นใจว่าทุกสิ่งที่คุณต้องการจะเป็นสคริปต์ (สถิติดัชนี ฯลฯ ) ให้ยกเลิกการเลือก "ฐานข้อมูล USE" หากฐานข้อมูลปลายทางของคุณมีชื่อแตกต่างกันตั้งค่าความเข้ากันได้กับรุ่นฐานข้อมูลปลายทางของคุณ ไฟล์ที่สร้างสคีมาของคุณ สร้างฐานข้อมูลบนปลายทางของคุณและเรียกใช้ไฟล์นี้กับมัน (ใช้osql, sqlcmdหรือกุย)

หากต้องการย้ายข้อมูลให้รันเคียวรีต่อไปนี้สองครั้งบนฐานข้อมูลต้นทางก่อนแสดงความคิดเห็นคอลัมน์ที่สองเพื่อสร้างไฟล์แบตช์เพื่อดึงข้อมูลจากนั้นให้ข้อคิดเห็นคอลัมน์แรกเพื่อสร้างไฟล์แบตช์นำเข้าเพื่อทำงานบนปลายทางของคุณ (คุณต้องเพิ่มเซิร์ฟเวอร์ต้นทางและปลายทางของคุณชื่ออินสแตนซ์ไดเรกทอรีส่งออกและอินพุตไฟล์ไดเรกทอรีชื่อผู้ใช้และรหัสผ่านหากต้องการใช้การรักษาความปลอดภัยแบบรวมให้แทนที่-Uและ-Pตัวเลือกด้วยเพียง-T)

สนับสนุน Unicode นี้ถ้าคุณไม่จำเป็นต้องเปลี่ยนสวิทช์ในงบทั้งสอง-N-n

SELECT 
   'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME  + ' out d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
--    'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME  + ' in d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME  + '.ERRORS.dat'
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY 
    s.Name, t.NAME

หลังจากรันไฟล์ตรวจสอบชื่อ schema.tablename.ERRORS.dat - จะรวมแถวใด ๆ ที่ล้มเหลวให้ว่างถ้าไม่มี

การอ้างอิง MSDN สำหรับ BCP ที่นี่เป็นมิตรกับการเดินผ่านตัวเลือก BCP ที่นี่มากขึ้น

ฉันพบสิ่งนี้ดีกว่าการสร้างสคริปต์และเครื่องมือใด ๆ ที่ฉันได้ลอง นอกจากนี้ยังทำงานบนฐานข้อมูล RDS (ซึ่งไม่อนุญาตให้มีการสำรองข้อมูล) ไฟล์ข้อมูลที่สร้างขึ้นมีขนาด 30% ของสคริปต์ SQL การเรียกใช้จะใช้เวลาเพียงเล็กน้อยและมีความน่าเชื่อถือมากกว่า (สคริปต์ที่สร้างขึ้นโดย SQL Server สำหรับข้อมูลสคริปต์จะเพิ่มขึ้นเสมอบางครั้งคาดเดาได้ว่าบางครั้งไม่ได้ SQL ที่สร้างขึ้นไม่เข้ากันกับ 2008R2 (เช่นใช้nvarchar(0)บ่อยครั้งไม่สมบูรณ์เพราะไม่มีเหตุผลที่สังเกตได้ ฯลฯ ) BCP ก็ทำซ้ำการละเมิดข้อ จำกัด เช่นกัน เช่น Referential Integrity)

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