دیتابیس اوراکل

دیتابیس اوراکل
طبقه بندی موضوعی

۸ مطلب با موضوع «DataPump» ثبت شده است

ORA-00600: internal error code, arguments: [6965]

موقع ایمپورت یک جدول در دیتابیس (ورژن 19.10) که data type 2 تا از ستونهای آنها از نوع LONG بود با خطای زیر مواجه شدم:

ORA-31693: Table data object "RA"."TAB1" failed to load/unload and is being skipped due to error:

ORA-02354: error in exporting/importing data

ORA-39776: fatal Direct Path API error loading table "RA"."TAB1"

ORA-00600: internal error code, arguments: [6965], [19], [21], [], [], [], [], [], []

 

که طبق داکیومنت اوراکل (Document 2691467.1) وقتی tablespace را از حالت compress خارج کردم مشکل حل شد.

OLTP Table Compression is NOT supported for use with tables that have more than 255 columns or that have LONG data types.

 

ولی راه حل اصلی آن این است که ستونهای از نوع LONG به LOB تبدیل شوند.

طبق داکیومنت زیر، LONG فقط برای backward compatibility پشتیبانی میشود و بهتر است ستونهای از نوع LONG به LOB تبدیل شوند.

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Data-Types.html#GUID-F6309DF8-162F-48A4-9454-FEE59EC6644F

EXPDP/IMPDP Of Partitioned Table

در مثال زیر از 2 پارتیشن جدول TEST1.TAB1 اکسپورت می­گیریم.

expdp SYSTEM

tables=TEST1.TAB1:P201201, TEST1.TAB1:P201202

dumpfile=EXP_TEST1_TAB1_%U.dmp

logfile=EXP_TEST1_TAB1.log

parallel=10

directory=DATA_PUMP_DIR

 

در مرحله بعد، پارتیشن هایی را که در مرحله قبل از آنها اکسپورت گرفتیم، در یک اسیکمای جدید با نام TEST2  ایمپورت میکنیم.

impdp SYSTEM

remap_schema=TEST1:TEST2

remap_tablespace=TBS_TEST1:TBS_TEST2

dumpfile=EXP_TEST1_TAB1_%U.dmp

logfile=IMP_TEST1_TAB1.log

directory=DATA_PUMP_DIR

transform=oid:n

parallel=10

exclude=STATISTICS,INDEX,CONSTRAINT,GRANT 

 

اگر از قبل یک اکسپورت full از جدول وجود دارد و در حال حاضر فقط به پارتیشنهای خاصی از آن جدول نیاز دارید، میتوانید ایمپورت را به صورت زیر انجام دهید.

impdp SYSTEM

remap_schema=TEST1:TEST2

tables=TEST1.TAB1:P201201,TEST1.TAB1:P201202

dumpfile=EXP_FULL_TEST1_%U.dmp

logfile=IMP_TEST1_TAB1.log

directory=DATA_PUMP_DIR

transform=oid:n

parallel=10

exclude=STATISTICS,INDEX,CONSTRAINT,GRANT

remap_tablespace=TBS_TEST1:TBS_TEST2

 

اگر میخواهید جدول را با یک نام جدید ایجاد کنید، میتوانید ایمپورت را به صورت زیر انجام دهید.

impdp SYSTEM

remap_schema=TEST1:TEST2

tables=TEST1.TAB1:P201201,TEST1.TAB1:P201202

remap_table=TEST1.TAB1:TAB1_NEW

dumpfile=EXP_FULL_TEST1_%U.dmp

logfile=IMP_TEST1_TAB1.log

directory=DATA_PUMP_DIR

transform=oid:n

parallel=10

exclude=STATISTICS,INDEX,CONSTRAINT,GRANT 

remap_tablespace=TBS_TEST1:TBS_TEST2

 

ORA-07445: exception encountered: core dump [lmmstrmlrg()+57]

DB Version:

19.10.0.0

 

Command:

impdp  \'/ as sysdba\' tables=USR.TEST1 directory=DIR1 dumpfile=expdp_2022-04-12.dmp logfile=impdp_2022-04-12.log encryption_password=password

 

Error:

ORA-07445: exception encountered: core dump [lmmstrmlrg()+57] [SIGSEGV] [ADDR:0x0] [PC:0x40E9C49] [Address not mapped to object] []

 

Cause:

Data Pump export is run using the following parameters, or Data Pump import of a file created with the following parameters is done:

     - encryption_mode

     - encryption_password

     - encryption_algorithm

 

Solution:

Upgrade to 19.14.0.0

 

Document:

Doc ID 32442404.8

 

اکسپورت/ایمپورت جداول دارای پارتیشن

