تقنيات النسخ كبيرة الحجم واستيراد وتصدير البيانات بحجوم كبيرة في SQL Server

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

يوفر SQL Server أدوات للقيام بعمليات استيراد وتصدير البيانات بكميات كبيرة ونسخها بحجوم كبيرة. ومن هذه الأدوات :

الأداة المساعدة BCB ، الدالة OPENROWSET(BULK) ، معالج اتسيراد وتصدير البيانات في SQL Server ، جملة BULK INSERT وجملة SELECT INTO.

سنشرح في هذا المقال كيفية نسخ كميات كبيرة من البيانات من جدول أو مجموعة من الجداول إلى قاعدة بيانات أخرى باستخدام هذه الأدوات وأيضاً باستخدام ApexSQL Script و ApexSQL Data Diff.

نسخ البيانات باستخدام معالج استيراد وتصدير البيانات في SQL Server

يقوم معالج استيراد وتصدير البيانات بإنشاء مجموعة من الخدمات المتكاملة (SSIS) والتي يمكن جدولتها لتنفّذ على أسس محددة وتعديلها عند الحاجة لذلك باستخدام أداة SQL Server Data Tools.

لتشغيل معالج اتسيراد وتصدير البيانات ، انقر بالزر الأيمن للفأرة على قاعدة البيانات ، اختر مهام ، ثم أمر تصدير بيانات :

SQL Server Import and Export Wizard - selecting the Export data command

  1. في شاشة اختيار مصدر البيانات ، اشبك على قاعدة البيانات المصدر. يجب أن يكون لديك الصلاحيات التالية على الخادم المصدر حتى تتمكن من استخدام معالج استيراد وتصدير البيانات في SQL Server : صلاحية قراءة البيانات من قاعدة البيانات أو الملف ، صلاحية الكتابة على قاعدة بيانات النظام msdb لحفظ الخدمات المتكاملة (SSIS).
  2. في شاشة اختيار الوجهة، اشبك على قاعدة بيانات التي ستكون الوجهة. يجب أن يكون لديك الصلاحيات التالية على الخادم الوجهة : الكتابة على قاعدة البيانات أو الملف ، صلاحيات لإنشاء قاعدة بيانات أو جدول إذا تطلب الأمر:

    SQL Server Import and Export Wizard - Choose a Destination window

  3. في شاشة تحديد نسخ جدول أو جملة استعلام ، اخترخيار نسخ البيانات من جدول ، مجموعة جداول أو عروض.
  4. اختر الجداول والعروض ثم اختر Run immediately للتنفيذ الفوري في شاشة إتمام المعالج:

    Dialog showing that the execution was successful

    لاحظ أن معالج استيراد وتصدير البيانات في SQL Server لن يعامل عمود القيمة التعريفية Identity معاملة خاصة مختلفة عن باقي الأعمدة، وسوف تفشل العملية عند محاولتك إدخال بيانات إلى جدول يحتوي على عمود القيمة التعريفية:

    View report dialog

لاحظ أنه إذا كان الجدول المصدر يحتوي على قيد مفتاح خارجي ، فإن معالج استيراد وتصدير البيانات في SQL Server لن يقوم بتحميل الجداول بالترتيب الصحيح للقيود ،حيث أنه من الممكن أن يقوم بنسخ الجدول الذي يحتوي على قيد المفتاح الخارجي قبل تحميل الجدول الذي يحتوي على المفتاح الرئيسي المرجعي ، مما يسبب فشل في قيد المفتاح الخارجي.

ستخدام تقنيات النسخ كبيرة الحجم في SQL Server

أداة BCP

إنّ أداة BCP هي أداة أوامر سطرية تسمح بنسخ حجم كبيرمن البيانات من قاعدة بيانات مصدرية إلى ملف ، أو استيراد حجم كبير من البيانات من ملف إلى قاعدة البيانات الوجهة. على سبيل المثال ، لتصدير العمودين EmployeeIDs و Emails كاملين إلى الملف Emails.txt من جدول EmployeeEmail في قاعدة بيانات TestDB ، قم بتنفيذ أمر BCP التالي:

