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

Oracle 10g में DBMS_REDEFINITION के साथ सहज ऑनलाइन टेबल पार्टीशनिंग

Oracle® 10g से शुरू करके, आप DBMS_REDEFINITION पैकेज का उपयोग करके किसी भी एप्लिकेशन डाउनटाइम के बिना टेबल को ऑनलाइन पार्टीशन कर सकते हैं।

DBMS_REDEFINITION का उपयोग करके एक नॉन-पार्टीशन टेबल को पार्टीशन टेबल में बदलने के लिए निम्नलिखित चरणों का उपयोग करें। यह उदाहरण नॉन-पार्टीशन टेबल, TABLEA, को रेंज इंटरवल पार्टीशन टेबल में बदलता है।

चरण 1: अनपार्टीशन टेबल का बैकअप लें

टेबल, TABLEA का पूर्ण एक्सपोर्ट बैकअप बनाने के लिए निम्नलिखित कोड चलाएं।

expdp "/ as sysdba" directory=EXPDP_DIR dumpfile=tableA_UNPAR.dmp logfile=tableA_UNPAR.log TABLES=TEST.TABLEA
expdp "/ as sysdba" directory=EXPDP_DIR dumpfile=tableA_metaunpar.dmp logfile=tableA_metaunpar.log TABLES=TEST.TABLEA content=metadata_only

चरण 2: डेटाबेस ऑब्जेक्ट्स की जांच करें

निम्नलिखित डिपेंडेंट (D) डेटाबेस ऑब्जेक्ट्स को तब ड्रॉप किया जा सकता है जब एक टेबल ड्रॉप की जाती है:

  • CONSTRAINT (कंस्ट्रेंट्स) D

  • INDEX (इंडेक्स) D

  • MATERIALIZED_VIEW_LOG (मटेरियलाइज़्ड व्यू लॉग्स) D

  • OBJECT_GRANT (ऑब्जेक्ट ग्रांट्स) D

  • TRIGGER (ट्रिगर्स) D

निम्नलिखित SQL कमांड चलाएं और आउटपुट को स्पूल फाइल में सहेजें, जैसे cons_trig_indx.txt:

set LINESIZE 500
set PAGESIZE 1000
SQL> spool cons_trig_indx.txt
SQL> select name, type, owner from all_dependencies where referenced_owner = 'TEST' and referenced_name = 'TABLEA';
NAME TYPE OWNER
-------------- -------------- -------
PROC_TABLEA PROCEDURE TEST
TABLEA_TRIGG TRIGGER TEST
PKG_TABLEA PACKAGE BODY TEST
SQL> select OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, STATUS, TABLESPACE_NAME from dba_indexes where TABLE_OWNER='TEST' and TABLE_NAME='TABLEA';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME STATUS TABLESPACE_NAME
---------------------------------------------------------------------------
TEST TABLEA_IDX_ID01 TEST TABLEA VALID TABLEA_TBL
TEST TABLEA_IDX_ID04 TEST TABLEA VALID TABLEA_TBL
TEST TABLEA_IDX_PK TEST TABLEA VALID TABLEA_TBL
SQL> select STATUS, OBJECT_TYPE, OBJECT_NAME from dba_objects where OWNER='TEST' and OBJECT_TYPE = 'TRIGGER' and STATUS='INVALID';
no rows selected
SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE from dba_constraints where TABLE_NAME='TABLEA' and owner='TEST';
SQL> spool off
CONSTRAINT_NAME C
------------------ -----
SYS_C002004601 C
SYS_C002004602 C
SYS_C002004603 C
IDX_PK P
FK01 R

चरण 3: TABLEA का DDL कैप्चर करें

पार्टीशन टेबल बनाने से पहले TABLEA का डेटा डेफिनिशन लैंग्वेज (DDL) कैप्चर करने और स्पूल फाइल DEF_TABLEA.sql में स्क्रिप्ट सहेजने के लिए निम्नलिखित कमांड चलाएं:

set echo off
set feedback off
set linesize 160
set long 2000000
set pagesize 0
set trims on
column txt format a150 word_wrapped
SQL> spool DEF_TABLEA.sql
SQL> select DBMS_METADATA.GET_DDL('TABLE','TABLEA','TEST') txt FROM dual;
SQL> spool off

चरण 4: DDL स्क्रिप्ट कॉपी करें

चरण 3 में बनाई गई DDL स्क्रिप्ट को कॉपी करने के लिए निम्नलिखित कमांड चलाएं।

cp DEF_TABLEA.sql DEF_TABLEA_PAR.sql

