কম্পিউটার

DBMS_REDEFINTION এর মাধ্যমে অনলাইনে সারণী পুনরায় সংজ্ঞায়িত করুন

অনলাইন টেবিল পুনঃসংজ্ঞা আপনাকে ডেটা অনুপলব্ধ না করেই আপনার Oracle® টেবিলের প্রবর্তন পুনর্গঠন করতে দেয়। আপনি ডাটা সরানোর জন্য টেম্প টেবিল ব্যবহার করতে স্বাচ্ছন্দ্য বোধ করতে পারেন, তবে আরও ভাল সমাধান রয়েছে।

পরিচয়

আপনার টেবিলের পুনর্গঠন করার সময় ডেটা স্টেজিং এবং এটিকে ঘুরিয়ে ঘুরিয়ে একটি নির্দিষ্ট সময়ের জন্য টেবিল এবং ডেটা উভয়ই অনুপলব্ধ করে, যা ব্যবসার জন্য একটি কম অনুকূল পরিস্থিতি। এটি যখন DBMS_REDEFINITION প্যাকেজটি দিন সংরক্ষণ করে, যেমনটি নিম্নলিখিত ছবিতে দেখানো হয়েছে:

DBMS_REDEFINTION এর মাধ্যমে অনলাইনে সারণী পুনরায় সংজ্ঞায়িত করুন

উদ্দেশ্য

পর্যায়ক্রমে, আপনাকে নিম্নলিখিত কারণগুলির জন্য একটি Oracletable এর যৌক্তিক বা শারীরিক গঠন পরিবর্তন করতে হবে:

  • কোয়েরি বা ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজ (DML) কর্মক্ষমতা বাড়াতে
  • অ্যাপ্লিকেশান পরিবর্তনগুলিকে সামঞ্জস্য করতে
  • সঞ্চয়স্থান পরিচালনা করতে

ওরাকল ডেটাবেস টেবিলের প্রাপ্যতাকে উল্লেখযোগ্যভাবে প্রভাবিত না করেই টেবিলের কাঠামো পরিবর্তন করার জন্য একটি প্রক্রিয়া প্রদান করে, যা অনলাইন টেবিল পুনঃসংজ্ঞা নামে পরিচিত। সারণী পুনঃসংজ্ঞায়িত করার ঐতিহ্যগত পদ্ধতির তুলনায় অনলাইনে সারণী পুনঃসংজ্ঞায়িত করা একটি উল্লেখযোগ্য কর্মক্ষমতা বৃদ্ধি করে।

যখন একটি টেবিলকে অনলাইনে পুনরায় সংজ্ঞায়িত করা হয়, তখন বেশিরভাগ পুনঃসংজ্ঞা প্রক্রিয়ার সময় এটি কোয়েরি এবং ডিএমএল উভয়ের জন্যই অ্যাক্সেসযোগ্য। টেবিলটি শুধুমাত্র অল্প সময়ের জন্য একচেটিয়া মোডে লক করা আছে, যা টেবিলের আকার এবং পুনর্নির্ধারণের জটিলতার থেকে স্বতন্ত্র। পুনঃসংজ্ঞা প্রক্রিয়া ব্যবহারকারীদের কাছে সম্পূর্ণ স্বচ্ছ৷

অনলাইন টেবিল পুনঃসংজ্ঞায়িত করার জন্য খালি স্থান প্রয়োজন যা বর্তমানে টেবিলের পুনঃসংজ্ঞায়িত দ্বারা ব্যবহৃত স্থানের প্রায় সমতুল্য।

একটি টেবিল পুনর্গঠিত করার অনেক উপায় আছে। যখন ডাউনটাইম একটি চ্যালেঞ্জ, তখন DBMS_REDEFINITION প্যাকেজ এই কাজের জন্য সবচেয়ে ভালো বিকল্প।

একটি টেবিল অনলাইনে পুনরায় সংজ্ঞায়িত করুন

