وبلاگ امیررضا رستنده

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

وبلاگ امیررضا رستنده

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

  • ۰
  • ۰

سلام

میخواهیم یک جدول را از یک اسکیما به اسکیمای دیگر کپی کنیم. مثلاً فرض کنید که جدول source_tbl  را می خواهیم به جدول با نام target_tbl در اسکیمای دیگر منتقل کنیم. می دانیم که این کار به روش های متفاوتی قابل انجام است:

  • استفاده از دستور create table as select
  • استفاده از ابزار data pump
  • استفاده از قابلیت exchange

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

برای شروع کار ابتدا جدول مبدا (جدولی که می خواهیم اطلاعات آن را در جدول دیگر کپی کنیم) را می سازیم

create table source_tbl as select * from dba_objects;

اطلاعات بیشتری را درون این جدول می ریزیم:

insert into source_tbl select * from source_tbl;

insert into source_tbl select * from source_tbl;

insert into source_tbl select * from source_tbl;

insert into source_tbl select * from source_tbl;

insert into source_tbl select * from source_tbl;

commit;

select * from source_tbl;

 

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

create table temp_source_tbl partition by range (object_id)

(

    partition id_partition values less than (-1),

    partition source_tbl_partition values less than (maxvalue)

)

as

select * from source_tbl where rownum<=0;

 

select * from temp_source_tbl;

 

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

create table ara.target_tbl as select * from source_tbl where rownum<=0;

select * from ara.target_tbl;

 

 

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

توجه کنید که وقتی یک جدول معمولی می سازیم، اوراکل دو آیتم می سازد:

  1. آیتم Logical Object که به عنوان Object_ID مشخص می شود.
  2. آیتم Data Segment که به عنوان data_object_id مشخص می شود.

اما وقتی  جدول پارتیشن شده می سازیم یک logical object ساخته می شود و به تعداد پارتیشن ها data segment ساخته می شود و بخش logical object سگمنت فیزیکی ندارد.

اوراکل دستور exchange را به منظور تخصیص یک data segment به logical object را قرار داده است.(به شرط انطباق)

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

دستور زیر را برای مشاهده وضعیت logical object و data segment اشیا در هر مرحله از کار اجرا می کنیم تا متوجه اجرای دستور شویم:

select object_name,SUBOBJECT_NAME,OBJECT_TYPE,object_id,data_object_id from dba_objects

where object_name in ('TEMP_SOURCE_TBL','SOURCE_TBL','TARGET_TBL')

order by 1;

 

--first exchange

alter table temp_source_tbl exchange partition id_partition with table source_tbl including indexes without validation;

select * from temp_source_tbl;

 

select object_name,SUBOBJECT_NAME,OBJECT_TYPE,object_id,data_object_id from dba_objects

where object_name in ('TEMP_SOURCE_TBL','SOURCE_TBL','TARGET_TBL')

order by 1;

 

--second exchange

alter table temp_source_tbl exchange partition id_partition with table ara.target_tbl including indexes without validation;

 

select * from ara.target_tbl;

select * from temp_source_tbl;

select * from source_tbl;

 

select object_name,SUBOBJECT_NAME,OBJECT_TYPE,object_id,data_object_id from dba_objects

where object_name in ('TEMP_SOURCE_TBL','SOURCE_TBL','TARGET_TBL')

order by 1;

در شکل زیر روال کار مشخص شده است. به جابجایی مقادیر data segment در مراحل مختلف توجه کنید:

move_tables

 

در پایان کار می توانیم جدول واسط (جدول پارتیشن شده) را حذف کنیم:

drop table temp_source_tbl purge;

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

 

موفق باشید

  • ۹۸/۰۶/۰۳
  • امیررضا رستنده

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی