پارامترهای INCLUDE، EXCLUDE و QUERY در expdp/impdp

نویسنده مطلب: مهندس ناصر کچویی

در زمان استفاده از Data Pump، می توان در چهار سطح FULL/TABLESPACE/SCHEMA/TABLES عملیات export/import را انجام داد در مواردی ممکن است نیاز باشد تا objectهای خاصی را مستثنی کرد و یا صرفا بعضی از این objectها را در این عملیات شرکت داد، در این صورت می توان از سه پارامتر INCLUDE، EXCLUDE و QUERY استفاده کرد که در ادامه به بررسی آنها می پردازیم.

پارامتر EXCLUDE و INCLUDE

پارامتر Include تعیین می کند که عملیات export/import چه آبجکتهایی را شامل شوند و پارامتر exclude هم مشخص می کند چه objectهایی در این عملیات استثناء شوند.

شکل کلی این دو پارامتر:

INCLUDE = object_type[:name_clause] [, …]

EXCLUDE=object_type[:name_clause] [, …]

object_type : نوع ابجکت را مشخص می کند مانند table , index , schema , procedure و … .

مقادیر قابل قبول برای object_type را می توان در ویوهای database_export_objects و schema_export_objects و یا table_export_objects  (ستون object_path) مشاهده کرد.

name_clause : عبارت شرطی sql ای است که نمونه های معینی از آن نوع آبجکت را مشخص می کند و با کاراکتر : جدا و بین کاراکتر ” محصور می شود.

زمانی که یک نوع آبجکت در پارامتر include/exclude تعیین می شود، تمام آبجکتهای وابسته ی آن را نیز شامل خواهد شد. 

برای تعیین آبجکتهای مختلف در پارامتر include/exclude، می توان آنها را بصورت جداگانه در چند خط تنظیم کرد و یا بین هرکدام از آبجکتها کاراکتر ( , ) قرار داد.

مثال زیر نمونه ای از شیوه تعیین مقدار پارامتر include/exclude را نشان می دهد:

INCLUDE=TABLE:”IN (‘EMPLOYEES’, ‘DEPARTMENTS’)”

INCLUDE= FUNCTION

EXCLUDE=PROCEDURE , INDEX:”LIKE ‘EMP%'”

نحوه تنظیم شرط(name_clause) : اگر پارامترهای include/exclude در خط فرمان تنظیم شوند(نه در فایل پارامتر) نیاز است قبل از کاراکترهای ‘  “  ) ( از بک اسلش (\) استفاده شود تا کارکتر مورد نظر بدرستی توسط سیستم عامل تفسیر شود.

البته این موضوع در سیستم عامل های مختلف کمی متفاوت است. مثلا در خط فرمان ویندوز، قبل از کاراکتر ‘ و در خط فرمان لینوکس قبل از کاراکترهای ‘  “  ) ( ، می بایست از بک اسلش (\) استفاده کرد. به همین دلیل توصیه می شود که پارامترهای include/exclude را در parfile قرار دهید تا نیاز به استفاده از \ نباشد. این امر غیر از راحتی استفاده، به خوانایی بیشتر عبارت هم کمک می کند.

در زیر نمونه هایی از پارامتر include/exclude را در حالت های مختلف می بینید.

مثال 1: ایندکس هایی که با نام IND_COP شروع می شوند، در عملیات شرکت داده می شوند و یا مستثنا خواهند شد:

In widows command line : INCLUDE=index:”LIKE \’IND_COP%\’ “

In linux command line : INCLUDE=index:\”LIKE \’IND_COP%\’ \”

In parameter file : INCLUDE=index:”LIKE ‘IND_COP%’ “

مثال 2: جداول ES , ES2 , ES3 مستثنی خواهند شد:

In windows command line : EXCLUDE=table:”in(\’ES\’,\’ES2\’,\’ES3\’)”

In linux command line : EXCLUDE=table:\”in\(\’ES\’,\’ES2\’,\’ES3\’\)\”

In parameter file : EXCLUDE=table:”in(‘ES’,’ES2′,’ES3’)”

نکته : constraint هایی که بصورت not null هستند و یا وجود آنها در ایجاد و بارگذاری جداول الزامی است (مانند primary key)، هیچگاه در پارامتر exclude استثناء نمی شوند.

مثلاexclude=constraint  تمام constraint ها ، غیر از not null ها و primary key ها و آنهایی که در ایجاد جداول الزامی هستند را مستثنی می کند.

در ادامه مثالهای کاربردی از پارامتر های include/exclude را ملاحظه می کنید.

مثال 1: پروسیجرهایی که با عبارت _CUST شروع می شوند.

In parameter file:

directory=data
logfile=t1.log
dumpfile=t1.dmp
INCLUDE=PROCEDURE:”LIKE ‘CUST_%'”

مثال 2: اجرای عملیات در سطح کل دیتابیس بجز اسکیمای scott

in parameter file:

dumpfile=full_database.dmp
full=yes
EXCLUDE=schema:”in(‘SCOTT’)”

توجه داشته باشید عبارت زیر اشتباه است:

EXCLUDE=schema:”=’SCOTT'”

LRM-00116: syntax error at ‘schema:’ following ‘=’

مثال 3: در این مثال، جداول emp و dept استثناء شده است.

]$ expdp hr  directory=pumpdir  dumpfile=fulldata.dmp 

