การย้ายตารางไปยังฐานข้อมูล SQL2008 อื่น (รวมถึงดัชนีทริกเกอร์ ฯลฯ )


16

ฉันต้องการย้ายทั้งตาราง (100+) ของตารางขนาดใหญ่ (ล้านแถว) จากฐานข้อมูล SQL2008 หนึ่งไปยังอีก

เดิมทีฉันเพิ่งใช้ตัวช่วยสร้างการนำเข้า / ส่งออก แต่ตารางปลายทางทั้งหมดไม่มีคีย์หลักและต่างประเทศดัชนีข้อ จำกัด ทริกเกอร์ ฯลฯ (คอลัมน์รหัสประจำตัวยังถูกแปลงเป็น INT ธรรมดาด้วย แต่ฉันคิดว่าฉันพลาดช่องทำเครื่องหมายใน วิซาร์ด.)

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?

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

หากมีข้อมูลไม่มากฉันสามารถใช้วิซาร์ด "สร้างสคริปต์ ... " เพื่อสคริปท์แหล่งที่มารวมถึงข้อมูล แต่สคริปต์แถวขนาด 72 ม. ดูเหมือนจะไม่เป็นความคิดที่ดีเลย!


และไม่ใช่ตารางทั้งหมดในฐานข้อมูลใช่ไหม
วันพฤหัสบดีที่

@thursdaysgeek: เกือบทุกตาราง แต่ฐานข้อมูลปลายทางมีมากกว่า 100 ตารางแล้ว ดังนั้นการกู้คืนจากการสำรองข้อมูลด้วยชื่ออื่นจึงไม่ใช่ตัวเลือก คิดว่านี่เป็น "ผสานฐานข้อมูลขนาดใหญ่ทั้งสองเข้าด้วยกัน"
BradC

คำตอบ:


14

การเขียนตารางจากนั้นใช้ SSIS เพื่อถ่ายโอนข้อมูลจะเป็นวิธีที่เชื่อถือได้และมีประสิทธิภาพที่สุดในการย้ายข้อมูลไปยังฐานข้อมูลใหม่


9

จริงๆแล้วเราใช้การเขียนสคริปต์ด้วยตนเองร่วมกับตัวช่วยสร้างการนำเข้า แต่เช้านี้ฉันพบคำตอบที่ดีกว่าบทความเอื้อเฟื้อของTibor Karasziบทความบล็อก

เป็นส่วนหนึ่งของความคับข้องใจของเราที่นี่ก็คือว่าSQL 2000 "DTS นำเข้า / ส่งออก Wizard" จริงทำให้นี้เกือบจะนิด ๆ ได้ง่ายโดยการเลือก "คัดลอกวัตถุและข้อมูล":

ตัวช่วยสร้างการนำเข้า DTS

ตัวเลือกที่สามนี้เป็นตัวเลือกที่มีความสามารถในการรวมดัชนี / ทริกเกอร์ ฯลฯ :

ตัวเลือกขั้นสูง

ตัวเลือกนี้ถูกลบออกจากตัวช่วยสร้างการนำเข้าSQL 2005/2008 ทำไม? ไม่มีความเห็น:

ตัวช่วยสร้างการนำเข้าปี 2008

ใน 2005/2008 คุณต้องสร้างแพ็คเกจ SSIS ด้วยตนเองใน BIDS ด้วยตนเองและใช้งานการถ่ายโอนวัตถุเซิร์ฟเวอร์ SQLซึ่งมีตัวเลือกเดียวกันทั้งหมดที่อยู่ในตัวช่วยสร้าง 2000:

งาน SSIS การถ่ายโอนวัตถุเซิร์ฟเวอร์ SQL


แค่ต้องการโพสต์ว่าฉันใช้วิธี SSIS นี้สำหรับงานที่คล้ายกันและมันใช้งานได้ดีมาก!
BradC

8

ฉันจะพิจารณาการเขียนตารางออกมาหรือใช้เครื่องมือเปรียบเทียบ (เช่น Red Gate) เพื่อสร้างตารางในฐานข้อมูลเป้าหมาย ยังไม่มีดัชนีหรือข้อ จำกัด

จากนั้นฉันจะพิจารณากู้คืนฐานข้อมูลด้วยชื่ออื่นบนเซิร์ฟเวอร์เดียวกันและทำ

 INSERT newdb.dbo.newtable SELECT * FROM olddb.dbo.oldtable

.. สำหรับแต่ละตารางโดยมี SET IDENTITY INSERT ON ถ้าจำเป็น

จากนั้นฉันจะเพิ่มดัชนีและข้อ จำกัด หลังจากโหลดข้อมูล

ขึ้นอยู่กับระดับความสะดวกสบายของคุณด้วย SSIS (คำตอบของ mrdenny) หรือถ้าคุณชอบ SQL แบบดิบ


6

ฉันต้องการเพิ่มคำตอบของ Mr Denny: สคริปต์ out schema ของตารางจากนั้นใช้ BCP เพื่อย้ายข้อมูล หากคุณไม่คุ้นเคยกับ SSIS การใช้ BCP และแบทช์ควรทำง่าย สำหรับแถวนับล้านไม่มีอะไรเต้น BCP (แทรกจำนวนมาก) :)