चरण 5: नॉन-पार्टीशन टेबल में तिथियों की समीक्षा करें

TABLEA में तिथियां खोजने के लिए निम्नलिखित कमांड चलाएं:

SQL> select * from (select DT from TEST.TABLEA where rownum <15 order by DT DESC);

चरण 6: DEF_TABLEA_PAR.sql फाइल संपादित करें

DEF_TABLEA_PAR.sql को संपादित करके निम्नलिखित परिवर्तन करें:

  • TABLEA के सभी उदाहरणों को TABLEA_PAR में बदलें।

  • सभी कंस्ट्रेंट्स हटाएं, जैसे NOT NULL या कोई अन्य कंस्ट्रेंट।

  • निम्नलिखित कमांड डालें ताकि टेबल एक नए टेबलस्पेस में बने:

    TABLESPACE "TABLEA_TBL_PAR" LOGGING
  • चरण 5 में पहचानी गई तिथियों के आधार पर पार्टीशन परिभाषा जोड़ने के लिए निम्नलिखित कमांड डालें:

    PARTITION BY RANGE(DT) interval (numtoyminterval(1,'MONTH')) (partition TABLEA_2004 values less than (to_date('01/01/2005','DD/MM/YYYY')), partition TABLEA_2005 values less than (to_date('01/01/2006','DD/MM/YYYY')));

DEF_TABLEA_PAR.sql फाइल अब निम्नलिखित उदाहरण की तरह दिखनी चाहिए:

CREATE TABLE "TEST"."TABLEA_PAR" (
"ID" NUMBER(6,0),
"CEID" NUMBER(6,0),
"DT" DATE,
"AMT" NUMBER(14,4),
"RET" NUMBER(14,4),
"CNT" NUMBER(4,0),
"VCNT" NUMBER(4,0),
"EXEDT" DATE,
"LASTUPDBY" VARCHAR2(15),
"VENUM" NUMBER(6,0),
"LASTUPDDT" TIMESTAMP (6))
TABLESPACE "TABLEA_TBL_PAR" LOGGING
PARTITION BY RANGE(DT) interval (numtoyminterval(1,'MONTH'))
(partition TABLEA_2004 values less than (to_date('01/01/2005','DD/MM/YYYY')),
partition TABLEA_2005 values less than (to_date('01/01/2006','DD/MM/YYYY')));

चरण 7: पार्टीशन टेबल बनाएं

DEF_TABLEA_PAR.sql स्क्रिप्ट चलाकर पार्टीशन टेबल बनाएं:

SQL> spool DEF_TABLEA_PAR.outp.txt
SQL> @DEF_TABLEA_PAR.sql
Table Created.
SQL> spool off

चरण 8: पार्टीशन टेबल वेरिफाई करें

पार्टीशन टेबल वेरिफाई करने और परिभाषित पार्टीशन वापस करने के लिए निम्नलिखित कमांड चलाएं:

SQL> spool verify_partition.txt
SQL> select partition_name from DBA_tab_partitions where table_name ='TABLEA_PAR' and table_owner = 'TEST';
SQL> spool off
PARTITION_NAME
-----------------
TABLEA_2004
TABLEA_2005

चरण 9: नॉन-पार्टीशन टेबल पर आंकड़े एकत्र करें

नॉन-पार्टीशन टेबल पर आंकड़े एकत्र करने और उन्हें स्पूल फाइल में सहेजने के लिए निम्नलिखित कमांड चलाएं।

SQL> SPOOL gather_stats.txt
SQL> exec dbms_stats.gather_table_stats ('TEST', 'TABLEA',cascade => TRUE);
SQL> spool off

चरण 10: रीडेफिनिशन संभाव्यता जांचें

नोट: सोर्स टेबल (नॉन-पार्टीशन) को रीडेफिनिशन पैकेज का उपयोग करने से पहले प्राइमरी की की आवश्यकता नहीं है।

यह देखने के लिए कि रीडेफिनिशन संभव है या नहीं, निम्नलिखित कमांड चलाएं, और परिणामों को स्पूल फाइल में सहेजें:

SQL> spool check_the_redefinition.txt
SQL> EXEC DBMS_Redefinition.can_redef_table ('TEST', 'TABLEA');
SQL> spool off

चरण 11: रीडेफिनिशन शुरू करें

यदि check_the_redefinition.txt में कोई त्रुटि सूचीबद्ध नहीं है, तो निम्नलिखित लंबी चलने वाली कमांड का उपयोग करके रीडेफिनिशन शुरू करें:

