زمانی را تصور کنید که ساختار جدول حجیمی را با کمک بسته DBMS_REDEFINITION تغییر داده ایم. بعد از اتمام عملیات redefinition، به این نتیجه رسیده ایم که تغییر انجام شده، سبب کندی در عملیاتی که بر روی این جدول انجام می شوند، شده است. قصد داریم جدول را به ساختار پارتشن نشده قبل برگردانیم، راهکار چیست؟
یکی از بهبودهایی که در نسخه 12c به بسته DBMS_REDEFINITION اضافه شد، قابلیت rollback کردن عملیات انجام شده می باشد این کار به کمک پارامتر enable_rollback از بسته DBMS_REDEFINITION قابل انجام است.
در ادامه با کمک سناریوی زیر نحوه استفاده از این قابلیت را مشاهده خواهید کرد:
SQL> CREATE TABLE mytbl (id NUMBER(12) primary key,name varchar2(19),last_name varchar2(19),date_ date );
Table created
SQL> CREATE TABLE mytbl_temp (id NUMBER(12) primary key,name varchar2(19),last_name varchar2(19),date_ date )
2 PARTITION BY RANGE (date_)
3 INTERVAL(NUMTOYMINTERVAL(1, ‘MONTH’))
4 ( PARTITION p1 VALUES LESS THAN (TO_DATE(‘1-1-2000’, ‘DD-MM-YYYY’)));
Table created
SQL> EXEC DBMS_REDEFINITION.can_redef_table(‘USEF’, ‘MYTBL’);
PL/SQL procedure successfully completed
SQL> EXEC DBMS_REDEFINITION.start_redef_table(‘USEF’, ‘MYTBL’, ‘MYTBL_TEMP’,enable_rollback => TRUE);
PL/SQL procedure successfully completed
SQL> EXEC DBMS_REDEFINITION.sync_interim_table(‘USEF’, ‘MYTBL’, ‘MYTBL_TEMP’);
PL/SQL procedure successfully completed
SQL> EXEC DBMS_REDEFINITION.finish_redef_table(‘USEF’, ‘MYTBL’, ‘MYTBL_TEMP’);
PL/SQL procedure successfully completed
با اتمام عملیات، جدول به ساختار پارتیشن شده در خواهد آمد:
SQL> select p.PARTITIONED from user_tables p where table_name=’MYTBL’;
YES
فرض کنید اطلاعاتی به این جدول اضافه شده است:
SQL> insert into mytbl values(1,’vahid’,’usefzadeh’,TO_DATE(‘1-1-2001’, ‘DD-MM-YYYY’));
1 row inserted
SQL> insert into mytbl values(2,’vahid’,’usefzadeh’,TO_DATE(‘1-1-2005’, ‘DD-MM-YYYY’));
1 row inserted
SQL> commit;
Commit complete
به هر جهت به این نتیجه رسیدیم که این جدول با ساختار قبلی کارایی بیشتری را داشته است بنابرین می توانیم از قابلیت جدید ارائه شده در نسخه 12c استفاده کنیم:
SQL> EXEC DBMS_REDEFINITION.rollback(‘USEF’, ‘MYTBL’, ‘MYTBL_TEMP’);
PL/SQL procedure successfully completed
با اجرای دستور زیر، خواهیم دید که جدول از ساختار پارتیشن خارج شده است:
SQL> select p.PARTITIONED from user_tables p where table_name=’MYTBL’;
PARTITIONED
———–
NO
SQL> select count(*) from MYTBL;
COUNT(*)
———-
2
Comment (1)