السبت، 18 أبريل 2009

ماذا تعرف عن Transportable Tablespaces؟

أهلا بك عزيزي في هذا الموضوع الجديد والمثير والذي حييت أن أطرحه عليكم لتعم الفائدة ويستفيد الجميع من هذا الموضوع وهو هام لكل من يريد أن يحترف (DBA)

أولا سأضع مقدمة للموضوع ومن ثم سوف أشرح الموضوع بالتفصيل ؟

كل مستخدم لأوراكل يعلم أن هناك ما يسمى (Export and Import) ويعلم أننا نستطيع تصدير Export المعطيات من قاعدة بيانات ومن ثم نستوردها من قاعدة بيانات أخرى , كما أن هناك تصدير واستيراد على مستوى كامل full وهناك أيضا على مستوى الجدول وهناك أيضا على مستوى المستخدم وعلى مستوى tablespace .

ما قرأته سابقا عبارة عن نقل بيانات من قاعدة بيانات إلى أخرى ولكن ماذا إذا أردت نقل tablespace من قاعدة بيانات إلى أخرى (هذا هو لب موضوعنا)

إذا ما هو Transportable Tablespaces ؟

هو نوع خاص من التصدير export الذي لا يصدر أي معطيات فعلية (كيف ذلك؟)

عزيزي القارئ : لو تأملنا في أوراكل وبنيتها سنجد أن أوراكل لها بنية منطقية وبنية فيزيائية وكما تعلمون أن ال Tablespace عبارة عن بنية منطقية ليس لها أي وجود فيزيائي ولكنها تحتوي على بيانات ال datafile والتي تمثل البنية الفيزيائية , وكما تعلمون أن الـ metadata تخزن في ال data Dictionary وبالتالي ما سنقوم به هو تصدير ال metadata المرتبطة بالـ tablespace الذي نريد نقلة إلى dictionary file , كما تلاحظ أننا لن نصدر أي بيانات .

إذا ما سنقوم به هو أن نصدر الـ metadata المرتبطة بهذا ال tablespace إلى ملف Dictionary ومن ثم نقوم باستيراده إلى قاعدة البيانات الأخرى وكذلك سنقوم بنسخ ملفات datafiles المرتبطة بهذا ال tablespace إلى قاعدة البيانات الأخرى (فمثلا تستطيع استخدام ال FTP لنسخ هذه الملفات )

ملاحظة هامة : هذه الطريقة سوف تستخدم بين قاعدتي بيانات موجودة على أنظمة تشغيل متوافقة (فمثلا إذا كانت قاعدة البيانات الأولى موجودة على نظام تشغيل Unix Solaris لابد أن يكون نظام التشغيل الموجود على قاعدة البيانات الأخرى نفس نظام التشغيل )

لهذه الطريقة العديد من الفوائد التي تميزها عن الطرق الأخرى لنقل البيانات ومنها ان هذه الطريقة سريعة جدا مقارنة بطريقة export and import والسبب أننا لا نقوم بنقل محتويات ال tablespace وأنما نقوم بنقل tablespace metadata ونظرا لان حجمها صغير جدا مقارنة مع محتويات ال tablespace والتي قد تقدر بالجيجا بايت .

هناك بعض القيود عند استخدام هذه الطريقة :

1- كلا من قاعدتي البيانات المصدر والوجهة لا بد أن يكون لها نفس block size ولكي تعرف ذلك تستطيع الاستعلام عنها من ال data dictionary أو من ملف init.ora .

2- أن يكون لكلا قاعدتي البيانات نفس character set .

3- لا تستطيع نقل ال tablespace في حال كانت قاعدة البيانات الوجهة (destination)تحتوي على نفس اسم ال tablespace .

4- أن لا يحتوي ال tablespace المراد نقلة على replication objects or function-based indexes. .

5- المالك (owner & user) للأغراض الموجودة في ال tablespace المراد نقلة لا بد أن يكون موجود في قاعدة البيانات الوجهة (أي إذا لم يكن موجود لا بد أن تنشأه) مع ملاحظة أننا لن ننقل user metadata ما سننقله فقط tablespace Metadata .

خطوات لنقل ال tablespace من قاعدة بيانات إلى آخرى سهلة جدا ونلخصها بالتالي :

1- إختيار مجموعة ال tablespaces المراد نقلها بشرط ان لا تحتوي على أغراض مرتبطة ب tablespace غير موجود في المجموعة المختارة .

لشرح الفكرة : بفرض انك تريد نقل INVENTORY_DATA and INVENTORY_INDEXES tablespaces معا ولنفرض ان INVENTORY_INDEXES يحتوي على index مرتبط بالجدول employees والموجود على Employees tablespace في هذا السيناريو فأنك لن تستطيع نقل هذين الفضائين معا لان ال INVENTORY_INDEXES Tablespace يحتوي على index مرتبط بال Employees tablespace والذي لا نريد نقلة .

2- انشئ dictionary file باستخدام export utility .

3- انسخ الملف السابق مع datafiles المرتبطة بهذا بال tablespaces المراد نقلها إلى السيرفر الذي تتواجد علية قاعدة البيانات الوجهة .

4- قم باستيراد dictionary file إلى قاعدة البيانات الوجهة.

الطريقة العملية بالتفصيل :

الهدف : نقل ال tablespaces باستخدام export and import utility .

هذه الطريقة تستخدم لنقل ال tablespace من قاعدة بيانات إلى أخرى ولكن تستطيع محاكاتها على جهازك وان كنت تملك قاعدة بيانات واحدة فقط بفرض أن لديك tablespace مسمى RMAN فأنك تستطيع محاكة هذه الطريقة وذلك بتوليد Transport tablespace ومن ثم تقوم بحذف هذا ال tablespace ومن ثم استيراده مرة أخرى

