วิธีการย้ายฐานข้อมูลจาก SQL Server 2012 ไปยัง SQL Server 2005


30

ตัวเลือกของฉันคืออะไรถ้าฉันต้องการย้ายฐานข้อมูลจาก SQL Server 2012 (32 บิต) ไปยัง SQL Server 2005 (64 บิต)

ฉันรู้ว่าฉันไม่สามารถ:

  • คืนค่าการสำรองข้อมูลของฐานข้อมูลบน SQL Server 2005
  • แยกออกและแนบ

ฉันรู้ว่าฉันสามารถ:

  • ใช้ตัวช่วยสร้างการนำเข้าข้อมูลและฉันลองใช้กับฐานข้อมูลเดียว แต่ย้ายข้อมูลเท่านั้นและแม้จะเป็นปัญหาเพราะฉันต้องทำงานมากในการสร้างตาราง temp เพื่อรักษาคอลัมน์ข้อมูลประจำตัวสร้าง FKs ใหม่ทั้งหมดดัชนีเป็นต้น

มีตัวเลือกง่ายขึ้นไหม


12
ตัวเลือกที่ง่ายกว่าคือการอัพเกรดจุดหมายปลายทางเป็น 2012 เพื่อความซื่อสัตย์
Aaron Bertrand

คำตอบ:


40

คุณสามารถทำตามวิธีการด้านล่าง:

หมายเหตุ: หากคุณใช้คุณสมบัติใหม่ใด ๆ เช่นชนิดข้อมูลใหม่ ฯลฯ คุณจะต้องทดสอบเพราะจะทำให้เกิดข้อผิดพลาด

วิธีที่ 1: การใช้เครื่องมือพื้นเมือง

  1. สคริปต์ฐานข้อมูล SCHEMA_ONLY และสร้างฐานข้อมูลเปล่าบนเซิร์ฟเวอร์ปลายทาง ด้านล่างเป็นภาพหน้าจอ:

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

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

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

  2. ใช้ BCP OUT และ BULK INSERT เพื่อแทรกข้อมูล

ด้านล่างเป็นสคริปต์ที่จะช่วยคุณในส่วนที่ 2

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- 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_OUT\*.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_OUT\'                                           -- 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) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- 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 = 'destination_database_Name'               -- 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_OUT\'                             -- 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) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)

วิธีที่ 2: การใช้เครื่องมือของบุคคลที่สาม

สร้างฐานข้อมูลเปล่าบนเซิร์ฟเวอร์ปลายทาง ใช้การเปรียบเทียบ schema ของ Redgate และการเปรียบเทียบข้อมูลเพื่อสร้างและโหลดข้อมูลลงในเซิร์ฟเวอร์ปลายทาง

หมายเหตุ: ฉันใช้ schema และการเปรียบเทียบข้อมูลของ Redgate แล้วและเป็นเครื่องมือที่ดีที่สุดสำหรับงานประเภทนั้นและถ้าคุณใช้เครื่องมือของบุคคลที่สามข้อเสนอแนะของฉันก็คือ Redgate


7
+1 แต่โปรดจำไว้ว่ามีบางสิ่งที่ไม่สามารถทำงานได้ที่ปลายทาง (และฉันไม่แน่ใจว่าเครื่องมือของบุคคลที่สามที่สง่างามจะจัดการกับสิ่งเหล่านั้นได้อย่างไร) วัตถุเช่น SEQUENCE รหัสเช่น OFFSET / FETCH LAG / LEAD เป็นต้น
Aaron Bertrand

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

4

นอกเหนือจากวิธีที่แนะนำไว้แล้วที่นี่คุณสามารถลองสร้างไฟล์ BACPAC และนำเข้าสู่ปลายทางของคุณได้ สิ่งนี้คล้ายกับวิธีที่ Microsoft แนะนำให้โยกย้ายฐานข้อมูลของคุณจากฐานข้อมูล Cloud ไปยัง Azure

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

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

สิ่งที่คุณต้องมีคือหนึ่งในเวอร์ชัน SSMS ที่ใหม่กว่า (17 หรือ 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

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

ส่งออกแอปพลิเคชันระดับข้อมูล ...

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

นำเข้าแอปพลิเคชันระดับข้อมูล ...

สิ่งนี้ก็จะแสดงวิซาร์ดที่เรียบง่ายเพื่อแนะนำคุณเกี่ยวกับขั้นตอนต่างๆ


-1

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

  • SSIS,
  • เครื่องมือนำเข้าข้อมูล
  • เครื่องมือของบุคคลที่สามเช่น RedGate หรืออื่น ๆ

แต่สำหรับเครื่องมือเปรียบเทียบข้อมูล RedGate

คุณต้องพิจารณาว่ามันเปรียบเทียบตารางเท่านั้นที่มีคีย์หลัก ดังนั้นหากตารางที่ไม่มีคีย์หลักคุณต้องใช้วิธีอื่น


8
ฉันไม่คิดว่าคำตอบนี้จะปรับปรุงให้ดีขึ้นในคำตอบของ Kins
James Anderson

-3

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


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