অনলাইনে একটি টেবিল পুনরায় সংজ্ঞায়িত করতে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন৷

  1. পুনঃসংজ্ঞা পদ্ধতি বেছে নিন, হয় by key অথবা by rowids .

    কী দ্বারা :সংজ্ঞার জন্য ব্যবহার করার জন্য একটি প্রাথমিক কী বা ছদ্ম-প্রাথমিক কী নির্বাচন করুন। ছদ্ম-প্রাথমিক কীগুলি হল অনন্য কী যেখানে সমস্ত উপাদান কলামে NOT NULL থাকে সীমাবদ্ধতা এই পদ্ধতির জন্য, পুনরায় সংজ্ঞা দেওয়ার আগে এবং পরে টেবিলের সংস্করণগুলি একই প্রাথমিক কীকলামগুলি নিয়ে গঠিত হওয়া উচিত। এটি পুনর্নির্ধারণের পছন্দের এবং ডিফল্ট পদ্ধতি৷

    রোইড দ্বারা: কোন চাবি উপলব্ধ না হলে এই পদ্ধতি ব্যবহার করুন. এই পদ্ধতিতে, লুকানো কলাম, নাম M_ROW$$ , টেবিলের পোস্ট-পুনঃসংজ্ঞায়িত সংস্করণে যোগ করা হয়েছে। সংজ্ঞা সম্পূর্ণ হওয়ার পরে এই কলামটি বাদ দেওয়া বা অব্যবহৃত হিসাবে চিহ্নিত করা উচিত। যদি COMPATIBLE 10.2.0 বা উচ্চতর সেট করা হয়েছে, পুনঃসংজ্ঞার চূড়ান্ত পর্ব স্বয়ংক্রিয়ভাবে এই কলামটিকে অব্যবহৃত হিসাবে সেট করে। তারপরে আপনি ALTER TABLE ... DROP UNUSED COLUMNS ব্যবহার করতে পারেন বিবৃতিটি ড্রপ করুন। আপনি সূচী-সংগঠিত টেবিলে এই পদ্ধতিটি ব্যবহার করতে পারবেন না।

  2. CAN_REDEF_TABLE আহ্বান করে টেবিলটিকে অনলাইনে পুনরায় সংজ্ঞায়িত করা যেতে পারে তা যাচাই করুন পদ্ধতি যদি টেবিলটি অনলাইন পুনঃসংজ্ঞার জন্য প্রার্থী না হয়, তাহলে এই পদ্ধতিটি একটি ত্রুটি উত্থাপন করে যা নির্দেশ করে যে কেন টেবিলটিকে অনলাইনে পুনরায় সংজ্ঞায়িত করা যাবে না৷

  3. সমস্ত পছন্দসই লজিক্যাল এবং ফিজিক্যাল অ্যাট্রিবিউট সহ একটি খালি অন্তর্বর্তী সারণী তৈরি করুন (সারণীর মতো একই স্কিমাতে যা পুনরায় সংজ্ঞায়িত করা হয়েছে)৷

  4. সমস্ত সূচী, সীমাবদ্ধতা, অনুদান, এবং টেবিলের ট্রিগারগুলিকে পুনরায় সংজ্ঞায়িত করে অন্তর্বর্তী সারণী তৈরি করার প্রয়োজন নেই৷ COPY_TABLE_DEPENDENTS ব্যবহার করে এটি স্বয়ংক্রিয়ভাবে করা যেতে পারে পদ্ধতি।

  5. বড় টেবিলে কর্মক্ষমতা উন্নত করতে, আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে এটিকে সমান্তরালভাবে সেট করতে পারেন:

     ALTER SESSION force parallel dml parallel degree-of-parallelism;
    
     ALTER SESSION force parallel query parallel degree-of-parallelism;
    
  6. FINISH_REDEF_TABLE কমান্ড টেবিলের পুনঃসংজ্ঞা সম্পূর্ণ করে। এই প্রক্রিয়া চলাকালীন, মূল টেবিলটি একটি স্বল্প সময়ের জন্য একটি এক্সক্লুসিভ মোডে লক করা হয়, যা মূল টেবিলের ডেটার পরিমাণ থেকে স্বতন্ত্র। তবে, FINISH_REDEF_TABLE পুনঃসংজ্ঞা সম্পূর্ণ করার আগে সমস্ত মুলতুবি ডিএমএল অপারেশনের জন্য অপেক্ষা করে৷

  7. আপনি যদি rowids ব্যবহার করেন পুনরায় সংজ্ঞা এবং আপনার COMPATIBLE এর জন্য ইনিশিয়ালাইজেশন প্যারামিটার 10.1.0 বা তার নিচে সেট করা আছে, আপনাকে লুকানো কলাম M_ROW$$ ড্রপ করতে হবে যেটি পুনরায় সংজ্ঞায়িত টেবিলে যোগ করা হয়েছে। আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে কলামটিকে "অব্যবহৃত" এ সেট করতে পারেন:

     ALTER TABLE <table_name> SET UNUSED (M_ROW$$);
    

    যদি COMPATIBLE 10.2.0 বা উচ্চতর, এই লুকানো কলামটি স্বয়ংক্রিয়ভাবে UNUSED-এ সেট করা হয় যখন পুনরায় সংজ্ঞা সম্পূর্ণ হয়। তারপরে আপনি ALTER TABLE ... DROP UNUSED COLUMNS দিয়ে কলামটি ড্রপ করতে পারেন বিবৃতি অন্তবর্তী সারণীর বিরুদ্ধে যেকোন দীর্ঘ সময় ধরে চলমান প্রশ্নগুলি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করুন এবং তারপর অন্তর্বর্তী সারণীটি ফেলে দিন৷