در مثال زیر از 2 پارتیشن جدول  TEST1.MESSAGE اکسپورت گرفته شده است.

 

expdp system tables=TEST1.MESSAGE:P201201,TEST1.MESSAGE:P201202 dumpfile=EXP_TEST1_MESSAGE_%U.dmp logfile=EXP_TEST1_MESSAGE.log directory=DATA_PUMP_DIR

 

در مرحله بعد، پارتیشن هایی را که در مرحله قبل از آنها اکسپورت گرفتیم، در یک اسیکمای جدید با نام TEST2 ایمپورت میکنیم.

 

impdp \'/ as sysdba\' remap_schema=TEST1:TEST2 dumpfile=EXP_TEST1_MESSAGE_%U.dmp logfile=IMP_TEST1_MESSAGE.log directory=DATA_PUMP_DIR transform=oid:n parallel=10 exclude=STATISTICS,INDEX,CONSTRAINT,GRANT remap_tablespace=TBS_TEST1:TBS_TEST2

 

اگر از قبل یک اکسپورت full از جدول وجود دارد و در حال حاضر فقط به پارتیشنهای خاصی از آن جدول نیاز دارید، میتوانید ایمپورت را به صورت زیر انجام دهید.

 

impdp \'/ as sysdba\'remap_schema=TEST1:TEST2 tables=TEST1.MESSAGE:P201201,TEST1.MESSAGE:P201202 dumpfile=EXP_FULL_TEST1_%U.dmp logfile=IMP_TEST1_MESSAGE.log directory=DATA_PUMP_DIR transform=oid:n parallel=10 exclude=STATISTICS,INDEX,CONSTRAINT,GRANT remap_tablespace=TBS_TEST1:TBS_TEST2

 

اگر میخواهید جدول را با یک نام جدید ایجادکنید، میتوانید ایمپورت را به صورت زیر انجام دهید.

 

impdp \'/ as sysdba\'remap_schema=TEST1:TEST2 tables=TEST1.MESSAGE:P201201,TEST1.MESSAGE:P201202 remap_table=TEST1.MESSAGE:MESSAGE_NEW dumpfile=EXP_FULL_TEST1_%U.dmp logfile=IMP_TEST1_MESSAGE.log  directory=DATA_PUMP_DIR transform=oid:n parallel=10 exclude=STATISTICS,INDEX,CONSTRAINT,GRANT remap_tablespace=TBS_TEST1:TBS_TEST2

 

 

حل خطاهای ORA-31693,ORA-02354,ORA-01555 موقع گرفتن Full Export از دیتابیس

یکی از دیتابیسها (ورژن 12.2.0.1) موقع Full EXPDP با خطای زیر مواجه میشد:

 

ORA-31693: Table data object "USER1"."BC_DRAFT" failed to load/unload and is being skipped due to error:

ORA-02354: error in exporting/importing data

ORA-01555: snapshot too old: rollback segment number 17 with name "_SYSSMU17_1955885910$" too small

 

برای حل این مشکل کارهای زیر انجام گرفت: 

 

  • پیداکردن مقدار فعلی پارامتر undo_retention

SQL> show parameter undo

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_retention                       integer     4107

 

  • پیدا کردن زمان اجرای طولانی ترین کوئری در دیتابیس

SQL>  select max(maxquerylen) from v$undostat;

 

MAX(MAXQUERYLEN)

----------------

           18695

 

  • تغییر دادن پارامتر undo_retention بر اساس زمان اجرای طولانی ترین کوئری در دیتابیس

SQL> alter system set undo_retention=20000 scope=both;

 

  • چون این جدول که با خطا مواجه شده، دارای ستونهای از نوع lob هم هست، مقدار retention آن ستونها نیز باید افزایش پیدا کند.

 

select column_name,retention

  from dba_lobs

 where owner='USER1'

   and table_name='BC_DRAFT';

 

select 'alter table PARGAR.BC_DRAFT_BODY modify lob('||column_name||') (pctversion 5);'

  from dba_lobs

 where owner='USER1'

   and table_name='BC_DRAFT';

  

select 'alter table PARGAR.BC_DRAFT_BODY modify lob('||column_name||') (retention);'

  from dba_lobs

 where owner='USER1'

   and table_name='BC_DRAFT';

 

تبدیل Dump File به دستورات DDL

برای تبدیل یک dumpfile به دستورات DDL میتوانیم از  sqlfile در import استفاده کنیم.


impdp system@rdb_pdb1 directory=datapump_dir dumpfile=test1.dmp logfile=test1.log remap_schema=test1:testddl sqlfile=test.sql


خروجی آن به شکل زیر است:


خروحی ddl



پارامتر LOGTIME در DataPump 12C

