কম্পিউটার

DBMS_REDEFINITION প্যাকেজ ব্যবহার করে ওরাকল অনলাইন টেবিল পার্টিশন

Oracle® 10g দিয়ে শুরু করে, আপনি DBMS_REDEFINITION প্যাকেজ ব্যবহার করে কোনো অ্যাপ্লিকেশন ডাউনটাইম ছাড়াই অনলাইনে টেবিল পার্টিশন করতে পারেন।

DBMS_REDEFINITION ব্যবহার করে একটি পার্টিশন টেবিলে একটি পার্টিশন-বিহীন টেবিল পরিবর্তন করতে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন৷ এই উদাহরণটি নন-পার্টিশন টেবিল, TABLEA,কে একটি পরিসীমা ব্যবধান পার্টিশন টেবিলে পরিবর্তন করে।

ধাপ 1:আনপার্টিশন টেবিলের ব্যাকআপ নিন

টেবিলের একটি সম্পূর্ণ রপ্তানি ব্যাকআপ তৈরি করতে নিম্নলিখিত কোডটি চালান, 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

ধাপ 2:ডাটাবেস অবজেক্ট পরীক্ষা করুন

একটি টেবিল ড্রপ করা হলে নিম্নলিখিত নির্ভরশীল (D) ডাটাবেস অবজেক্টগুলি বাদ দেওয়া যেতে পারে:

  • সীমাবদ্ধতা (সীমাবদ্ধতা) D

  • INDEX (সূচিপত্র) D

  • MATERIALIZED_VIEW_LOG (ম্যাটেরিয়ালাইজড ভিউ লগ) D

  • OBJECT_GRANT (অবজেক্ট অনুদান) 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

ধাপ 3:টেবিলের 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

ধাপ 4:DDL স্ক্রিপ্ট কপি করুন

ধাপ 3 এ আপনি যে DDL স্ক্রিপ্ট তৈরি করেছেন তা অনুলিপি করতে নিম্নলিখিত কমান্ডটি চালান৷

cp DEF_TABLEA.sql DEF_TABLEA_PAR.sql

ধাপ 5:নন-পার্টিশন টেবিলে তারিখগুলি পর্যালোচনা করুন

সারণীতে তারিখগুলি খুঁজতে নিম্নলিখিত কমান্ডটি চালান:

SQL> select * from (select DT from TEST.TABLEA where rownum <15 order by DT DESC);

ধাপ 6:DEF_TABLEA_PAR.sql ফাইল সম্পাদনা করুন

DEF_TABLEA_PAR.sql সম্পাদনা করুন নিম্নলিখিত পরিবর্তনগুলি করতে:

  • টেবিল এর সমস্ত ঘটনা পরিবর্তন করুন TABLEA_PAR-এ .

  • সমস্ত সীমাবদ্ধতা মুছে ফেলুন, যেমন NULL বা অন্য কোন বাধা।

  • নিম্নলিখিত কমান্ডটি প্রবেশ করান যাতে টেবিলটি একটি নতুন টেবিলস্পেসে তৈরি হয়:

      TABLESPACE "TABLEA_TBL_PAR" LOGGING
    
  • ধাপ 5:

    -এ চিহ্নিত তারিখের উপর ভিত্তি করে পার্টিশন সংজ্ঞা যোগ করতে নিম্নলিখিত কমান্ডগুলি সন্নিবেশ করুন
      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')));

ধাপ 7:পার্টিশন টেবিল তৈরি করুন

DEF_TABLEA_PAR.sql চালানোর জন্য নিম্নলিখিত ধাপগুলি চালিয়ে পার্টিশন টেবিল তৈরি করুন স্ক্রিপ্ট:

SQL> spool DEF_TABLEA_PAR.outp.txt
SQL> @DEF_TABLEA_PAR.sql

Table Created.

SQL> spool off

ধাপ 8:পার্টিশন টেবিল যাচাই করুন

পার্টিশন টেবিল যাচাই করতে নিম্নলিখিত কমান্ডগুলি চালান এবং সংজ্ঞায়িত পার্টিশনগুলি ফেরত দিন:

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

ধাপ 9:নন-পার্টিশন টেবিলে পরিসংখ্যান সংগ্রহ করুন

বিভাজনবিহীন টেবিলে পরিসংখ্যান সংগ্রহ করতে নিম্নলিখিত কমান্ডগুলি চালান এবং সেগুলিকে একটি স্পুল ফাইলে সংরক্ষণ করুন৷

SQL> SPOOL gather_stats.txt
SQL> exec dbms_stats.gather_table_stats ('TEST', 'TABLEA',cascade => TRUE);
SQL> spool off

ধাপ 10:পুনরায় সংজ্ঞার সম্ভাব্যতা পরীক্ষা করুন

দ্রষ্টব্য :আপনি পুনঃসংজ্ঞা প্যাকেজ ব্যবহার করার আগে উত্স টেবিলের (অ-বিভাগহীন) একটি প্রাথমিক কী প্রয়োজন নেই৷

পুনরায় সংজ্ঞা দেওয়া সম্ভব কিনা তা দেখতে নিম্নলিখিত কমান্ডগুলি চালান এবং একটি স্পুল ফাইলে ফলাফলগুলি সংরক্ষণ করুন:

SQL> spool check_the_redefinition.txt
SQL> EXEC DBMS_Redefinition.can_redef_table ('TEST', 'TABLEA');
SQL> spool off

ধাপ 11:পুনরায় সংজ্ঞা দেওয়া শুরু করুন

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

ধাপ 12:পুনরায় সংজ্ঞা দেওয়ার সময় টেবিলস্পেস ত্রুটিগুলি দেখুন

ধাপ 11-এ পুনঃসংজ্ঞা অপারেশনের ফলে নিম্নলিখিত উদাহরণের মতো টেবিলস্পেস সতর্কতা হতে পারে:

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. ধাপ 11 পুনরায় চালান।

ধাপ 13:পুনঃসংজ্ঞায়িত ত্রুটি পরীক্ষা করুন

পুনঃসংজ্ঞা প্রক্রিয়া সফলভাবে সম্পন্ন হওয়ার পরে, কোনো ত্রুটি পরীক্ষা করতে নিম্নলিখিত কমান্ডগুলি চালান:

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.

ধাপ 14:(ঐচ্ছিক) পার্টিশন টেবিল পুনরায় সিঙ্ক্রোনাইজ করুন

আপনি যদি চান, একটি অন্তর্বর্তী নামের সাথে পার্টিশন টেবিল পুনরায় সিঙ্ক্রোনাইজ করতে নিম্নলিখিত কমান্ডগুলি চালান:

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

ধাপ 15:পার্টিশন টেবিলে পরিসংখ্যান সংগ্রহ করুন

পার্টিশন টেবিলে পরিসংখ্যান সংগ্রহ করতে নিম্নলিখিত কমান্ডগুলি চালান:

SQL> spool gather_statistics_par.txt
SQL> exec dbms_stats.gather_table_stats ('TEST', 'TABLEA_PAR',cascade => TRUE);
SQL> spool off

ধাপ 16:সীমাবদ্ধতা স্ক্রিপ্ট তৈরি করুন

বৈধতা সীমাবদ্ধতা সক্ষম করতে একটি স্ক্রিপ্ট প্রস্তুত করতে নিম্নলিখিত কমান্ডগুলি চালান৷

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

ধাপ 17:বৈধতা সীমাবদ্ধতা সক্ষম করুন

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

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

ধাপ 18:নন-পার্টিশন এবং পার্টিশন টেবিল তুলনা করুন

মূল, নন-পার্টিশন টেবিলের সাথে নতুন, পার্টিশন টেবিলের তুলনা করুন যে সমস্ত বৈশিষ্ট্য একই।

ধাপ 19:টেবিলের নাম পরিবর্তন করুন

টেবিলের নাম পরিবর্তন করতে অন্তর্বর্তী টেবিলটিকে আসল টেবিল হিসাবে সেট করতে নিম্নলিখিত কমান্ডগুলি চালান:

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

ধাপ 20:টেবিল তুলনা করুন

উভয় টেবিলের রেকর্ড গণনা তুলনা করতে নিম্নলিখিত কমান্ডগুলি চালান এবং নিশ্চিত করুন যে তারা মেলে:

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

ধাপ 21:পার্টিশন সফলতা যাচাই করুন

পার্টিশন প্রক্রিয়া সফল হয়েছে কিনা তা যাচাই করতে নিম্নলিখিত কমান্ডগুলি চালান:

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

ধাপ 22:ডাটাবেস অবজেক্টগুলি পুনরায় পরীক্ষা করুন

ডাটাবেস অবজেক্ট পরীক্ষা করতে নিম্নলিখিত কমান্ডগুলি চালান এবং ধাপ 2 এর সাথে ফলাফলের তুলনা করুন:

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

ধাপ 23:সূচীগুলি পুনরায় তৈরি করুন

নতুন টেবিলস্পেসে সূচীগুলি পুনর্নির্মাণ করতে নিম্নলিখিত কমান্ডগুলি চালান:

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

ধাপ 24:সূচী যাচাই করুন

স্ট্যাটাসটি 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

ধাপ 25:মূল নন-পার্টিশন টেবিল বাদ দিন

ডিবিএগুলি নিশ্চিত করার পরে যে সবকিছু ভাল দেখাচ্ছে, মূল টেবিলটি সরাতে নিম্নলিখিত কমান্ডটি চালান, যার এখন অন্তর্বর্তীকালীন নাম রয়েছে, TEST.TABLEA_PAR:

SQL> DROP table TEST.TABLEA_PAR cascade constraints;

উপসংহার

পূর্ববর্তী ধাপগুলি কোনো অ্যাপ্লিকেশন ডাউনটাইম ছাড়াই একটি পরিসরের ব্যবধানের টেবিলে বিভাজন করার জন্য TEST.TABLEA_PAR, অন্তর্বর্তী সারণী, TEST.TABLEA ব্যবহার করেছে।

কোনো মন্তব্য করতে বা প্রশ্ন জিজ্ঞাসা করতে প্রতিক্রিয়া ট্যাবটি ব্যবহার করুন৷


  1. ওরাকল বাহ্যিক টেবিল ব্যবহার করুন

  2. Oracle Forms APP_MULTI প্যাকেজ ব্যবহার করুন

  3. Oracle 19c এ DBCA কমান্ড ব্যবহার করে একটি ডাটাবেস ক্লোন করা হচ্ছে

  4. ওরাকল এসকিউএল প্রোফাইল এবং বেসলাইন