অনলাইন টেবিল পুনঃসংজ্ঞা আপনাকে ডেটা অনুপলব্ধ না করেই আপনার Oracle® টেবিলের প্রবর্তন পুনর্গঠন করতে দেয়। আপনি ডাটা সরানোর জন্য টেম্প টেবিল ব্যবহার করতে স্বাচ্ছন্দ্য বোধ করতে পারেন, তবে আরও ভাল সমাধান রয়েছে।
পরিচয়
আপনার টেবিলের পুনর্গঠন করার সময় ডেটা স্টেজিং এবং এটিকে ঘুরিয়ে ঘুরিয়ে একটি নির্দিষ্ট সময়ের জন্য টেবিল এবং ডেটা উভয়ই অনুপলব্ধ করে, যা ব্যবসার জন্য একটি কম অনুকূল পরিস্থিতি। এটি যখন DBMS_REDEFINITION
প্যাকেজটি দিন সংরক্ষণ করে, যেমনটি নিম্নলিখিত ছবিতে দেখানো হয়েছে:
উদ্দেশ্য
পর্যায়ক্রমে, আপনাকে নিম্নলিখিত কারণগুলির জন্য একটি Oracletable এর যৌক্তিক বা শারীরিক গঠন পরিবর্তন করতে হবে:
- কোয়েরি বা ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজ (DML) কর্মক্ষমতা বাড়াতে
- অ্যাপ্লিকেশান পরিবর্তনগুলিকে সামঞ্জস্য করতে
- সঞ্চয়স্থান পরিচালনা করতে
ওরাকল ডেটাবেস টেবিলের প্রাপ্যতাকে উল্লেখযোগ্যভাবে প্রভাবিত না করেই টেবিলের কাঠামো পরিবর্তন করার জন্য একটি প্রক্রিয়া প্রদান করে, যা অনলাইন টেবিল পুনঃসংজ্ঞা নামে পরিচিত। সারণী পুনঃসংজ্ঞায়িত করার ঐতিহ্যগত পদ্ধতির তুলনায় অনলাইনে সারণী পুনঃসংজ্ঞায়িত করা একটি উল্লেখযোগ্য কর্মক্ষমতা বৃদ্ধি করে।
যখন একটি টেবিলকে অনলাইনে পুনরায় সংজ্ঞায়িত করা হয়, তখন বেশিরভাগ পুনঃসংজ্ঞা প্রক্রিয়ার সময় এটি কোয়েরি এবং ডিএমএল উভয়ের জন্যই অ্যাক্সেসযোগ্য। টেবিলটি শুধুমাত্র অল্প সময়ের জন্য একচেটিয়া মোডে লক করা আছে, যা টেবিলের আকার এবং পুনর্নির্ধারণের জটিলতার থেকে স্বতন্ত্র। পুনঃসংজ্ঞা প্রক্রিয়া ব্যবহারকারীদের কাছে সম্পূর্ণ স্বচ্ছ৷
৷অনলাইন টেবিল পুনঃসংজ্ঞায়িত করার জন্য খালি স্থান প্রয়োজন যা বর্তমানে টেবিলের পুনঃসংজ্ঞায়িত দ্বারা ব্যবহৃত স্থানের প্রায় সমতুল্য।
একটি টেবিল পুনর্গঠিত করার অনেক উপায় আছে। যখন ডাউনটাইম একটি চ্যালেঞ্জ, তখন DBMS_REDEFINITION
প্যাকেজ এই কাজের জন্য সবচেয়ে ভালো বিকল্প।
একটি টেবিল অনলাইনে পুনরায় সংজ্ঞায়িত করুন
অনলাইনে একটি টেবিল পুনরায় সংজ্ঞায়িত করতে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন৷
৷-
পুনঃসংজ্ঞা পদ্ধতি বেছে নিন, হয়
by key
অথবাby rowids
.কী দ্বারা :সংজ্ঞার জন্য ব্যবহার করার জন্য একটি প্রাথমিক কী বা ছদ্ম-প্রাথমিক কী নির্বাচন করুন। ছদ্ম-প্রাথমিক কীগুলি হল অনন্য কী যেখানে সমস্ত উপাদান কলামে
NOT NULL
থাকে সীমাবদ্ধতা এই পদ্ধতির জন্য, পুনরায় সংজ্ঞা দেওয়ার আগে এবং পরে টেবিলের সংস্করণগুলি একই প্রাথমিক কীকলামগুলি নিয়ে গঠিত হওয়া উচিত। এটি পুনর্নির্ধারণের পছন্দের এবং ডিফল্ট পদ্ধতি৷রোইড দ্বারা: কোন চাবি উপলব্ধ না হলে এই পদ্ধতি ব্যবহার করুন. এই পদ্ধতিতে, লুকানো কলাম, নাম
M_ROW$$
, টেবিলের পোস্ট-পুনঃসংজ্ঞায়িত সংস্করণে যোগ করা হয়েছে। সংজ্ঞা সম্পূর্ণ হওয়ার পরে এই কলামটি বাদ দেওয়া বা অব্যবহৃত হিসাবে চিহ্নিত করা উচিত। যদিCOMPATIBLE
10.2.0 বা উচ্চতর সেট করা হয়েছে, পুনঃসংজ্ঞার চূড়ান্ত পর্ব স্বয়ংক্রিয়ভাবে এই কলামটিকে অব্যবহৃত হিসাবে সেট করে। তারপরে আপনিALTER TABLE ... DROP UNUSED COLUMNS
ব্যবহার করতে পারেন বিবৃতিটি ড্রপ করুন। আপনি সূচী-সংগঠিত টেবিলে এই পদ্ধতিটি ব্যবহার করতে পারবেন না। -
CAN_REDEF_TABLE
আহ্বান করে টেবিলটিকে অনলাইনে পুনরায় সংজ্ঞায়িত করা যেতে পারে তা যাচাই করুন পদ্ধতি যদি টেবিলটি অনলাইন পুনঃসংজ্ঞার জন্য প্রার্থী না হয়, তাহলে এই পদ্ধতিটি একটি ত্রুটি উত্থাপন করে যা নির্দেশ করে যে কেন টেবিলটিকে অনলাইনে পুনরায় সংজ্ঞায়িত করা যাবে না৷ -
সমস্ত পছন্দসই লজিক্যাল এবং ফিজিক্যাল অ্যাট্রিবিউট সহ একটি খালি অন্তর্বর্তী সারণী তৈরি করুন (সারণীর মতো একই স্কিমাতে যা পুনরায় সংজ্ঞায়িত করা হয়েছে)৷
-
সমস্ত সূচী, সীমাবদ্ধতা, অনুদান, এবং টেবিলের ট্রিগারগুলিকে পুনরায় সংজ্ঞায়িত করে অন্তর্বর্তী সারণী তৈরি করার প্রয়োজন নেই৷
COPY_TABLE_DEPENDENTS
ব্যবহার করে এটি স্বয়ংক্রিয়ভাবে করা যেতে পারে পদ্ধতি। -
বড় টেবিলে কর্মক্ষমতা উন্নত করতে, আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে এটিকে সমান্তরালভাবে সেট করতে পারেন:
ALTER SESSION force parallel dml parallel degree-of-parallelism; ALTER SESSION force parallel query parallel degree-of-parallelism;
-
FINISH_REDEF_TABLE
কমান্ড টেবিলের পুনঃসংজ্ঞা সম্পূর্ণ করে। এই প্রক্রিয়া চলাকালীন, মূল টেবিলটি একটি স্বল্প সময়ের জন্য একটি এক্সক্লুসিভ মোডে লক করা হয়, যা মূল টেবিলের ডেটার পরিমাণ থেকে স্বতন্ত্র। তবে,FINISH_REDEF_TABLE
পুনঃসংজ্ঞা সম্পূর্ণ করার আগে সমস্ত মুলতুবি ডিএমএল অপারেশনের জন্য অপেক্ষা করে৷ -
আপনি যদি
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) পরিবেশে গ্রাহকদের জন্য ডাউনটাইমের কারণে সৃষ্ট চ্যালেঞ্জগুলি এড়িয়ে যায়৷
কোনো মন্তব্য করতে বা প্রশ্ন জিজ্ঞাসা করতে প্রতিক্রিয়া ট্যাবটি ব্যবহার করুন৷
৷