SQL> spool start_redef_table.txt
SQL>begin dbms_redefinition.start_redef_table (
uname => 'TEST',
orig_table => 'TABLEA',
int_table => 'TABLEA_PAR');
end; /
SQL> spool off

चरण 12: रीडेफिनिशन के दौरान टेबलस्पेस त्रुटियों पर नज़र रखें

चरण 11 में रीडेफिनिशन ऑपरेशन के परिणामस्वरूप निम्नलिखित उदाहरण की तरह टेबलस्पेस अलर्ट हो सकते हैं:

ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-01688: unable to extend table TEST.TABLEA_PAR partition SYS_P42 by 1024 in tablespace TABLEA_TBL
ORA-06512: at "SYS.DBMS_REDEFINITION", line 52
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646
ORA-06512: at line 2
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-14400: inserted partition key does not map to any partition
ORA-06512: at "SYS.DBMS_REDEFINITION", line 52
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646
ORA-06512: at line 2

यदि आप पूर्ववर्ती उदाहरण के समान टेबलस्पेस त्रुटियां देखते हैं, तो आपको निम्नलिखित चरण उठाने चाहिए:

  1. रीडेफिनिशन प्रोसेस रोकने के लिए निम्नलिखित कमांड चलाएं।

    SQL> spool abort_redef_table.txt
    SQL> begin dbms_redefinition.abort_redef_table (
    uname => 'TEST',
    orig_table => 'TABLEA',
    int_table => 'TABLEA_PAR');
    end; /
    SQL> spool off
  2. पार्टीशन टेबल और मटेरियलाइज़्ड व्यू ड्रॉप करें।

  3. टेबलस्पेस का आकार बढ़ाएं। इस उदाहरण में, आपको टेबलस्पेस TABLEA_TBL का आकार बढ़ाना चाहिए।

  4. चरण 11 दोहराएं।

चरण 13: रीडेफिनिशन त्रुटियों की जांच करें

रीडेफिनिशन प्रोसेस सफलतापूर्वक पूरा होने के बाद, किसी भी त्रुटि की जांच के लिए निम्नलिखित कमांड चलाएं:

SQL> spool copy_table_dependents.txt
SQL> SET SERVEROUTPUT ON
DECLARE l_num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.copy_table_dependents(
uname => 'TEST',
orig_table => 'TABLEA',
int_table => 'TABLEA_PAR',
copy_indexes => DBMS_REDEFINITION.cons_orig_params,
-- Non-Default
num_errors => l_num_errors);
DBMS_OUTPUT.put_line('l_num_errors=' || l_num_errors);
END; /
SQL> spool off

यदि रीडेफिनिशन सफल रहा, तो आपको copy_table_dependents.txt फाइल में निम्नलिखित के समान परिणाम देखने चाहिए:

l_num_errors=0
PL/SQL procedure successfully completed.

चरण 14: (वैकल्पिक) पार्टीशन टेबल को रीसिंक्रनाइज़ करें

यदि आप चाहें, तो अंतरिम नाम के साथ पार्टीशन टेबल को रीसिंक्रनाइज़ करने के लिए निम्नलिखित कमांड चलाएं:

SQL> spool sync_interim_table.txt
SQL> BEGIN
DBMS_REDEFINITION.sync_interim_table (
uname => 'TEST',
orig_table => 'TABLEA',
int_table => 'TABLEA_PAR');
END; /
SQL> spool off

चरण 15: पार्टीशन टेबल पर आंकड़े एकत्र करें

पार्टीशन टेबल पर आंकड़े एकत्र करने के लिए निम्नलिखित कमांड चलाएं:

SQL> spool gather_statistics_par.txt
SQL> exec dbms_stats.gather_table_stats ('TEST', 'TABLEA_PAR',cascade => TRUE);
SQL> spool off

चरण 16: कंस्ट्रेंट स्क्रिप्ट बनाएं

वैलिडेट कंस्ट्रेंट सक्षम करने के लिए एक स्क्रिप्ट तैयार करने के लिए निम्नलिखित कमांड चलाएं।

SQL> spool constraint_enable_validate.txt
SET LINESIZE 500
SET PAGESIZE 1000
SQL> select 'alter table' ||' '||OWNER||'.'||TABLE_NAME||' enable validate constraint'||' '||CONSTRAINT_NAME||';' from dba_constraints where TABLE_NAME = 'TABLEA_PAR' and OWNER='TEST';
'ALTERTABLE'||''||OWNER||'.'||TABLE_NAME||'ENABLEVALIDATECONSTRAINT'||''||CONSTR
--------------------------------------------------------------------------------
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004601;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004602;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004603;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_IDX_PK;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_FK01;
SQL> spool off