bcp TestDB.dbo.EmployeeEmail out Emails.txt –c -T

Bcp utility - command to bulk export data to a txt file

لاحظ أنّ خيار –c يحدد أن الأداة المساعدة ستستخدم مع بيانات نصية و كذلك الخيار –T يبين أن الأتصال موثوق، مما يعني أن أداة BCP سيتم تنفيذها عن طريق المستخدم الذي تم تسجيل دخوله حالياً. وإذا لم يتم تحديد –T ، وجب عليك تحديد اسم المستخدم وكلمة السر باستخدام الخيارات –U و –P .

تأكد من وجود الجدول الوجهة الذي تريد النسخ عليه قبل عملية الإستيراد، وأنّ يحتوي الجدول الوجهة على أعمدة مطابقة في نوعها للجدول المستورد قبل عملية الإستيراد. مثلا ، لإدخال البيانات من ملف Emails.txt إلى الجدول NewSchema.dbo.EmployeeEmail ، استخدم أمر BCP التالي:

bcp NewSchema.dbo.EmployeeEmail in Emails.txt -T –c

Bcp utility - CLI command to insert data from a txt file

إنّ أداة BCP تستخدم فقط لنسخ البيانات إلى ملف أو استيرادها من ملف. والمستخدم الذي ينفذ هذا الأمر يجب أن يكون لديه صلاحية للقراءة من الجدول المصدر حتى يتسنى له استخدامها.

استيراد البيانات باستخدام جملة BULK INSERT

يمكنك استخدام جملة BULK INSERT لاستيراد البيانات من ملف معين إلى جدول. كم هو الحال في أداة bcp السابقة ، يجب أن يكون الجدول الذي يراد استيراده موجوداً في الوجهة والأعمدة فيه مطابقة للمصدر في نوع البيانات.

ما عليك فعله هنا هو تحديد الجدول الوجهة ومكان تواجد الملف الذي يراد استيراد البيانات منه كالتالي:

BULK INSERT TestRemote.dbo.EmployeeEmail 
FROM 'C:\Users\Lenovo\Desktop\Emails.txt';
GO

استيراد البيانات باستخدام الدالّة OPENROWSET(BULK)

إنّ دالّة OPENROWSET(BULK) تستخدم مصدر بيانات OLE DB لاستعادة البيانات ، وتسمح الدخول إلى البيانات البعيدة من خلال اتصالها بمصادر البيانات البعيدة.

INSERT INTO AllEmails(Email)
SELECT * FROM OPENROWSET(
   BULK 'C:\Users\Lenovo\Desktop\Emails.txt',
   SINGLE_BLOB) AS x;

تقدّم دالّة OPENROWSET(BULK) البديل عن استخدام أداة الربط بالخادم البعيد Linked Server للوصول إلى البيانات ، ومناسبة لإدخال البيانات من مصدر بعيد دفعة واحدة.

استيراد وتصدير البيانات باستخدام جملة SELECT INTO

عند استخدام جملة INTO مع SELECT في تركيب واحد ، يسمح لك هذا بإنشاء جدول جديد بناء على نتيجة جملة الإختيار. مثلا ، لنسخ الجدول EmployeeEmail على نفس الخادم ، على المخطط الإفتراضي في قاعدة بيانات TestDB، قم بتنفيذ جملة الإستعلام التالية:

SELECT * INTO TestDB.dbo.EmployeeEmail 
FROM AdventureWorks2012.HumanResources.EmployeeEmail;

لا يمكن استخدام جملة SELECT INTO لإنشاء جدول جديد في خادم SQL البعيد ، لكن يمكن تضمين المصدر البعيد في جملة SELECT اذا كان هناك أداة ربط مع هذا الخادم البعيد.

اذا كان الجدول المصدر يحتوي على أي قيود ، فهارس أو مشغلات ، فلن يتم نقلها إلى الجدول الجديد. والعمود في الجدول الجديد لن يرث خاصية الإدخال التلقائي من مخرجات جملة الإستعلام اذا كانت جملة الإدخال تحتوي على دالة التجميع ، جملة الربط أو جملة التجميع عن طريق حقل ، وكذلك اذا تم استخدام عمود التعريف في الجملة أو استخدم أكثر من مرة أو اذا كان من مصدر بيانات بعيد.

