ऑनलाइन तालिका पुनर्परिभाषा आपको डेटा को अनुपलब्ध किए बिना उत्पादन में अपनी Oracle® तालिका को पुनर्गठित करने की अनुमति देती है। आप डेटा को इधर-उधर ले जाने के लिए अस्थायी तालिकाओं का उपयोग करने में सहज हो सकते हैं, लेकिन एक बेहतर समाधान है।
परिचय
जब आप अपनी तालिका का पुनर्गठन करते हैं तो डेटा को व्यवस्थित करना और उसे इधर-उधर करना तालिका और डेटा दोनों को एक निश्चित अवधि के लिए अनुपलब्ध बनाता है, जो व्यवसायों के लिए अनुकूल स्थिति से कम है। यह तब होता है जब DBMS_REDEFINITION
पैकेज दिन बचाता है, जैसा कि निम्न चित्र में दिखाया गया है:
उद्देश्य
समय-समय पर, आपको निम्नलिखित कारणों से Oracleटेबल की तार्किक या भौतिक संरचना को संशोधित करने की आवश्यकता होती है:
- क्वेरी या डेटा मैनिपुलेशन लैंग्वेज (डीएमएल) के प्रदर्शन को बढ़ाने के लिए
- आवेदन परिवर्तनों को समायोजित करने के लिए
- भंडारण प्रबंधित करने के लिए
Oracle डेटाबेस तालिका की उपलब्धता को महत्वपूर्ण रूप से प्रभावित किए बिना तालिका संरचना संशोधन करने के लिए एक तंत्र प्रदान करता है, जिसे ऑनलाइन तालिका पुनर्परिभाषा के रूप में जाना जाता है। तालिकाओं को पुनर्परिभाषित करने के पारंपरिक तरीकों की तुलना में तालिकाओं को ऑनलाइन पुनर्परिभाषित करने से प्रदर्शन में उल्लेखनीय वृद्धि होती है।
जब किसी तालिका को ऑनलाइन पुनर्परिभाषित किया जाता है, तो यह अधिकांश पुनर्परिभाषा प्रक्रिया के दौरान प्रश्नों और डीएमएल दोनों के लिए सुलभ होती है। तालिका केवल एक छोटी अवधि के लिए अनन्य मोड में बंद है, जो तालिका के आकार और पुनर्परिभाषित की जटिलता से स्वतंत्र है। पुनर्परिभाषा प्रक्रिया उपयोगकर्ताओं के लिए पूरी तरह से पारदर्शी है।
ऑनलाइन तालिका पुनर्परिभाषित के लिए खाली स्थान की आवश्यकता होती है जो वर्तमान में पुनर्परिभाषित की जा रही तालिका द्वारा उपयोग किए जाने वाले स्थान के लगभग बराबर है।
तालिका को पुनर्गठित करने के कई तरीके हैं। जब डाउनटाइम एक चुनौती है, तब 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
शुरू करने को दर्शाता है :
[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
creating बनाने का प्रदर्शन करता है 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.
डीएमएल ट्रिगर निर्माण
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) वातावरण में ग्राहकों के लिए डाउनटाइम के कारण होने वाली चुनौतियों से बचाती है।
कोई टिप्पणी करने या प्रश्न पूछने के लिए प्रतिक्रिया टैब का उपयोग करें।