चरण 17: वैलिडेट कंस्ट्रेंट सक्षम करें

चरण 16 द्वारा उत्पन्न स्क्रिप्ट और कमांड चलाएं, जैसा कि निम्नलिखित उदाहरण में दिखाया गया है:

SQL> spool constraint_enable_execute.outp.txt
SQL>@constraint_enable.sql
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004601;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004602;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_SYS_C002004603;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_IDX_PK;
alter table TEST.TABLEA_PAR enable validate constraint TMP$$_FK01;
SQL> spool off

चरण 18: नॉन-पार्टीशन और पार्टीशन टेबल की तुलना करें

मूल, नॉन-पार्टीशन टेबल की नई, पार्टीशन टेबल के साथ तुलना करें ताकि सत्यापित किया जा सके कि सभी विशेषताएं समान हैं।

चरण 19: टेबल्स का नाम बदलें

अंतरिम टेबल को वास्तविक टेबल के रूप में सेट करने के लिए टेबल नामों को स्विच करने के लिए निम्नलिखित कमांड चलाएं:

SQL> spool finish_redef_table.txt
BEGIN
DBMS_REDEFINITION.finish_redef_table (
uname => 'TEST',
orig_table => 'TABLEA',
int_table => 'TABLEA_PAR');
END; /
--------------------------------------------
@?/rdbms/admin/utlrp.sql
--------------------------------------------
SQL>spool off

चरण 20: टेबल्स की तुलना करें

दोनों टेबल के रिकॉर्ड काउंट की तुलना करने और यह सुनिश्चित करने के लिए कि वे मेल खाते हैं, निम्नलिखित कमांड चलाएं:

SQL> spool table_count.outp.txt
SQL> select count(*) from TEST.TABLEA;
COUNT(*)
----------
890540
SQL> select count (*) from TEST.TABLEA_PAR;
COUNT(*)
----------
890540
SQL> spool off

चरण 21: पार्टीशन सफलता वेरिफाई करें

यह सत्यापित करने के लिए कि पार्टीशन प्रक्रिया सफल रही, निम्नलिखित कमांड चलाएं:

SQL> spool check_partition.txt
SQL> select partitioned from dba_tables where table_name = 'TABLEA' and owner='TEST';
PAR
------
YES
SQL> select partition_name , SUBPARTITION_COUNT, TABLESPACE_NAME from dba_tab_partitions where table_name='TABLEA' and table_owner='TEST';
SQL> select table_name, partition_name, high_value, partition_position from DBA_tab_partitions where table_name='TABLEA' and table_owner='TEST';
SQL> spool off

चरण 22: डेटाबेस ऑब्जेक्ट्स की पुनः जांच करें

डेटाबेस ऑब्जेक्ट्स की जांच करने और चरण 2 के परिणामों से तुलना करने के लिए निम्नलिखित कमांड चलाएं:

SET LINESIZE 500
SET PAGESIZE 1000
SQL> spool cons_indx_trigg.txt
SQL> select name, type, owner from all_dependencies where referenced_owner = 'TEST' and referenced_name = 'TABLEA';
NAME TYPE OWNER
---------------- --------------- ------------
PROC_TABLEA PROCEDURE TEST
TABLEA_TRIGG TRIGGER TEST
PKG_TABLEA PACKAGE BODY TEST
SQL> select OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, STATUS, TABLESPACE_NAME from dba_indexes where TABLE_OWNER='TEST' and TABLE_NAME='TABLEA';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME STATUS TABLESPACE_NAME
------------------------------------------------------------------------
TEST TABLEA_IDX_ID01 TEST TABLEA VALID TABLEA_TBL
TEST TABLEA_IDX_ID04 TEST TABLEA VALID TABLEA_TBL
TEST TABLEA_IDX_PK TEST TABLEA VALID TABLEA_TBL
SQL> select STATUS, OBJECT_TYPE, OBJECT_NAME from dba_objects where OWNER='TEST' and OBJECT_TYPE = 'TRIGGER' and STATUS='INVALID';
no rows selected
SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE from dba_constraints where TABLE_NAME='TABLEA' and owner='TEST';
CONSTRAINT_NAME C
------------------- ----------
SYS_C002004601 C
SYS_C002004602 C
SYS_C002004603 C
IDX_PK P
FK01 R
12 rows selected.
SQL> spool off

चरण 23: इंडेक्स रीबिल्ड करें

नए टेबलस्पेस पर इंडेक्स रीबिल्ड करने के लिए निम्नलिखित कमांड चलाएं:

SQL> spool rebuild_indx.txt
SQL>@rebuild_index.sql
ALTER INDEX TEST.TABLEA_IDX_ID01 REBUILD TABLESPACE TABLEA_TBL_PAR ONLINE;
ALTER INDEX TEST.ITABLEA_IDX_ID04 REBUILD TABLESPACE TABLEA_TBL_PAR ONLINE;
ALTER INDEX TEST.TABLEA_IDX_PK REBUILD TABLESPACE TABLEA_TBL_PAR ONLINE;
SQL> spool off

चरण 24: इंडेक्स मान्य करें

यह सत्यापित करने के लिए कि स्टेटस valid है और सभी इंडेक्स के लिए टेबलस्पेस TABLEA_TBL_PAR है, निम्नलिखित कमांड चलाएं:

SQL> spool verify_indx.outp.txt
SQL> select OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, STATUS, TABLESPACE_NAME from dba_indexes where TABLE_OWNER='TEST' and TABLE_NAME='TABLEA';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME STATUS TABLESPACE_NAME
---------------------------------------------------------------------------
TEST TABLEA_IDX_ID01 TEST TABLEA VALID TABLEA_TBL_PAR
TEST TABLEA_IDX_ID04 TEST TABLEA VALID TABLEA_TBL_PAR
TEST TABLEA_IDX_PK TEST TABLEA VALID TABLEA_TBL_PAR
SQL>spool off

चरण 25: मूल नॉन-पार्टीशन टेबल ड्रॉप करें

DBAs द्वारा पुष्टि किए जाने के बाद कि सब कुछ अच्छा दिखता है, मूल टेबल को हटाने के लिए निम्नलिखित कमांड चलाएं, जिसका नाम अब अंतरिम टेबल, TEST.TABLEA_PAR का नाम है:

SQL> DROP table TEST.TABLEA_PAR cascade constraints;

निष्कर्ष

पिछले चरणों ने अंतरिम टेबल, TEST.TABLEA_PAR, का उपयोग टेबल, TEST.TABLEA, को रेंज इंटरवल टेबल में पार्टीशन करने के लिए किया, बिना किसी एप्लिकेशन डाउनटाइम के।

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

  1. APP_MULTI पैकेज का उपयोग करके Oracle Forms को मल्टी-सेलेक्शन से बढ़ाएं APP_MULTI पैकेज का उपयोग करके Oracle Forms को मल्टी-सेलेक्शन से बढ़ाएं

    परिचय Oracle® APP_MULTI पैकेज आपको एक फॉर्म में मल्टी-सेलेक्शन कार्यक्षमता जोड़ने में सक्षम बनाता है। यह विकल्प APPCORE लाइब्रेरी में उपलब्ध है। APP_MULTI पैकेज का उपयोग करके, आप सिंगल या मल्टीपल रिकॉर्ड चुन सकते हैं और उन्हें आवश्यकतानुसार प्रोसेस कर सकते हैं। निम्न चित्र रैंडम रिकॉर्ड चयन को दर्शा

  1. Oracle 19c DBCA के साथ रिमोट PDB को CDB में कुशलतापूर्वक क्लोन करें Oracle 19c DBCA के साथ रिमोट PDB को CDB में कुशलतापूर्वक क्लोन करें

    यह ब्लॉग डेटाबेस कॉन्फ़िगरेशन असिस्टेंट (DBCA) का उपयोग करने के तरीकों का परिचय देता है, जो Oracle 19c में एक नई सुविधा है, एक रिमोट प्लगेबल डेटाबेस (PDB) को एक कंटेनर डेटाबेस (CDB) में क्लोन करने के लिए बिना स्रोत डेटाबेस का बैकअप लिए। स्रोत से लक्ष्य तक क्लोन करने में न्यूनतम समय लगता है। स्रोत DB

  1. Oracle SQL प्रोफाइल और बेसलाइन में महारत: क्वेरी प्रदर्शन बढ़ाएं Oracle SQL प्रोफाइल और बेसलाइन में महारत: क्वेरी प्रदर्शन बढ़ाएं

    यह पोस्ट Oracle® में SQL प्रोफाइल और बेसलाइन के बीच अंतर पर प्रकाश डालती है और बताती है कि क्वेरी ट्यून करते समय यह कैसे काम करता है। ऑप्टिमाइज़र, प्रोफाइल, और बेसलाइन उच्च स्तर पर, ये तीन तत्व निम्नानुसार एक साथ काम करते हैं: क्वेरी ऑप्टिमाइज़र सिस्टम आँकड़े, बाइंड वेरिएबल्स, और कंपाइलेशन जैसी जा