Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> डेटाबेस

DBMS_REDEFINTION के साथ तालिकाओं को ऑनलाइन पुनर्परिभाषित करें

ऑनलाइन तालिका पुनर्परिभाषा आपको डेटा को अनुपलब्ध किए बिना उत्पादन में अपनी Oracle® तालिका को पुनर्गठित करने की अनुमति देती है। आप डेटा को इधर-उधर ले जाने के लिए अस्थायी तालिकाओं का उपयोग करने में सहज हो सकते हैं, लेकिन एक बेहतर समाधान है।

परिचय

जब आप अपनी तालिका का पुनर्गठन करते हैं तो डेटा को व्यवस्थित करना और उसे इधर-उधर करना तालिका और डेटा दोनों को एक निश्चित अवधि के लिए अनुपलब्ध बनाता है, जो व्यवसायों के लिए अनुकूल स्थिति से कम है। यह तब होता है जब DBMS_REDEFINITION पैकेज दिन बचाता है, जैसा कि निम्न चित्र में दिखाया गया है:

DBMS_REDEFINTION के साथ तालिकाओं को ऑनलाइन पुनर्परिभाषित करें

उद्देश्य

समय-समय पर, आपको निम्नलिखित कारणों से Oracleटेबल की तार्किक या भौतिक संरचना को संशोधित करने की आवश्यकता होती है:

  • क्वेरी या डेटा मैनिपुलेशन लैंग्वेज (डीएमएल) के प्रदर्शन को बढ़ाने के लिए
  • आवेदन परिवर्तनों को समायोजित करने के लिए
  • भंडारण प्रबंधित करने के लिए

Oracle डेटाबेस तालिका की उपलब्धता को महत्वपूर्ण रूप से प्रभावित किए बिना तालिका संरचना संशोधन करने के लिए एक तंत्र प्रदान करता है, जिसे ऑनलाइन तालिका पुनर्परिभाषा के रूप में जाना जाता है। तालिकाओं को पुनर्परिभाषित करने के पारंपरिक तरीकों की तुलना में तालिकाओं को ऑनलाइन पुनर्परिभाषित करने से प्रदर्शन में उल्लेखनीय वृद्धि होती है।

जब किसी तालिका को ऑनलाइन पुनर्परिभाषित किया जाता है, तो यह अधिकांश पुनर्परिभाषा प्रक्रिया के दौरान प्रश्नों और डीएमएल दोनों के लिए सुलभ होती है। तालिका केवल एक छोटी अवधि के लिए अनन्य मोड में बंद है, जो तालिका के आकार और पुनर्परिभाषित की जटिलता से स्वतंत्र है। पुनर्परिभाषा प्रक्रिया उपयोगकर्ताओं के लिए पूरी तरह से पारदर्शी है।

ऑनलाइन तालिका पुनर्परिभाषित के लिए खाली स्थान की आवश्यकता होती है जो वर्तमान में पुनर्परिभाषित की जा रही तालिका द्वारा उपयोग किए जाने वाले स्थान के लगभग बराबर है।

तालिका को पुनर्गठित करने के कई तरीके हैं। जब डाउनटाइम एक चुनौती है, तब 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 शुरू करने को दर्शाता है :

[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) वातावरण में ग्राहकों के लिए डाउनटाइम के कारण होने वाली चुनौतियों से बचाती है।

कोई टिप्पणी करने या प्रश्न पूछने के लिए प्रतिक्रिया टैब का उपयोग करें।


  1. जावा MySQL के साथ एक MySQL तालिका अपडेट करें

    इसके लिए आपको जावा में रेडीस्टेटमेंट को अपडेट के लिए इस्तेमाल करना होगा। आइए पहले एक टेबल बनाएं - टेबल बनाएं DemoTable(Id int, FirstName varchar(40));क्वेरी ओके, 0 पंक्तियाँ प्रभावित (0.62 सेकंड) इंसर्ट कमांड का उपयोग करके टेबल में कुछ रिकॉर्ड डालें - डेमोटेबल वैल्यू (121, सैम) में डालें; क्वेरी

  1. एक्सेस में टेबल डिज़ाइनर के साथ टेबल कैसे बनाएं

    डेटा का अधिक कुशलता से विश्लेषण और प्रबंधन करने के लिए, Microsoft Office Access इसे संबंधित तालिकाओं के संग्रह के रूप में संग्रहीत करता है। तो, आप एक्सेस डेटाबेस को संबंधित तालिकाओं के संग्रह के रूप में देख सकते हैं। टेबल डिज़ाइनर . के साथ टेबल बनाने की प्रक्रिया में पहुंच इतना मुश्किल नहीं है। ए

  1. Oracle बाहरी तालिकाओं का उपयोग करें

    बाहरी तालिकाएँ डेटाबेस के बाहर संग्रहीत फ़्लैट फ़ाइलों से डेटा प्राप्त करती हैं और Oracle® को उन फ़ाइलों में डेटा को क्वेरी करने की अनुमति देती हैं। परिचय Oracle SQL*Loader द्वारा समर्थित किसी भी फ़ाइल स्वरूप को पार्स कर सकता है। आप बाहरी तालिकाओं पर डेटामैनिपुलेशन भाषा (डीएमएल) का उपयोग नहीं कर सक