در نسخه 12CR1  یک پارامتر جدیدی بنام LOGTIME  به DataPump اضافه شده است، که باعث میشود پیغام هایی که در طول عملیات export و import می آیند به همراه یک timestamp نمایش داده شوند.                   

کاربرد :

شما میتوانید با استفاده از این timestamp متوجه شوید که زمان سپری شده بین فازهای مختلف عملیات DataPump چقدر است . چنین اطلاعاتی میتواند در تشخیص مشکلات مربوط به Performance و همچنین تخمین زمان عملیات های مشابه در آینده مفید واقع شود.


مقادیری که میتوان به این پارامتر اختصاص داد به شرح زیر میباشد :

-          NONE : در طول عملیات export/import یا در logfile هیچ timestamp نمایش داده نشود ( که به صورت پیش فرض این گزینه فعال میباشد)

-          timestamp : STATUS فقط در هنگام اجرای عملیات export/import نمایش داده شود.

-          timestamp : LOGFILE فقط در logfile نمایش داده شود.

-          ALL : هم در logfile ، هم هنگام اجرای عملیات export/import نمایش داده شود.   

 

مثال :

expdp  scott/tiger  directory=DATA_PUMP_DIR  dumpfile=SCOTT.dmp  logfile=SCOTT.log  LOGTIME=ALL

 

قسمتی از خروجی دستور بالا به صورت زیر است :

16-JUL-16 11:18:47.254: Starting "SCOTT"."SYS_EXPORT_SCHEMA_01":  scott/******** directory=DATA_PUMP_DIR dumpfile=SCOTT.dmp logfile=SCOTT.log LOGTIME=ALL

16-JUL-16 11:18:48.321: Estimate in progress using BLOCKS method...

16-JUL-16 11:18:53.041: Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA….

 

 

n        منابع 


1-https://docs.oracle.com/database/121/SUTIL/GUID-56B6B4EA-5A2B-45B8-9B41-8966378C2C3D.htm#SUTIL4281

2-https://oracle-base.com/articles/12c/data-pump-enhancements-12cr1

 

 

خطای ORA-31634 هنگام اجرای DataPump job

در دیتابیس اوراکل ، شما ممکن است هنگام اجرای (DataPump job (expdp or impdp  با خطاهای زیر مواجه شوید:


ORA-31634: job already exists

ORA-31664: unable to construct unique job name when defaulted

 

این خطا به دلایل زیر رخ میدهد :

-  در دستور  expdp/impdp از یک JOB_NAME مشخص استفاده نکرده باشید و datapump مجبور شود که از یک نام پیش فرض استفاده کند و آن نام به هر دلیلی از قبل وجود داشته باشد. 

-  یا اینکه چند datapump job را با هم به صورت همزمان اجرا کرده باشید و تعداد آن jobها بیشتر از 99 تا باشد ، در چنین حالتی datapump نمیتواند یک job جدید ایجاد کند.


در چنین حالتی برای رفع این مشکل یا باید از یک JOB_NAME مشخص در دستور expdp/impdp استفاده کنید:

expdp system/system SCHEMA=scott DIRECTORY=data_pump_dir DUMPFILE=exp_scott.dmp JOB_NAME=exp_jo

 

و یا اینکه JOBهای قبلی را که وضعبت آنها NOT RUNNING است و اصطلاحا به آنها orphaned datapump jobs گفته میشود را حذف نمایید، که برای اینکار باید مراحل زیر را طی کنید:

1)       شناسایی datapump jobهای موجود در دیتابیس که وضعیت آنها NOT RUNNING است.

 select owner_name, job_name, operation, job_mode, state,     attached_sessions

  from dba_datapump_jobs

 'where owner_name = '&SCHEMA

    'and state = 'NOT RUNNING

  ;order by 1, 2

بجای &SCHEMA باید نام اسکیمایی که expdp/impdp با آن انجام میشود نوشته شود.

 

2)       شناسایی جداول اصلی مرتبط  با آن jobها

  select o.status, o.object_id, o.object_type, o.owner||'.'||object_name "OWNER.OBJECT",o.created,j.state

   from dba_objects o, dba_datapump_jobs j

 where o.owner=j.owner_name

    and o.object_name=j.job_name

    'and o.owner='&SCHEMA

    'and j.state='NOT RUNNING

  ;order by 4,2

 

3)       پاک کردن جداولی که در مرحله 2 تولید شده اند. 

;<drop table <tablename

 

n        منابع 


1- http://oracledba-duniya.blogspot.com/2013/05/resolving-ora-31634-job-already.html 

2- Running DataPump Jobs Results In ORA-31634 ORA-31664 (Doc ID 138416)