كيفية تحديد المخططات داخل ملف تصدير Oracle Data Pump

StackOverflow https://stackoverflow.com/questions/95578

  •  01-07-2019
  •  | 
  •  

سؤال

  • لدي ملف نسخة احتياطية لقاعدة بيانات 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
/

http://download.Oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/oow2011_dp_mastering.pdf

الخطوة 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 بإزالة الخطوط المكررة حتى ترى مخرجات أقل.

يعمل هذا بشكل جيد جدًا، حتى مع ملفات التفريغ الكبيرة، ويمكن تعديله لاستخدامه في البرنامج النصي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top