নমুনা টেবিল পুনঃসংজ্ঞা

নিম্নোক্ত বিভাগে নমুনা টেবিল পুনঃসংজ্ঞার জন্য বিভিন্ন কমান্ড এবং আউটপুটগুলির উদাহরণ দেখায়৷

sqlplus শুরু করুন

নিচের নমুনা sqlplus শুরু করে দেখায় :

[oracle@vm215 ~]$ sqlplus amit/amit

SQL*Plus: Release 11.2.0.3.0 Production on Sat Oct 29 05:44:44 2016

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

একটি ডেমো টেবিল তৈরি করুন

নিচের নমুনাটি একটি ডেমো টেবিল নাম TEST1 তৈরি করে দেখায় AMIT এর অধীনে স্কিমা।

SQL> CREATE TABLE TEST1 ( ID        NUMBER(10) ,
                      ENAME     VARCHAR2(10),
                      SAL       NUMBER(10) ) ;

বাল্ক সারি ঢোকান

নিম্নলিখিত নমুনাটি বাল্ক সারি ঢোকানো এবং PPA_AGGGREGATE_TARGET সেটিং প্রদর্শন করে AMIT-এ স্কিমা সর্বোচ্চ মান পর্যন্ত।

SQL> INSERT INTO AMIT.TEST1 SELECT ROWNUM, 'T'|| ROWNUM,
DBMS_RANDOM.VALUE(100000, 999999) FROM DUAL CONNECT BY LEVEL < 1000000;

999999 ROWS CREATED.

SQL> COMMIT;

COMMIT COMPLETE.

পরীক্ষার জন্য নির্ভরশীল বস্তু তৈরি করুন

নীচের নমুনাটি সারণীর সাথে সম্পর্কিত নির্ভরশীল বস্তু তৈরির প্রদর্শন করেTEST1 সারি, যাতে আপনি দেখতে পারেন একটি অনলাইন পুনঃসংজ্ঞার সময় কি ঘটে।

সৃষ্টি দেখুন

SQL> CREATE VIEW TEST1_VW AS SELECT * FROM TEST1 ;

VIEW CREATED.

ক্রম সৃষ্টি

SQL> CREATE SEQUENCE TEST_SEQ ;

SEQUENCE CREATED.

প্রক্রিয়া তৈরি

CREATE OR REPLACE PROCEDURE PROC1 (P_ID IN NUMBER)
   AS V_ID  NUMBER ;

BEGIN
  SELECT SAL
  INTO   V_ID
  FROM   TEST1
  WHERE  ID = P_ID;
END;
/

PROCEDURE CREATED.

DML ট্রিগার সৃষ্টি

SQL> CREATE OR REPLACE TRIGGER AMIT_TRIG
     BEFORE INSERT OR UPDATE ON TEST1
     FOR EACH ROW

DECLARE
      X       NUMBER;
BEGIN
     SELECT COUNT(*) INTO X
     FROM TEST1
     WHERE ID = :NEW.ID;
   IF X > 0 THEN
       RAISE_APPLICATION_ERROR(-20501, 'ID' || :NEW.ID || ' ALREADY EXISTS');
   END IF;
