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

DBMS_REDEFINITION দিয়ে প্রোডাকশনে Oracle টেবিল পুনর্নির্দেশ করুন

অনলাইন টেবিল পুনর্নির্দেশণ আপনাকে প্রোডাকশন পরিবেশে ডেটা অনুপলব্ধ করाए বিনা আপনার Oracle® টেবিলের কাঠামো পুনর্গঠন করতে দেয়। আপনি হয়তো ডেটা সরানোর জন্য টেম্প টেবিল ব্যবহার করতে পারেন, কিন্তু একটি উন্নত সমাধান বিদ্যমান।

ভূমিকা

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

DBMS_REDEFINITION দিয়ে প্রোডাকশনে Oracle টেবিল পুনর্নির্দেশ করুন

উদ্দেশ্য

নিম্নলিখিত কারণগুলোর জন্য পর্যায়ক্রমে একটি Oracle টেবিলের যৌক্তিক বা ভৌত কাঠামো পরিবর্তন করা প্রয়োজন হয়:

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

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

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

অনলাইন টেবিল পুনর্নির্দেশণে ফ্রি স্পেস প্রয়োজন যা পুনর্নির্দেশ করা টেবিল দ্বারা বর্তমানে ব্যবহৃত স্পেসের সমতুল্য।

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

একটি টেবিল অনলাইনে পুনর্নির্দেশ করুন

একটি টেবিল অনলাইনে পুনর্নির্দেশ করতে নিচের ধাপগুলো অনুসরণ করুন।

  1. পুনর্নির্দেশণ পদ্ধতি বেছে নিন, হয় by key অথবা by rowids।

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

    By rowid: এই পদ্ধতি ব্যবহার করুন যদি কোনো কী উপলব্ধ না থাকে। এই পদ্ধতিতে, 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 লম্বিত সকল DML অপারেশন কমিট হওয়ার জন্য অপেক্ষা করে পুনর্নির্দেশণ সম্পূর্ণ করার আগে।

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

     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 

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

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

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

থোক কতরা সারি যোগ করুন

নিচের নমুনা থোক কতরা সারি যোগ করার এবং AMIT স্কিমাতে PPA_AGGGREGATE_TARGET সর্বোচ্চ মান সেট করার উদাহরণ দেখাচ্ছে।

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. 

Rowid ব্যবহার করে

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. 

নির্ভরশীল অবজেক্ট কপি করুন

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

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. HTML Tables

  2. Java MySQL ব্যবহার করে MySQL টেবিল আপডেট করা

  3. Access-এ Table Designer ব্যবহার করে টেবিল তৈরি করুন

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