exclude=table:\”in\(\’EMP\’,\’DEPT\’\)\”

عبارت exclude در پارامتر فایل به شکل زیر تنظیم می شود:

exclude=table:”in(‘EMP’,’DEPT’)”

مثال 4: استفاده از عبارت select در پارامتر های include/exclude

]$ expdp naser DIRECTORY=dmp_dir SCHEMAS=naser DUMPFILE=tables_data.dmp

CONTENT=data_only  INCLUDE=table:\”in\ (select tbl_name from tables_list\)\”

پارامتر QUERY

QUERY = [schema.][table_name:] query_clause

این پارامتر جهت تعیین شرط برروی رکورد های جدول مورد استفاده قرار می گیرد.

query_clause می تواند هر عبارت sql ی را شامل شود(حتی عبارت order by که موجب می شود داده ها در بانک مقصد بصورت سورت شده منتقل شوند) و همانند عبارت شرطی در پارامترهای include/exclude ، بین دو کاراکتر “ محصور می شود.

مثال:

QUERY=ali.tbl_person:”WHERE  last_name  like  ‘%NASER%’”

QUERY=employees:”WHERE  department_id>10  AND  salary>10000″

اگر نام اسکیما یا جدول مشخص نشود، عبارت شرطی بر روی تمام جداول اعمال می شود البته در اینصورت باید عبارت شرطی در مورد تمام جداول صدق کند.

در مواقعی که نیاز است برای جدول تعیین شده در پارامتر query از alias  استفاده کنیم، alias آن جدول با علامت $ku مشخص می شود.

مثال:در مثال زیر $ku الیاس جدول sales و کاراکتر c آلیاس جدول customers می باشد:

QUERY=sales:”WHERE EXISTS (SELECT cust_id FROM customers c

   WHERE ku$.cust_credit_limit > 10000 AND ku$.cust_id = c.cust_id)”

در مثال بالا اگر از الیاس $ku استفاده نشود بدلیل همنامی ستون cust_id در هر دو جدول ، تمامی رکوردها انتخاب می شوند. مانند مثال زیر:

QUERY=sales:”where exists (select cust_id from customers c

   where cust_credit_limit > 10000 and cust_id = c.cust_id)”

نکته : اگر از پارامتر network_link در expdp/impdp استفاده کرده باشیم، در پارامتر query در بخش عبارت شرطی نیز باید نام dblink آورده شود، در غیر اینصورت عبارت شرطی برروی آبجکتهای local اعمال می شود و با خطا مواجه خواهیم شد.

مثال:

NETWORK_LINK=yazd_dblink

QUERY=hr.employees:”where last_name in(select last_name from hr.employees@yazd_dblink)”

نکته 1 : در نظر داشته باشید که پارامتر query با پارامترهای زیر قابل استفاده نمی باشد:

در زمان export :

  • content=metadata_only
  • estimate_only
  • transport_tablespaces

در زمان import :

  • content=metadata_only
  • sqlfile
  • transport_tablespaces

نکته 2 : همانند پارامترهای include/exclude ، بدلیل استفاده از کاراکترهایی نظیر ) ( < > ‘ “ و غیره در پارامتر query، توصیه می شود این پارامتر در parfile تنظیم شود.

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.