كيفية تحديد المخططات داخل ملف تصدير Oracle Data Pump
سؤال
- لدي ملف نسخة احتياطية لقاعدة بيانات Oracle (.dmp) تم إنشاؤه باستخدام expdp.
- كان الملف .dmp عبارة عن تصدير لقاعدة بيانات بأكملها.
- أحتاج إلى استعادة أحد المخططات من داخل ملف التفريغ هذا.
- لا أعرف أسماء المخططات الموجودة داخل ملف التفريغ هذا.
- لاستخدام impdp لاستيراد البيانات، أحتاج إلى اسم المخطط ليتم تحميله.
لذا، أحتاج إلى فحص ملف .dmp وسرد كافة المخططات الموجودة فيه، كيف أفعل ذلك؟
التحديث (2008-09-18 13:02) - معلومات أكثر تفصيلاً:
أمر impdp الذي أستخدمه حاليًا هو:
impdp user/password@database directory=DPUMP_DIR
dumpfile=EXPORT.DMP logfile=IMPORT.LOG
وتم تكوين DPUMP_DIR بشكل صحيح.
SQL> SELECT directory_path
2 FROM dba_directories
3 WHERE directory_name = 'DPUMP_DIR';
DIRECTORY_PATH
-------------------------
D:\directory_path\dpump_dir\
ونعم، الملف EXPORT.DMP موجود في هذا المجلد.
رسالة الخطأ التي تظهر لي عند تشغيل أمر impdp هي:
Connected to: Oracle Database 10g Enterprise Edition ...
ORA-31655: no data or metadata objects selected for job
ORA-39154: Objects from foreign schemas have been removed from import
رسالة الخطأ هذه متوقعة في الغالب.أحتاج إلى أمر impdp ليكون:
impdp user/password@database directory=DPUMP_DIR dumpfile=EXPORT.DMP
SCHEMAS=SOURCE_SCHEMA REMAP_SCHEMA=SOURCE_SCHEMA:MY_SCHEMA
ولكن للقيام بذلك، أنا بحاجة إلى المخطط المصدر.
المحلول
إذا قمت بفتح ملف DMP باستخدام محرر يمكنه التعامل مع الملفات الكبيرة، فقد تتمكن من تحديد المناطق التي تم ذكر أسماء المخطط فيها.فقط تأكد من عدم تغيير أي شيء.سيكون من الأفضل لو قمت بفتح نسخة من التفريغ الأصلي.
نصائح أخرى
impdp
يصدر DDL لـ a dmp
النسخ الاحتياطي إلى ملف إذا كنت تستخدم SQLFILE
معامل.على سبيل المثال، ضع هذا في ملف نصي
impdp '/ as sysdba' dumpfile=<your .dmp file> logfile=import_log.txt sqlfile=ddl_dump.txt
ثم تحقق ddl_dump.txt
لمساحات الجداول والمستخدمين والمخططات في النسخة الاحتياطية.
وفقًا للوثائق، فإن هذا لا يؤدي فعليًا إلى تعديل قاعدة البيانات:
لم يتم تنفيذ SQL فعليًا، ويظل النظام الهدف دون تغيير.
التحديث (2008-09-19 10:05) - الحل:
بلدي الحل: الهندسة الاجتماعية، لقد بحثت بجد ووجدت شخصًا يعرف اسم المخطط.
حل تقني: البحث في ملف .dmp فعل تسفر عن اسم المخطط.
بمجرد أن عرفت اسم المخطط، بحثت في ملف التفريغ وتعرفت على مكان العثور عليه.
الأماكن التي تم رؤية اسم المخططات فيها، في ملف .dmp:
<OWNER_NAME>SOURCE_SCHEMA</OWNER_NAME>
وقد شوهد هذا قبل اسم/تعريف كل جدول.SCHEMA_LIST 'SOURCE_SCHEMA'
وقد شوهد هذا بالقرب من نهاية .dmp.
ومن المثير للاهتمام، حول SCHEMA_LIST 'SOURCE_SCHEMA'
القسم، كان يحتوي أيضًا على سطر الأوامر المستخدم لإنشاء التفريغ، والأدلة المستخدمة، والملفات الاسمية المستخدمة، وإصدار Windows الذي تم تشغيله عليه، وإعدادات جلسة التصدير (اللغة، وتنسيقات التاريخ).
وهكذا تم حل المشكلة :)
بافتراض أنه ليس لديك ملف السجل من مهمة expdp التي أنشأت الملف في المقام الأول، فمن المحتمل أن يكون الخيار الأسهل هو استخدام معلمة SQLFILE لجعل impdp يقوم بإنشاء ملف DDL (استنادًا إلى الاستيراد الكامل).ثم يمكنك الحصول على أسماء المخططات من هذا الملف.ليس مثاليًا، بالطبع، نظرًا لأنه يتعين على impdp قراءة ملف التفريغ بالكامل لاستخراج DDL ثم مرة أخرى للوصول إلى المخطط الذي يهمك، ويجب عليك إجراء القليل من الملف النصي للبحث عن عبارات CREATE USER المتنوعة ، ولكن يجب أن يكون قابلاً للتنفيذ.
عند تشغيل أمر impdp لإنتاج ملف sqlf، ستحتاج إلى تشغيله كمستخدم لديه دور DATAPUMP_IMP_FULL_DATABASE.
أو...قم بتشغيله كمستخدم ذي امتيازات منخفضة واستخدم الخيار MASTER_ONLY=YES، ثم افحص الجدول الرئيسي.على سبيل المثال
select value_t
from SYS_IMPORT_TABLE_01
where name = 'CLIENT_COMMAND'
and process_order = -59;
col object_name for a30
col processing_status head STATUS for a6
col processing_state head STATE for a5
select distinct
object_schema,
object_name,
object_type,
object_tablespace,
process_order,
duplicate,
processing_status,
processing_state
from sys_import_table_01
where process_order > 0
and object_name is not null
order by object_schema, object_name
/
الخطوة 1:هنا مثال واحد بسيط.يجب عليك إنشاء ملف SQL من ملف التفريغ باستخدام SQLFILE
خيار.
الخطوة 2:جريب ل CREATE USER
في ملف SQL الذي تم إنشاؤه (هنا Tables.sql)
مثال هنا:
$ impdp directory=exp_dir dumpfile=exp_user1_all_tab.dmp logfile=imp_exp_user1_tab sqlfile=tables.sql
يستورد:الإصدار 11.2.0.3.0 - الإنتاج يوم الجمعة 26 أبريل 08:29:06 2013
حقوق الطبع والنشر (ج) لعام 1982، 2011 محفوظة لشركة Oracle و/أو الشركات التابعة لها.كل الحقوق محفوظة.
اسم المستخدم:/ كما سيسدبا
اكتملت معالجة نوع الكائن SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA المهمة "SYS"."SYS_SQL_FILE_FULL_01" بنجاح في الساعة 08:29:12
$ grep "CREATE USER" tables.sql
إنشاء مستخدم "USER1" محدد حسب القيم 'S:270D559F9B97C05EA50F78507CD6EAC6AD63969E5E;BBE7786A5F9103'
تم شرح الكثير من خيارات مضخة البيانات هنا http://www.acehints.com/p/site-map.html
الحل الخاص بي (مشابه لإجابة KyleLanser) (في صندوق Unix):
strings dumpfile.dmp | grep SCHEMA_LIST
تحتاج إلى البحث عن OWNER_NAME.
cat -v dumpfile.dmp | grep -o '<OWNER_NAME>.*</OWNER_NAME>' | uniq -u
cat -v يحول ملف التفريغ إلى نص مرئي.
يُظهر grep -o المطابقة فقط لذلك لا نرى طوابير طويلة حقًا
يقوم uniq -u بإزالة الخطوط المكررة حتى ترى مخرجات أقل.
يعمل هذا بشكل جيد جدًا، حتى مع ملفات التفريغ الكبيرة، ويمكن تعديله لاستخدامه في البرنامج النصي.