4

ฉันเป็นคนหนึ่งที่อึดอัดกับ SSIS อย่างสมบูรณ์

เมื่อตารางต้นฉบับไม่มีคอลัมน์ข้อมูลระบุตัวตน

  1. สร้างฐานข้อมูลเปล่าที่เซิร์ฟเวอร์เป้าหมาย
  2. สร้างเซิร์ฟเวอร์ที่เชื่อมโยงกับเซิร์ฟเวอร์ต้นทางบนเซิร์ฟเวอร์เป้าหมาย
  3. เรียกใช้สคริปต์ด้านล่างนี้ในฐานข้อมูลต้นทางเพื่อสร้างคำสั่ง select * เป็น ...
  4. เรียกใช้สคริปต์ที่สร้างจากฐานข้อมูลเป้าหมาย
  5. คีย์หลักของสคริปต์ดัชนีทริกเกอร์ฟังก์ชันและโพรซีเดอร์จากฐานข้อมูลต้นทาง
  6. สร้างวัตถุเหล่านี้โดยสคริปต์ที่สร้างขึ้น

ตอนนี้ T-SQL เพื่อสร้างคำสั่ง Select * เป็น ...

SET NOCOUNT ON

declare @name sysname
declare @sql varchar(255)

declare db_cursor cursor for
select name from sys.tables order by 1
open db_cursor

fetch next from db_cursor into @name
while @@FETCH_STATUS = 0
begin
    Set @sql = 'select * into [' + @name + '] from [linked_server].[source_db].[dbo].[' + @name + '];'
    print @sql

    fetch next from db_cursor into @name
end

close db_cursor
deallocate db_cursor

สิ่งนี้สร้างบรรทัดสำหรับแต่ละตารางเพื่อคัดลอกเช่น

select * into [Table1] from [linked_server].[source_db].[dbo].[Table1];

ในกรณีที่ตารางมีคอลัมน์ข้อมูลเฉพาะตัวฉันสคริปต์ตารางรวมถึงคุณสมบัติข้อมูลประจำตัวและคีย์หลัก

ฉันไม่ได้ใช้การแทรกลงใน ... เลือก ... โดยใช้เซิร์ฟเวอร์ที่เชื่อมโยงในกรณีนี้เนื่องจากนี่ไม่ใช่เทคนิคแบบกลุ่ม ฉันกำลังทำงานกับสคริปต์ PowerShell บางอย่างที่คล้ายกับ [คำถามนี้1ข้อแต่ฉันยังคงทำงานเกี่ยวกับการจัดการข้อผิดพลาด ตารางขนาดใหญ่จริง ๆ อาจทำให้เกิดข้อผิดพลาดหน่วยความจำไม่ครบเนื่องจากตารางทั้งหมดถูกโหลดเข้าสู่หน่วยความจำก่อนที่จะส่งผ่าน SQLBulkCopy ไปยังฐานข้อมูล

การสันทนาการของดัชนีเป็นต้นนั้นคล้ายกับกรณีข้างต้น เวลานี้ฉันสามารถข้ามการเล่นเกมของคีย์หลัก


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

1
@Marian โปรดดูที่dba.stackexchange.com/questions/297/…หากคุณต้องการโปรโมต SSIS ฉันไม่ได้ลอง SSIS แต่ตัวช่วยสร้างการนำเข้าการส่งออกล้มเหลวด้วย (นอกเหนือจากเซิร์ฟเวอร์ที่เชื่อมโยง)
bernd_k

ฉันจะช่วยด้วยความยินดี แต่ฉันไม่มีกล่อง Oracle ให้ฉัน อย่างไรก็ตามจากสิ่งที่ฉันจัดการอ่านไม่มีผู้ให้บริการที่จะสนับสนุน Oracle CLOB ..
แมเรียน

ฉันอยู่กับคุณในเรื่องนี้ - ฉันจะย้ายข้อมูลบางครั้ง แต่ไม่เคยใช้ SSIS
AK

2

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

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

ฉันใช้ApexSQL DiffและApexSQL Data Diffสำหรับสิ่งนี้ แต่มีเครื่องมืออื่นที่คล้ายคลึงกัน

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

คุณสามารถสร้างสคริปต์ INSERT INTO SQL (ไม่ต้องแปลกใจถ้ามันมีหลายกิ๊ก) และรันมัน

เนื่องจากสคริปต์ขนาดใหญ่ไม่สามารถเปิดได้ใน SQL Server Management Studio ฉันจึงใช้sqlcmdหรือosql


1

ดังที่ @mrdenny พูดถึง -

  1. สคริปต์ออกตารางแรกกับดัชนีทั้งหมดของ FK ฯลฯ และสร้างตารางเปล่าในฐานข้อมูลปลายทาง

แทนที่จะใช้ SSIS ให้ใช้ 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. เรียกใช้สคริปต์ด้านล่างใน

    --- 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 ที่รวดเร็วมากเนื่องจากใช้โหมดเนทีฟ

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