it-swarm.asia

نقل الجداول إلى قاعدة بيانات SQL2008 أخرى (بما في ذلك الفهارس والمشغلات وما إلى ذلك)

أحتاج إلى نقل مجموعة كاملة (100+) من الجداول الكبيرة (ملايين الصفوف) من قاعدة بيانات SQL2008 إلى قاعدة بيانات أخرى.

لقد استخدمت في الأصل معالج الاستيراد/التصدير ، ولكن جميع جداول الوجهة كانت تفتقد المفاتيح الأساسية والأجنبية ، والفهارس ، والقيود ، والمشغلات ، وما إلى ذلك (تم تحويل أعمدة الهوية أيضًا إلى INTs عادية ، ولكن أعتقد أنني فاتني مربع اختيار في ساحر.)

ما هي الطريقة الصحيحة للقيام بذلك؟

إذا كان هذا مجرد جدولين ، فسأعود إلى المصدر ، وأخرج البرنامج النصي لتعريف الجدول (مع جميع الفهارس ، وما إلى ذلك) ، ثم تشغيل أجزاء إنشاء الفهرس من البرنامج النصي على الوجهة. ولكن مع وجود العديد من الجداول ، يبدو هذا غير عملي.

إذا لم يكن هناك الكثير من البيانات ، فيمكنني استخدام معالج "إنشاء برامج نصية ..." لإخراج المصدر ، بما في ذلك البيانات ، ولكن لا يبدو البرنامج النصي الذي يبلغ طوله 72 مترًا فكرة جيدة!

16
BradC

لقد فعلنا ذلك في الواقع باستخدام الكثير من البرمجة النصية جنبًا إلى جنب مع معالج الاستيراد ، ولكن هذا الصباح وجدت إجابة أفضل ، من باب المجاملة مقالة مدونة Tibor Karaszi .

جزء من شعورنا بالإحباط هنا هو أن SQL 2000 "معالج استيراد/تصدير DTS" يجعل هذا الأمر في غاية السهولة من خلال تحديد "نسخ الكائنات والبيانات":

DTS Import Wizard

هذا الخيار الثالث هو الذي يحتوي على القدرة على تضمين الفهارس/المشغلات ، إلخ:

Advanced Options

تم إزالة هذا الخيار [~ # ~] [~ # ~] من SQL 2005/2008 معالج الاستيراد. لماذا ا؟ لا يوجد فكرة:

2008 Import Wizard

في 2005/2008 ، يبدو أنك مضطر إلى يدوياً إنشاء حزمة SSIS في BIDS واستخدام نقل كائنات خادم SQL ، والتي تحتوي على نفس الخيارات التي كانت موجودة في معالج 2000:

SSIS Transfer SQL Server Objects Task

9
BradC

برمجة الجداول ، ثم استخدام SSIS لنقل البيانات سيكون الطريقة الأكثر موثوقية وفعالية لنقل البيانات إلى قاعدة البيانات الجديدة.

14
mrdenny

سأفكر في برمجة الجدول ، أو استخدم أدوات مقارنة (مثل Red Gate) لإنشاء الجداول في قاعدة البيانات المستهدفة. بدون فهارس أو قيود حتى الآن.

ثم سأفكر في استعادة قاعدة البيانات باسم مختلف على نفس الخادم والقيام بذلك

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

.. لكل طاولة ، مع تعيين هوية إدخال ON إذا لزم الأمر

ثم أضيف الفهارس والقيود بعد تحميل البيانات.

هذا يعتمد على مستوى راحتك مع SSIS (إجابة mrdenny) أو إذا كنت تفضل SQL الخام.

8
gbn

أود أن أضيف إلى إجابة السيد ديني: نص مخطط الجداول ثم استخدم BCP لنقل البيانات. إذا لم تكن على دراية بـ SSIS ، فيجب أن يكون استخدام BCP والدفعات أمرًا سهلاً. لملايين الصفوف لا شيء يتفوق على BCP (إدراج بالجملة) :).

6
Marian

أنا الشخص غير مرتاح تمامًا مع SSIS.

عندما لا تحتوي جداول المصدر على أعمدة هوية

  1. إنشاء قاعدة بيانات فارغة على الخادم الهدف
  2. إنشاء خادم مرتبط بالخادم المصدر على الخادم الهدف
  3. تشغيل البرنامج النصي أدناه في قاعدة البيانات المصدر لإنشاء عبارات تحديد * في ...
  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 المشابهة لـ [هذا SO سؤال 1 ، لكنني ما زلت أعمل على معالجة الخطأ. قد تتسبب الجداول الكبيرة حقًا في نفاد الذاكرة الأخطاء ، حيث يتم تحميل الجدول بالكامل في الذاكرة ، قبل إرساله عبر SQLBulkCopy إلى قاعدة البيانات.

إعادة إنشاء الفهارس وما شابه ذلك هو الحال أعلاه. هذه المرة يمكنني تخطي إعادة إنشاء المفاتيح الأساسية.

4
bernd_k

يمكنك استخدام أدوات المقارنة التي تقارن مخططات قاعدة البيانات والبيانات وتقوم أولاً بمزامنة مخطط قاعدة بيانات فارغ فارغ مع قاعدة البيانات الأصلية ، لإنشاء جميع الجداول.

بعد ذلك ، قم بمزامنة البيانات من قاعدة البيانات الأصلية مع قاعدة البيانات الجديدة (جميع الجداول موجودة ، لكنها كلها فارغة) لإدراج السجلات في الجداول

أستخدم ApexSQL Diff و ApexSQL Diff لهذا ، ولكن هناك أدوات أخرى مماثلة.

الشيء الجيد في هذه العملية هو أنك لست مضطرًا في الواقع إلى مزامنة قواعد البيانات باستخدام الأداة ، لأن ذلك قد يكون مؤلمًا تمامًا لملايين الصفوف.

يمكنك فقط إنشاء نص INSERT INTO SQL (لا تتفاجأ إذا كان هناك العديد من العربات) وتنفيذه.

نظرًا لأنه لا يمكن فتح البرامج النصية الكبيرة جدًا في SQL Server Management Studio ، أستخدم sqlcmd أو osql

2
Carol Baker West

كما ذكرmrdenny -

  1. النصي خارج الجداول أولاً مع كافة الفهارس و FK's إلخ وإنشاء جداول فارغة في قاعدة البيانات الوجهة.

بدلاً من استخدام SSIS ، استخدم BCP لإدراج البيانات

  1. bcp البيانات باستخدام البرنامج النصي أدناه. تعيين SSMS في وضع النص ونسخ الإخراج الناتج عن البرنامج النصي أدناه في ملف الخفافيش.

    -- 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. تشغيل ملف الخفافيش الذي سيقوم بإنشاء ملفات .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 سريعة جدًا لأنها تستخدم الوضع الأصلي.

1
Kin Shah