END;
/

TRIGGER CREATED.

প্রাথমিক কী সৃষ্টি

SQL> ALTER TABLE TEST1 ADD CONSTRAINT TEST1_ID_PK PRIMARY KEY (ID) ;

TABLE ALTERED.

পুনরায় সংজ্ঞা দেওয়ার আগে স্থিতি পান

SQL> COLUMN OBJECT_NAME FORMAT A20
    SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS ORDER BY OBJECT_NAME;SQL>

OBJECT_NAME          OBJECT_TYPE         STATUS
-------------------- ------------------- -------
AMIT_TRIG            TRIGGER             VALID
PROC1                PROCEDURE           VALID
TEST1                TABLE               VALID
TEST1_ID_PK          INDEX               VALID
TEST1_VW             VIEW                VALID
TEST_SEQ             SEQUENCE            VALID

6 ROWS SELECTED.

পুনরায় সংজ্ঞার জন্য টেবিল চেক করুন

নীচের নমুনাটি পরীক্ষা করে দেখায় যে টেবিলটিকে rowids ব্যবহার করে অনলাইনে পুনরায় সংজ্ঞায়িত করা যেতে পারে। অথবা primary key :

প্রাথমিক কী ব্যবহার করা হচ্ছে

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE ('AMIT','TEST1',DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.

রোউইড ব্যবহার করে

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE ('AMIT','TEST1',DBMS_REDEFINITION.CONS_USE_ROWID);

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.

অন্তবর্তীকালীন টেবিলের একটি প্রতিরূপ তৈরি করুন

নিম্নলিখিত নমুনা কোনো নির্ভরশীল বস্তু ছাড়াই নতুন অন্তর্বর্তী সারণীর একটি প্রতিরূপ তৈরি করে দেখায়:

SQL> CREATE TABLE TEST1_REORG AS SELECT * FROM TEST1 WHERE ROWNUM=5 ;

TABLE CREATED.

SQL> SELECT COUNT(*) FROM TEST1_REORG ;

  COUNT(*)
 ----------
     0

SQL>  SELECT COUNT(*) FROM TEST1;

  COUNT(*)
 ----------
   999999

ডাটাবেসের সাথে সংযোগ করুন

নিম্নলিখিত নমুনাটি টেবিলের পুনঃসংজ্ঞা কার্য সম্পাদন করার জন্য একটি বিশেষাধিকার ব্যবহারকারী ব্যবহার করে সংযোগ প্রদর্শন করে:

[oracle@vm215 ~]$ sqlplus / as sysdba

Sql*plus: release 11.2.0.3.0 production on sat oct 29 05:16:48 2016

Copyright (c) 1982, 2011, oracle.  All rights reserved.

Connected to:
Oracle database 11g enterprise edition release 11.2.0.3.0 - 64bit production
With the partitioning, olap, data mining and real application testing options

পুনরায় সংজ্ঞা শুরু করুন

নিম্নলিখিত নমুনা একটি প্রাথমিক কী ব্যবহার করে পুনরায় সংজ্ঞা শুরু করে দেখায়:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE('AMIT','TEST1', 'TEST1_REORG');

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.

নির্ভরশীল বস্তুগুলি অনুলিপি করুন

নিম্নলিখিত নমুনাটি স্বয়ংক্রিয়ভাবে নির্ভরশীল বস্তুর অনুলিপি যেমন এমভিউ, প্রাথমিক কী, ভিউ, সিকোয়েন্স এবং ট্রিগার প্রদর্শন করে। IGNORE_ERROR TRUE এ সেট করা আছে COPY_TABLE_DEPENDENTS দিয়ে প্রাথমিক কী লঙ্ঘন এড়াতে আদেশ৷

SQL> DECLARE
      N PLS_INTEGER;
BEGIN
    DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('AMIT', 'TEST1','TEST1_REORG',
    DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, N);
END;
/

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.

ত্রুটির জন্য পরীক্ষা করুন

নিম্নলিখিত নমুনা DBA_REDEFINITION_ERRORS-এ ত্রুটির জন্য পরীক্ষা করা দেখায় দেখুন:

SQL> COL OBJECT_NAME FOR A25
SET LIN200 PAGES 200
COL DDL_TEXT FOR A60

SELECT OBJECT_NAME, BASE_TABLE_NAME, DDL_TXT
FROM DBA_REDEFINITION_ERRORS;

NO ROWS SELECTED

উভয় টেবিলই যাচাই করুন

নিম্নলিখিত নমুনা উভয় টেবিলে সারি গণনা যাচাই করে এবং অন্তর্বর্তী সারণীর সাথে সিঙ্ক করে দেখায়:

SQL> SELECT COUNT(*) FROM AMIT.TEST1_REORG ;

 COUNT(*)
----------
  999999

SQL> SELECT COUNT(*) FROM AMIT.TEST1 ;

 COUNT(*)
----------
  999999

SQL> EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('AMIT', 'TEST1', 'TEST1_REORG');

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.

পুনরায় সংজ্ঞাটি শেষ করুন

নিম্নোক্ত নমুনা পুনঃসংজ্ঞাটি শেষ করে দেখায়:

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE ('AMIT', 'TEST1', 'TEST1_REORG');

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.

SQL> COLUMN OBJECT_NAME FORMAT A40
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM DBA_OBJECTS
WHERE OWNER='AMIT';

OBJECT_NAME           OBJECT_TYPE         STATUS
--------------------- ------------------- -------
TEST1_VW              VIEW                INVALID
TEST_SEQ              SEQUENCE            VALID
PROC1                 PROCEDURE           VALID
TEST1                 TABLE               VALID
TEST1_REORG           TABLE               VALID
TEST1_ID_PK           INDEX               VALID
TMP$$_TEST1_ID_PK0    INDEX               VALID
TMP$$_AMIT_TRIG0      TRIGGER             INVALID
AMIT_TRIG             TRIGGER             INVALID

9 ROWS SELECTED.

ত্রুটি চেক করুন এবং স্কিমা পুনরায় কম্পাইল করুন

নিম্নলিখিত নমুনাটি সম্পূর্ণ নির্ভরতা সহ স্কিমা পুনরায় কম্পাইল করা দেখায়, যা পূর্ববর্তী ধাপে অবৈধ ট্রিগারগুলির কারণে প্রয়োজনীয়:

SQL> EXEC UTL_RECOMP.RECOMP_SERIAL('AMIT') ;

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.

SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM DBA_OBJECTS WHERE OWNER='AMIT';

OBJECT_NAME                              OBJECT_TYPE         STATUS
---------------------------------------- ------------------- -------
TEST1_VW                                 VIEW                VALID
TEST_SEQ                                 SEQUENCE            VALID
PROC1                                    PROCEDURE           VALID
TEST1                                    TABLE               VALID
TEST1_REORG                              TABLE               VALID
TEST1_ID_PK                              INDEX               VALID
TMP$$_TEST1_ID_PK0                       INDEX               VALID
TMP$$_AMIT_TRIG0                         TRIGGER             VALID
AMIT_TRIG                                TRIGGER             VALID

9 ROWS SELECTED.

অন্তবর্তী সারণীটি ফেলে দিন

নিম্নলিখিত নমুনা অন্তর্বর্তী সারণী বাদ দেওয়া দেখায়:

SQL> DROP TABLE AMIT.TEST1_REORG;

TABLE DROPPED.

উপসংহার

যদি একটি টেবিলের কাঠামো পরিবর্তন করতে হয় এবং একই সাথে ব্যবহারকারীদের দ্বারা অ্যাক্সেস করতে হয়, তাহলে DBMS_REFDEFINITION ব্যবহার করুন .

এই বৈশিষ্ট্যটি কোনও ডাউনটাইম ছাড়াই ডেটা পুনর্গঠন করতে সহায়তা করে, এইভাবে একটি অনলাইন লেনদেন প্রক্রিয়াকরণ (OLTP) পরিবেশে গ্রাহকদের জন্য ডাউনটাইমের কারণে সৃষ্ট চ্যালেঞ্জগুলি এড়িয়ে যায়৷

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


  1. এইচটিএমএল টেবিল

  2. জাভা মাইএসকিউএল দিয়ে একটি মাইএসকিউএল টেবিল আপডেট করুন

  3. অ্যাক্সেসে টেবিল ডিজাইনার দিয়ে কীভাবে টেবিল তৈরি করবেন

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