استيراد وتصدير البيانات باستخدام ApexSQL Script

تستخدم أداة ترحيل قواعد البيانات ApexSQL Script في SQL Server لإنشاء برامج نصية لتصدير البيانات أو البيانات والتركيب معاً من الخادم المصدر وتنفيذ هذه البرامج في الخادم الوجهة لاستيراد البيانات.

لإنشاء البرنامج النصي للبيانات في قاعدة البيانات باستخدام تطبيق ApexSQL Script، ابدأ مشروع جديد، اشبك على قاعدة البيانات، وقم بتحديد الإعدادات للمشروع اعتماداً على التركيب في الخادم الوجهة. إذا اردت إنشاء برنامج نصي لكل من البيانات وتركيب الجدول المصدر، وعلى افتراض أن قاعدة البيانت تم انشاؤها مسبقاً في الوجهة، من خلال تبويب انشاء البرنامج النصي للتركيب ، أزل الاختيار من المربع بجانب الخيارات Script CREATE DATABASE و Script USE for a database. واذا اردت انشاء برنامج نصي للقيود والفهارس والمفاتيح الخارجية ، قم باختيار المربع بجانب الخيار Script names.

ApexSQL Script - new project dialog, structure script tab

من خلال تبويب انشاء برامج نصية للبيانات ، قم باختيار الخيار Set IDENTITY_INSERT ON للتعامل مع تحميل بيانات إلى جداول تحتوي على عمود IDENTITY. وتحت خيار السجلات التي سيتم انشاء برنامج نصي لها ، اختر Script rows as INSERT ليتم انشاؤها على شكل جمل إدخال.

Data script tab in ApexSQL Script

اذا كان تركيب الجدول في الوجهة مختلف عن تركيب الجدول المصدر، فمن خلال التبويب Schema mapping ، اختر Exclude schemas لازالة اسم البنية من اسماء العناصر في قاعدة البيانات، ثم اضغط على زر Open للفتح:

Schema mappings tab in ApexSQL Script

في شبكة النتائج ، تحت شبكة البيانات ، قم بتصفية الأعمدة التي تريد الحصول على البيانات منها:

Data grid dialog - filtering columns to extract data from

ومن شبكة التركيب ، اختر الجداول التي تريد انشاء برنامج نصي لها ، ثم ابدأ معالج إنشاء البرامج:

Selecting tables to script, and starting the Script wizard

في معالج إنشاء البرامج النصية ، قم بتحديد نمط البرامج ثم انقر على التالي Next:

Selecting the scripting mode in the Script Wizard

قم بحفظ البرنامج النصي الناتج وتنفيذه على الخادم الحالي أو البعيد:

Dialog showing the execution of saved SQL script

نسخ البيانات باستخدام تطبيق ApexSQL Data Diff

بإمكانك استخدام أداة مقارنة البيانات ApexSQL Data Diff لنسخ البيانات من جدول أو مجموعة جداول إلى قاعدة بيانات الوجهة اذا كانت هذه الجداول موجودة في الوجهة وبنفس تركيب الجداول المصدرية.

ابدأ مشروع جديد ، واشبك على قاعدة البيانات المصدر والوجهة ، ثم انقر على زر المقارنة Compare:

في شبكة النتائج، اختر الجداول التي تريد نسخها ثم اضغط على زر Synchronize:

ApexSQL Data Diff comparison results dialog - selecting tables to copy

في معالج المزامنة يمكنك رؤية تأثير برنامج المزامنة النصي ومراجعة كافة التحذيرات والخطوات:

Synchronization Wizard in ApexSQL Data Diff

انقر على زر انشاء البرنامج النصي Create script ثم نفّذ البرنامج:

Dialog showing the execution of created script

موارد مفيدة:
bcp Utility
SQL Server Import and Export Wizard
Bulk Import and Export of Data (SQL Server)

مترجم Ahmad Yaseen

January 19, 2016