لذا دعنا نبدأ :

قم بالدخول الى sqlplus بشرط ان يكون المستخدم sys ولدية الصلاحية SYSDBA

1- لمعرفة حالة RMAN tablepace قم بتنفيذ الاستعلام :

SELECT tablespace_name, status

FROM dba_tablespaces

WHERE tablespace_name='WALEED';

ستجد ان هذا ال tablespace في حالةonline وهو متاح للاستخدام العام .

2- قبل نقل ال tablespace لا بد ان تكون متأكدا من أن الأغراض التي يحتويها لا ترتبط ب tablespace آخر وذلك باستخدام الاجرائية الموجودة في الحزمة DBMS_TTS كما ستلاحظ بالاسفل :

EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('WALEED',true);

ستجد رسالة تقول لك : procedure successfully complete

بعد الانتهاء من تنفيذ الاجرائية إذا كان هناك أي مشكلة ستقوم بتنفيذ الاستعلام التالي :

SELECT *

FROM transport_set_violations;

إذا كانت النتيجة (no row selected) فأنت في safe side وشغلك إلى الآن صحيح وفي حال أعاد الاستعلام أي نتيجة فهذا يعني أن هناك أغراض من هذه ال tablespace مرتبطة ب tablespace آخر وبالتالي لن تستطيع نقلة .

كما لاحظتم المثال الذي شرحته سابقا والتي قلنا لن تستطيع نقل ال tablespaces , الأصح انك تستطيع نقلها ولكن بعد أن تقوم بعمل disable للقيود constraints وهذا سوف يؤثر على استقرار البيانات .

3- بعد التأكد من عدم ارتباط أي غرض من ال tablespace المراد نقلة مع أي أغراض من tablespace آخر لا بد ان تضع ال tablespace المراد نقلة في وضع readonly

Alter tablespace waleed read only;

بعد تنفيذ التعليمة السابقة وللتأكد من ال rman tablespace في وضع read only قم بتنفيذ الاستعلام التالي :

SELECT tablespace_name, status

FROM dba_tablespaces

WHERE tablespace_name='RMAN';

ولا بد أن تكون قيمة ال status هي read only .

4- قم بالخروج من sqlplus ومن ثم افتح command prompt فإذا كنت تستخدم ويندوز أكتب cmd في run

إذا ستقوم الآن بتوليد transportable tablespace export file بإستخدام هذا الأمر :

exp userid='sys/sys as sysdba' file=C:\app\tts_ora92_rman.dmp log=C:\app\tts_ora92_rman.log

transport_tablespace=y tablespaces=waleed

كما تلاحظ اننا استخدمنا exp ولا بد من ان ندخل اسم المستخدم وهو sys ولا ننسى كلمة السر ومن ثم نضع مسار للملف الذي سوف نقوم بتصديره وكما تلاحظ المسار وهو C:\079176\ وكذلك اسم الملف , ووضعنا ال log في نفس المسار .

لا بد أن تجد في السطر الأخير

Export terminated successfully without warnings.

بعد الانتهاء هذا الأمر سيتولد لنا هذا الملف tts_ora92_rman.dmp وفي حال كنا نريد نقلها الى سيرفر آخر ما علينا سوى نقل هذا الملف و datafiles الى السيرفر المتواجد عليها قاعدة البيانات الاخرى .

ولكن في حالتنا نحن نستخدم نفس ال database وبنفس الجهاز وبالتالي لا بد من حذف ال tablespace

باستخدام التعليمة التالية في sqlplus :

DROP TABLESPACE rman INCLUDING CONTENTS;

وللتأكد من أنه تم حذف ال tablespace بنجاح استخدم هذا الاستعلام :

SELECT tablespace_name, status

FROM dba_tablespaces

WHERE tablespace_name='RMAN';

والنتيجة رح تكون No Row selected

5- الان ستقوم باستيراد الملف الذي قمت بتصديره سابقا ولا تنسى ان تضع مسار ال datafiles

imp userid='sys/password as sysdba'

file=C:\079176\tts_ora92_rman.dmp

log=C:\079176\ts_ora92_rman_imp.log

transport_tablespace=y tablespaces=rman

datafiles=D:\oracle\oradata\ora92\rman01.dbf

بعد تنفيذ هذا الأمر في command prompt إذا وجدت هذه الرسالة في السطر الأخير

Import terminated successfully without warnings.

فهذا يعني أن عملية الاستيراد تمت بنجاح .

وللتاكد من انه تم استيراد الtablespace بشكل صحيح نفذ هذا الاستعلام

SELECT tablespace_name, status

FROM dba_tablespaces

WHERE tablespace_name='RMAN';

والنتيجة ستجد ان تم اعادة هذا ال tablespace وحالتة status هي read only .

الآن لوضع ال tablespaces في وضع read write قم بتنفيذ هذه التعليمة :

Alter tablespace rman read write;

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

كما لاحظت عزيزي القارئ أننا قمنا بمحاكاة العملية على جهاز واحد ولدينا database واحدة لذا تستطيع أن تطبقها في حال أردت نقل ال tablespace إلى قاعدة بيانات موجودة على سيرفر آخر ولكن لا تنسى أن تنقل الملف الذي قمت يتصديره وكذلك ال datafiles المرتبطة بال tablespace لا بد من نقلها الى السيرفر المتواجد عليه قاعدة البيانات الوجهة وتحديد مسار الdatafiles في الأمر imp .

ليست هناك تعليقات:

إرسال تعليق

Powered By Blogger