คืนค่าการสำรองข้อมูล SQL Server 2012 ไปยังฐานข้อมูล SQL Server 2008 หรือไม่


41

มีวิธีการคืนค่าการสำรองฐานข้อมูล SQL Server 2012 เป็น SQL Server 2008 หรือไม่

ฉันพยายามแนบไฟล์แล้วมันไม่ทำงาน


ชำระเงินการอ้างอิงเหล่านี้จะช่วยคุณได้: msdn.microsoft.com/en-us/library/ms140052.aspx dba.stackexchange.com/questions/5511/ขอขอบคุณ

มีคำถามอื่นที่เท่ากับคำถามนี้และตอบได้ดีมาก: superuser.com/questions/468578//
Cavaleiro

1
มีคำตอบที่ยอดเยี่ยมสำหรับปัญหานี้ที่นี่ (การย้ายข้อมูลไม่ใช่การสำรอง / เรียกคืน): stackoverflow.com/questions/19837886//
Don Jewett

คำตอบ:


30

คุณมีสองทางเลือก:

ตัวเลือก A : ฐานข้อมูล Script out ในโหมดความเข้ากันได้โดยใช้ตัวเลือก Generate script:

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

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

ตัวเลือก B:

สคริปต์ออกตารางแรกก่อนด้วยดัชนีทั้งหมด, FK, ฯลฯ และสร้างตารางเปล่าในฐานข้อมูลปลายทาง - ตัวเลือกที่มี SCHEMA เท่านั้น (ไม่มีข้อมูล)

ใช้ BCP เพื่อแทรกข้อมูล

  1. bcp out ข้อมูลโดยใช้สคริปต์ด้านล่าง ตั้งค่า SSMS ใน Text Mode และคัดลอกผลลัพธ์ที่สร้างโดยสคริปต์ด้านล่างในไฟล์ bat

    -- save below output in a bat file by executing below in SSMS in TEXT mode
    
    -- clean up: create a bat file with this command --> del D:\BCP\*.dat 
    
    select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
        +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
    from sys.tables
    where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
    /*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
    order by schema_name(schema_id)
    
  2. เรียกใช้ไฟล์ bat ที่จะสร้างไฟล์. dat ในโฟลเดอร์ที่คุณระบุ

  3. รันสคริปต์ด้านล่างบนเซิร์ฟเวอร์ปลายทางด้วย SSMS ในโหมดข้อความอีกครั้ง

    --- Execute this on the destination server.database from SSMS.
    
    --- Make sure the change the @Destdbname and the bcp out path as per your environment.
    
    declare @Destdbname sysname
    set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
    select 'BULK INSERT ' 
    /*Remember Tables must be present on destination database */ 
    + QUOTENAME(@Destdbname) + '.' 
    + QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
    + '.' + QUOTENAME(name) 
    + ' from ''D:\BCP\' /* Change here for bcp out path */ 
    + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
    + '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
    + char(10) 
    + 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
    + char(10) + 'go'
       from sys.tables
       where is_ms_shipped = 0
    and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
    and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
        order by schema_name(schema_id) 
    
  4. รันเอาต์พุตโดยใช้ SSMS เพื่อแทรกข้อมูลกลับเข้าไปในตาราง

นี่เป็นวิธี bcp ที่รวดเร็วมากเนื่องจากใช้โหมดเนทีฟ


มีประโยชน์มาก - วิธี B ใช้งานได้สำหรับฉัน (SQL ที่สร้างโดยวิธี A คือ 7GB และ SSMS ไม่มีเลย) SSID และเซิร์ฟเวอร์ที่มีการเชื่อมโยงบางตัวไม่สามารถทำงานได้อย่างถูกต้อง แต่เมื่อใดที่การเชื่อมโยงกับเซิร์ฟเวอร์ที่เชื่อมโยงนั้นเคยทำงานเป็นครั้งแรก ไม่แน่ใจว่าฉันจะมีความสุขกับการใช้งานนี้ในการผลิต แต่สำหรับสภาพแวดล้อมการทดสอบ 95% ขึ้นอย่างรวดเร็วมันสมบูรณ์แบบ
aucuparia

Some SSIDs and linked servers didn't go across properly@aucuparia เซิร์ฟเวอร์ที่เชื่อมโยงจะต้องทำการสคริปต์ด้วยตนเอง SSID สามารถ trnasfered ได้โดยใช้ sp_helprevlogin งาน SQLAgent, แพคเกจ ssis ฯลฯ ควรย้ายตามความต้องการของคุณ จุดประสงค์ของวิธีนี้คือการรับข้อมูลให้เร็วที่สุดเมื่อคุณกำลังลดระดับหรือรวมฐานข้อมูล 2 ตัว
Kin Shah

ตัวเลือก B เป็นวิธีการเดียวที่ใช้ได้ผลสำหรับฉันเนื่องจากสคริปต์ที่สร้างมีขนาดใหญ่เกินไปในวิธีอื่น ๆ
JumpingJezza

23

ไม่คุณไม่สามารถย้อนกลับไปข้างหน้าได้ คุณสามารถสร้างฐานข้อมูลเปล่าในปี 2008 จากนั้นใช้วิซาร์ดสร้างสคริปต์ใน Management Studio เพื่อเขียนสคริปต์สกีมาและข้อมูล (หรือเครื่องมือเปรียบเทียบบุคคลที่สามจาก Red Gate และอื่น ๆ ) ตรวจสอบให้แน่ใจว่าคุณตั้งค่าเวอร์ชันเป้าหมายที่ถูกต้องเป็น 2008 และคุณจะต้องคัดแยกสิ่งที่เข้ากันไม่ได้ (เช่น OFFSET หรือ FORMAT) ที่คุณอาจใช้ในปี 2012


8

ไม่มีวิธีที่รองรับในการทำเช่นนี้เนื่องจาก SQL Server ไม่อนุญาตความเข้ากันได้ชนิดนี้

สิ่งที่คุณสามารถทำได้คือ

  1. คืนค่าฐานข้อมูลใน SQL 2012

  2. สร้างสคริปต์สำหรับวัตถุและข้อมูล

  3. ล้างค่าสคริปต์จากรายละเอียดทั้งหมดที่ไม่ซ้ำกันสำหรับ SQL 2012
  4. รันสคริปต์ในปี 2008

หากคุณไม่มี SQL Server 2012 คุณสามารถใช้เครื่องมือของบุคคลที่สามเพื่ออ่านข้อมูลสำรองและแยกข้อมูลและโครงสร้าง

ในกรณีนี้เพียงสร้างฐานข้อมูลเปล่าใน SQL 2008 และใช้เครื่องมือเช่นApexSQL DiffและApexSQL Data Diffเพื่อซิงโครไนซ์วัตถุและข้อมูล คุณสามารถค้นหาสิ่งเหล่านี้ได้จากผู้ค้ารายใหญ่อื่น ๆ เช่น Red-Gate หรือ Idera

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