কম্পিউটার টিউটোরিয়াল

Oracle 10g-এ DBMS_REDEFINITION দিয়ে সিমলেস অনলাইন টেবিল পার্টিশনিং

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

যদি উপরের উদাহরণের মতো টেবিলস্পেস এরর দেখেন, তবে নিচের ধাপগুলো নিন:

  1. রিডেফিনিশন প্রসেস রোকাতে নিচের কমান্ড চালান।

    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
  2. পার্টিশন টেবিল এবং মেটيريয়ালাইজড ভিউ ড্রপ করুন।

  3. টেবিলস্পেসের আকার বাড়ান। এই উদাহরণে, TABLEA_TBL টেবিলস্পেসের আকার বাড়ান।

  4. ধাপ ১১ আবার চালান।

ধাপ ১৩: রিডেফিনিশন এরর চেক করুন

রিডেফিনিশন প্রসেস সফলভাবে কমপ্লিট হলে, কোনো এরর আছে কিনা চেক করতে নিচের কমান্ডগুলো চালান:

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 ট্যাব ব্যবহার করে যেকোনো মন্তব্য বা প্রশ্ন করুন।

  1. Oracle External Tables ব্যবহার করে দক্ষ ডেটা অ্যাক্সেসের পদ্ধতি

  2. APP_MULTI প্যাকেজ ব্যবহার করে Oracle Forms-এ মাল্টি-সিলেকশন যোগ করুন

  3. Oracle 19c DBCA ব্যবহার করে রিমোট PDB-কে CDB-তে দক্ষতার সাথে ক্লোন করুন

  4. Oracle SQL প্রোফাইল এবং বেসলাইন দক্ষতা: কোয়েরি পারফরম্যান্স বাড়ান