Oracle® 10g থেকে শুরু করে, আপনি DBMS_REDEFINITION প্যাকেজ ব্যবহার করে কোনো অ্যাপ্লিকেশন ডাউনটাইম ছাড়া টেবিল পার্টিশন করতে পারেন অনলাইনে।
নিচের ধাপগুলো অনুসরণ করে একটি নন-পার্টিশন টেবিলকে পার্টিশন টেবিলে পরিবর্তন করুন DBMS_REDEFINITION ব্যবহার করে। এই উদাহরণে নন-পার্টিশন টেবিল TABLEA-কে রেঞ্জ ইন্টারভাল পার্টিশন টেবিলে বদলানো হয়েছে।
ধাপ ১: আনপার্টিশন টেবিলের ব্যাকআপ নিন
টেবিল TABLEA-এর ফুল এক্সপোর্ট ব্যাকআপ তৈরি করতে নিচের কোড চালান।
expdp \"/ as sysdba\" directory=EXPDP_DIR dumpfile=tableA_UNPAR.dmp logfile=tableA_UNPAR.log TABLES=TEST.TABLEA
expdp \"/ as sysdba\" directory=EXPDP_DIR dumpfile=tableA_metaunpar.dmp logfile=tableA_metaunpar.log TABLES=TEST.TABLEA content=metadata_only
ধাপ ২: ডাটাবেস অবজেক্ট পরীক্ষা করুন
টেবিল ড্রপ করলে নিচের ডিপেন্ডেন্ট (D) ডাটাবেস অবজেক্টগুলো ড্রপ হয়ে যেতে পারে:
CONSTRAINT (Constraints) D
INDEX (Indexes) D
MATERIALIZED_VIEW_LOG (Materialized view logs) D
OBJECT_GRANT (Object grants) D
TRIGGER (Triggers) D
নিচের SQL কমান্ডগুলো চালান এবং আউটপুট একটি স্পুল ফাইলে সেভ করুন, যেমন cons_trig_indx.txt:
set LINESIZE 500
set PAGESIZE 1000
SQL> spool cons_trig_indx.txt
SQL> select name, type, owner from all_dependencies where referenced_owner = 'TEST' and referenced_name = 'TABLEA';
NAME TYPE OWNER
-------------- -------------- -------
PROC_TABLEA PROCEDURE TEST
TABLEA_TRIGG TRIGGER TEST
PKG_TABLEA PACKAGE BODY TEST
SQL> select OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, STATUS, TABLESPACE_NAME from dba_indexes where TABLE_OWNER='TEST' and TABLE_NAME='TABLEA';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME STATUS TABLESPACE_NAME
---------------------------------------------------------------------------
TEST TABLEA_IDX_ID01 TEST TABLEA VALID TABLEA_TBL
TEST TABLEA_IDX_ID04 TEST TABLEA VALID TABLEA_TBL
TEST TABLEA_IDX_PK TEST TABLEA VALID TABLEA_TBL
SQL> select STATUS, OBJECT_TYPE, OBJECT_NAME from dba_objects where OWNER='TEST' and OBJECT_TYPE = 'TRIGGER' and STATUS='INVALID';
no rows selected
SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE from dba_constraints where TABLE_NAME='TABLEA' and owner='TEST';
SQL> spool off
CONSTRAINT_NAME C
------------------ -----
SYS_C002004601 C
SYS_C002004602 C
SYS_C002004603 C
IDX_PK P
FK01 R
ধাপ ৩: TABLEA-এর DDL ক্যাপচার করুন
পার্টিশন টেবিল তৈরি করার আগে TABLEA-এর ডেটা ডেফিনিশন ল্যাঙ্গুয়েজ (DDL) ক্যাপচার করতে এবং স্পুল ফাইল DEF_TABLEA.sql-এ স্ক্রিপ্ট সেভ করতে নিচের কমান্ডগুলো চালান:
set echo off
set feedback off
set linesize 160
set long 2000000
set pagesize 0
set trims on
column txt format a150 word_wrapped
SQL> spool DEF_TABLEA.sql
SQL> select DBMS_METADATA.GET_DDL('TABLE','TABLEA','TEST') txt FROM dual;
SQL> spool off
ধাপ ৪: DDL স্ক্রিপ্ট কপি করুন
ধাপ ৩-এ তৈরি করা DDL স্ক্রিপ্ট কপি করতে নিচের কমান্ড চালান।
cp DEF_TABLEA.sql DEF_TABLEA_PAR.sql
ধাপ ৫: নন-পার্টিশন টেবিলের তারিখগুলো পর্যালোচনা করুন
TABLEA-এ তারিখ খুঁজে বের করতে নিচের কমান্ড চালান:
SQL> select * from (select DT from TEST.TABLEA where rownum <15 order by DT DESC);
ধাপ ৬: DEF_TABLEA_PAR.sql ফাইল এডিট করুন
DEF_TABLEA_PAR.sql এডিট করে নিচের পরিবর্তনগুলো আনুন:
TABLEA-এর সকল উদাহরণকে TABLEA_PAR-এ পরিবর্তন করুন।
সকল কনস্ট্রেইন্ট ডিলিট করুন, যেমন NOT NULL বা অন্য কোনো কনস্ট্রেইন্ট।
টেবিলটি নতুন টেবিলস্পেসে তৈরি হোক তা নিশ্চিত করতে নিচের কমান্ড যোগ করুন:
TABLESPACE "TABLEA_TBL_PAR" LOGGINGধাপ ৫-এ চিহ্নিত তারিখের উপর ভিত্তি করে পার্টিশন ডেফিনিশন যোগ করতে নিচের কমান্ডগুলো যোগ করুন:
PARTITION BY RANGE(DT) interval (numtoyminterval(1,'MONTH')) (partition TABLEA_2004 values less than (to_date('01/01/2005','DD/MM/YYYY')), partition TABLEA_2005 values less than (to_date('01/01/2006','DD/MM/YYYY')));
DEF_TABLEA_PAR.sql ফাইলটি এখন নিচের উদাহরণের মতো দেখাবে:
CREATE TABLE "TEST"."TABLEA_PAR" (
"ID" NUMBER(6,0),
"CEID" NUMBER(6,0),
"DT" DATE,
"AMT" NUMBER(14,4),
"RET" NUMBER(14,4),
"CNT" NUMBER(4,0),
"VCNT" NUMBER(4,0),
"EXEDT" DATE,
"LASTUPDBY" VARCHAR2(15),
"VENUM" NUMBER(6,0),
"LASTUPDDT" TIMESTAMP (6))
TABLESPACE "TABLEA_TBL_PAR" LOGGING
PARTITION BY RANGE(DT) interval (numtoyminterval(1,'MONTH'))
(partition TABLEA_2004 values less than (to_date('01/01/2005','DD/MM/YYYY')),
partition TABLEA_2005 values less than (to_date('01/01/2006','DD/MM/YYYY')));
ধাপ ৭: পার্টিশন টেবিল তৈরি করুন
DEF_TABLEA_PAR.sql স্ক্রিপ্ট চালিয়ে পার্টিশন টেবিল তৈরি করুন:
SQL> spool DEF_TABLEA_PAR.outp.txt
SQL> @DEF_TABLEA_PAR.sql
Table Created.
SQL> spool off
ধাপ ৮: পার্টিশন টেবিল যাচাই করুন
পার্টিশন টেবিল যাচাই করতে এবং ডিফাইন করা পার্টিশনগুলো রিটার্ন করতে নিচের কমান্ডগুলো চালান:
SQL> spool verify_partition.txt
SQL> select partition_name from DBA_tab_partitions where table_name ='TABLEA_PAR' and table_owner = 'TEST';
SQL> spool off
PARTITION_NAME
-----------------
TABLEA_2004
TABLEA_2005
ধাপ ৯: নন-পার্টিশন টেবিলে স্ট্যাটিস্টিক্স গ্যাথার করুন
নন-পার্টিশন টেবিলে স্ট্যাটিস্টিক্স গ্যাথার করতে এবং স্পুল ফাইলে সেভ করতে নিচের কমান্ডগুলো চালান:
SQL> SPOOL gather_stats.txt
SQL> exec dbms_stats.gather_table_stats ('TEST', 'TABLEA',cascade => TRUE);
SQL> spool off
ধাপ ১০: রিডেফিনিশন সম্ভাব্যতা চেক করুন
নোট: সোর্স টেবিল (নন-পার্টিশन्ड) রিডেফিনিশন প্যাকেজ ব্যবহার করার আগে প্রাইমারি কী প্রয়োজন নেই।
রিডেফিনিশন সম্ভব কিনা দেখতে নিচের কমান্ডগুলো চালান এবং রেজাল্ট স্পুল ফাইলে সেভ করুন:
SQL> spool check_the_redefinition.txt
SQL> EXEC DBMS_Redefinition.can_redef_table ('TEST', 'TABLEA');
SQL> spool off
ধাপ ১১: রিডেফিনিশন শুরু করুন
যদি check_the_redefinition.txt-এ কোনো এরর না থাকে, তবে নিচের লং-রানিং কমান্ড ব্যবহার করে রিডেফিনিশন শুরু করুন:
SQL> spool start_redef_table.txt
SQL>begin
dbms_redefinition.start_redef_table (
uname => 'TEST',
orig_table => 'TABLEA',
int_table => 'TABLEA_PAR');
end;
/
SQL> spool off
ধাপ ১২: রিডেফিনিশন চলাকালীন টেবিলস্পেস এরর নজর রাখুন
ধাপ ১১-এ রিডেফিনিশন অপারেশন টেবিলস্পেস অ্যালার্ট দিতে পারে নিচের উদাহরণের মতো:
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-01688: unable to extend table TEST.TABLEA_PAR partition SYS_P42 by 1024 in tablespace TABLEA_TBL
ORA-06512: at "SYS.DBMS_REDEFINITION", line 52
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646
ORA-06512: at line 2
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-14400: inserted partition key does not map to any partition
ORA-06512: at "SYS.DBMS_REDEFINITION", line 52
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646
ORA-06512: at line 2
যদি উপরের উদাহরণের মতো টেবিলস্পেস এরর দেখেন, তবে নিচের ধাপগুলো নিন:
রিডেফিনিশন প্রসেস রোকাতে নিচের কমান্ড চালান।
SQL> spool abort_redef_table.txt SQL> begin dbms_redefinition.abort_redef_table ( uname => 'TEST', orig_table => 'TABLEA', int_table => 'TABLEA_PAR'); end; / SQL> spool offপার্টিশন টেবিল এবং মেটيريয়ালাইজড ভিউ ড্রপ করুন।
টেবিলস্পেসের আকার বাড়ান। এই উদাহরণে, TABLEA_TBL টেবিলস্পেসের আকার বাড়ান।
ধাপ ১১ আবার চালান।
ধাপ ১৩: রিডেফিনিশন এরর চেক করুন
রিডেফিনিশন প্রসেস সফলভাবে কমপ্লিট হলে, কোনো এরর আছে কিনা চেক করতে নিচের কমান্ডগুলো চালান:
SQL> spool copy_table_dependents.txt
SQL> SET SERVEROUTPUT ON
DECLARE
l_num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.copy_table_dependents(
uname => 'TEST',
orig_table => 'TABLEA',
int_table => 'TABLEA_PAR',
copy_indexes => DBMS_REDEFINITION.cons_orig_params, -- Non-Default
num_errors => l_num_errors);
DBMS_OUTPUT.put_line('l_num_errors=' || l_num_errors);
END;
/
SQL> spool off
যদি রিডেফিনিশন সফল হয়, তবে copy_table_dependents.txt ফাইলে নিচের মতো রেজাল্ট দেখবেন:
l_num_errors=0
PL/SQL procedure successfully completed.
ধাপ ১৪: (ঐচ্ছিক) পার্টিশন টেবিল রিসিনক্রোনাইজ করুন
যদি চান, তবে ইন্টারিম নাম দিয়ে পার্টিশন টেবিল রিসিনক্রোনাইজ করতে নিচের কমান্ডগুলো চালান:
SQL> spool sync_interim_table.txt
SQL> BEGIN
DBMS_REDEFINITION.sync_interim_table (
uname => 'TEST',
orig_table => 'TABLEA',
int_table => 'TABLEA_PAR');
END;
/
SQL> spool off
ধাপ ১৫: পার্টিশন টেবিলে স্ট্যাটিস্টিক্স গ্যাথার করুন
SQL> spool gather_statistics_par.txt
SQL> exec dbms_stats.gather_table_stats ('TEST', 'TABLEA_PAR',cascade => TRUE);
SQL> spool off
ধাপ ১৬: কনস্ট্রেইন্ট স্ক্রিপ্ট তৈরি করুন
ভ্যালিডেট কনস্ট্রেইন্ট ইনেবল করার স্ক্রিপ্ট প্রস্তুত করতে নিচের কমান্ডগুলো চালান:
SQL> spool constraint_enable_validate.txt
SET LINESIZE 500
SET PAGESIZE 1000
SQL> select 'alter table' ||' '||OWNER||'.'||TABLE_NAME||' enable validate constraint'||' '||CONSTRAINT_NAME||';' from dba_constraints where TABLE_NAME = 'TABLEA_PAR' and OWNER='TEST';
'ALTERTABLE'||''||OWNER||'.'||TABLE_NAME||'ENABLEVALIDATECONSTRAINT'||''||CONSTR
--------------------------------------------------------------------------------
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004601;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004602;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004603;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_IDX_PK;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_FK01;
SQL> spool off
ধাপ ১৭: ভ্যালিডেট কনস্ট্রেইন্ট ইনেবল করুন
ধাপ ১৬-এ তৈরি স্ক্রিপ্ট এবং কমান্ড চালান, নিচের উদাহরণ অনুযায়ী:
SQL> spool constraint_enable_execute.outp.txt
SQL>@constraint_enable.sql
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004601;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004602;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004603;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_IDX_PK;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_FK01;
SQL> spool off
ধাপ ১৮: নন-পার্টিশন এবং পার্টিশন টেবিল তুলনা করুন
মূল নন-পার্টিশন টেবিল এবং নতুন পার্টিশন টেবিল তুলনা করুন যাতে সব অ্যাট্রিবিউট একই কিনা যাচাই করা যায়।
ধাপ ১৯: টেবিলগুলো রিনেম করুন
ইন্টারিম টেবিলকে রিয়েল টেবিল হিসেবে সেট করে টেবিল নাম স্ব্যাপ করতে নিচের কমান্ডগুলো চালান:
SQL> spool finish_redef_table.txt
BEGIN
DBMS_REDEFINITION.finish_redef_table (
uname => 'TEST',
orig_table => 'TABLEA',
int_table => 'TABLEA_PAR');
END;
/
--------------------------------------------
@?/rdbms/admin/utlrp.sql
--------------------------------------------
SQL>spool off
ধাপ ২০: টেবিলগুলো তুলনা করুন
দুই টেবিলের রেকর্ড কাউন্ট তুলনা করুন এবং নিশ্চিত করুন যে তারা মেলে:
SQL> spool table_count.outp.txt
SQL> select count(*) from TEST.TABLEA;
COUNT(*)
----------
890540
SQL> select count (*) from TEST.TABLEA_PAR;
COUNT(*)
----------
890540
SQL> spool off
ধাপ ২১: পার্টিশন সাফল্য যাচাই করুন
পার্টিশন প্রসেস সফল হয়েছে কিনা যাচাই করতে নিচের কমান্ডগুলো চালান:
SQL> spool check_partition.txt
SQL> select partitioned from dba_tables where table_name = 'TABLEA' and owner='TEST';
PAR
------
YES
SQL> select partition_name , SUBPARTITION_COUNT, TABLESPACE_NAME from dba_tab_partitions where table_name='TABLEA' and table_owner='TEST';
SQL> select table_name, partition_name, high_value, partition_position from DBA_tab_partitions where table_name='TABLEA' and table_owner='TEST';
SQL> spool off
ধাপ ২২: ডাটাবেস অবজেক্ট পুনরায় পরীক্ষা করুন
ডাটাবেস অবজেক্ট পরীক্ষা করুন এবং ধাপ ২-এর সাথে রেজাল্ট তুলনা করুন:
SET LINESIZE 500
SET PAGESIZE 1000
SQL> spool cons_indx_trigg.txt
SQL> select name, type, owner from all_dependencies where referenced_owner = 'TEST' and referenced_name = 'TABLEA';
NAME TYPE OWNER
---------------- --------------- ------------
PROC_TABLEA PROCEDURE TEST
TABLEA_TRIGG TRIGGER TEST
PKG_TABLEA PACKAGE BODY TEST
SQL> select OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, STATUS, TABLESPACE_NAME from dba_indexes where TABLE_OWNER='TEST' and TABLE_NAME='TABLEA';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME STATUS TABLESPACE_NAME
-----------------------------------------------------------------------
TEST TABLEA_IDX_ID01 TEST TABLEA VALID TABLEA_TBL
TEST TABLEA_IDX_ID04 TEST TABLEA VALID TABLEA_TBL
TEST TABLEA_IDX_PK TEST TABLEA VALID TABLEA_TBL
SQL> select STATUS, OBJECT_TYPE, OBJECT_NAME from dba_objects where OWNER='TEST' and OBJECT_TYPE = 'TRIGGER' and STATUS='INVALID';
no rows selected
SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE from dba_constraints where TABLE_NAME='TABLEA' and owner='TEST';
CONSTRAINT_NAME C
------------------- ----------
SYS_C002004601 C
SYS_C002004602 C
SYS_C002004603 C
IDX_PK P
FK01 R
12 rows selected.
SQL> spool off
ধাপ ২৩: ইনডেক্স রিবিল্ড করুন
নতুন টেবিলস্পেসে ইনডেক্স রিবিল্ড করতে নিচের কমান্ডগুলো চালান:
SQL> spool rebuild_indx.txt
SQL>@rebuild_index.sql
ALTER INDEX TEST.TABLEA_IDX_ID01 REBUILD TABLESPACE TABLEA_TBL_PAR ONLINE;
ALTER INDEX TEST.ITABLEA_IDX_ID04 REBUILD TABLESPACE TABLEA_TBL_PAR ONLINE;
ALTER INDEX TEST.TABLEA_IDX_PK REBUILD TABLESPACE TABLEA_TBL_PAR ONLINE;
SQL> spool off
ধাপ ২৪: ইনডেক্স ভ্যালিডেট করুন
স্ট্যাটাস valid এবং সব ইনডেক্সের টেবিলস্পেস TABLEA_TBL_PAR কিনা যাচাই করতে নিচের কমান্ডগুলো চালান:
SQL> spool verify_indx.outp.txt
SQL> select OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, STATUS, TABLESPACE_NAME from dba_indexes where TABLE_OWNER='TEST' and TABLE_NAME='TABLEA';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME STATUS TABLESPACE_NAME
---------------------------------------------------------------------------
TEST TABLEA_IDX_ID01 TEST TABLEA VALID TABLEA_TBL_PAR
TEST TABLEA_IDX_ID04 TEST TABLEA VALID TABLEA_TBL_PAR
TEST TABLEA_IDX_PK TEST TABLEA VALID TABLEA_TBL_PAR
SQL>spool off
ধাপ ২৫: মূল নন-পার্টিশন টেবিল ড্রপ করুন
DBAs কনফার্ম করলে যে সব ঠিক আছে, মূল টেবিল রিমুভ করতে নিচের কমান্ড এক্সিকিউট করুন, যা এখন ইন্টারিম টেবিলের নাম ধারণ করছে, TEST.TABLEA_PAR:
SQL> DROP table TEST.TABLEA_PAR cascade constraints;
উপসংহার
উপরের ধাপগুলো ইন্টারিম টেবিল TEST.TABLEA_PAR ব্যবহার করে টেবিল TEST.TABLEA-কে কোনো অ্যাপ্লিকেশন ডাউনটাইম ছাড়া রেঞ্জ ইন্টারভাল টেবিলে পার্টিশন করেছে।
Feedback ট্যাব ব্যবহার করে যেকোনো মন্তব্য বা প্রশ্ন করুন।