Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

SQL त्रुटि:ORA-14006:अमान्य विभाजन नाम

आप किसी मौजूदा तालिका को इस तरह विभाजित नहीं कर सकते। वह कथन उस विभाजन को संशोधित कर रहा है जो अभी तक नहीं बनाया गया है। मुझे इस ऑपरेशन को करने का स्वचालित तरीका नहीं पता है और मुझे यकीन नहीं है कि आप इसे कर सकते हैं।

हालांकि यह काम मैंने कई बार किया है लेकिन मैनुअल स्टेप्स के साथ। यदि आपको स्वचालित समाधान नहीं मिल रहा है तो निम्न कार्य करें:

  1. अपने खंडों और अपनी सभी प्राथमिकताओं के साथ table_name_part नाम की एक विभाजित तालिका बनाएं।
  2. इस विभाजित तालिका में मूल तालिका से सभी पंक्तियों को सम्मिलित करें। संपीड़न पर ध्यान दें। यदि आपके पास टेबल (बेसिक या एचसीसी) पर कुछ संपीड़न है तो आपको + APPEND का उपयोग करना होगा संकेत।
  3. विभाजित तालिका पर मूल तालिका से अपने अवरोध और अनुक्रमणिका बनाएं।
  4. तालिकाओं का नाम बदलें और मूल तालिका छोड़ें। इसे तब तक न गिराएं जब तक आप उन पर कुछ गिन न लें।

मैंने देखा कि यदि आपकी तालिका मौजूद नहीं है तो विभाजन को स्वतः बनाने का विकल्प है। (NUMTOYMINTERVAL(1,'MONTH')) तो आपको अपनी तालिका केवल पहले विभाजन के साथ बनानी होगी। मुझे लगता है कि आपके पास यहां बहुत अधिक केवल-पढ़ने के लिए डेटा है, इसलिए आपको पिछले महीने की बजाय निरंतरता के साथ कोई समस्या नहीं होगी। संभवत:कुछ पढ़ने-लिखने का डेटा है, इसलिए आपको उस समय अधिक सावधान रहना होगा जब आप नई तालिका में डेटा सम्मिलित करना चाहते हैं और तालिकाओं को स्विच करना चाहते हैं।

आशा है कि आपकी मदद करेगा। जहाँ तक मुझे पता है, DBMS_REDEFINITION नाम का एक पैकेज हो सकता है जो मेरे चरणों के स्वचालित संस्करण के साथ आपकी मदद कर सकता है। यदि आपको अधिक विवरण की आवश्यकता है या मेरी विधि पर कुछ सहायता की आवश्यकता है, तो कृपया संकोच न करें।

अपडेट करें: Oracle 12c R2 से आप अपनी पद्धति से किसी तालिका को एक विभाजन से विभाजित तालिका में परिवर्तित कर सकते हैं। नीचे एक लिंक खोजें। अब यह मेरे लिए एक चुनौती है और मैं कन्वर्ट करने की कोशिश कर रहा हूं, लेकिन मुझे लगता है कि इस रूपांतरण को 12c R1 में ऑनलाइन करने का कोई तरीका नहीं है।

https://oracle-base.com/articles/12c/online-conversion-of-a-non-partitioned-table-to-a-partitioned-table-12cr2

समाधान

मुझे आपके लिए एक समाधान मिला। यहां आपके पास मेरे सभी चरण होंगे जो मैं तालिका को ऑनलाइन परिवर्तित करने के लिए चलाता हूं। :)

1. Create regular table and populate it.

CREATE TABLE SCOTT.tab_unpartitioned
(
    id              NUMBER,
    description     VARCHAR2 ( 50 ),
    created_date    DATE
);
INSERT INTO tab_unpartitioned
        SELECT LEVEL,
               'Description for ' || LEVEL,
               ADD_MONTHS ( TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' ),
                            -TRUNC ( DBMS_RANDOM.VALUE ( 1, 4 ) - 1 ) * 12 )
          FROM DUAL
    CONNECT BY LEVEL <= 10000;
COMMIT;

2. Create partitioned table with same structure.

--If you are on 11g create table with CREATE TABLE command but with different name. ex: tab_partitioned

CREATE TABLE SCOTT.tab_partitioned
(
    id              NUMBER,
    description     VARCHAR2 ( 50 ),
    created_date    DATE
)
PARTITION BY RANGE (created_date)
INTERVAL( NUMTOYMINTERVAL(1,'YEAR'))
(PARTITION part_2015 VALUES LESS THAN (TO_DATE ( '01-JAN-2016', 'DD-MON-YYYY' )),
 PARTITION part_2016 VALUES LESS THAN (TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' )),
 PARTITION part_2017 VALUES LESS THAN (TO_DATE ( '01-JAN-2018', 'DD-MON-YYYY' )));

--this is an alter command that works only in 12c.
ALTER TABLE tab_partitioned
    MODIFY
        PARTITION BY RANGE (created_date)
        (PARTITION part_2015 VALUES LESS THAN (TO_DATE ( '01-JAN-2016', 'DD-MON-YYYY' )),
         PARTITION part_2016 VALUES LESS THAN (TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' )),
         PARTITION part_2017 VALUES LESS THAN (TO_DATE ( '01-JAN-2018', 'DD-MON-YYYY' )));

3. Check if the table can be converted. This procedure should run without any error. 
Prerequisites: table should have an UNIQUE INDEX and a Primary Key constraint.

EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED');

4. Run the following steps like I have done.

EXEC DBMS_REDEFINITION.START_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED'); 
var num_errors varchar2(2000);
EXEC DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED', 1,TRUE,TRUE,TRUE,FALSE,:NUM_ERRORS,FALSE);
SQL> PRINT NUM_ERRORS -- Should return 0
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');

स्क्रिप्ट के अंत में आप देखेंगे कि मूल तालिका विभाजित है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JMeter - 1 JDBC से दूसरे JDBC में कई मान पास करना

  2. मेरे RDS Oracle उदाहरण को PHP सर्वर से कनेक्ट नहीं कर सकता

  3. Oracle SQL - प्रत्येक पंक्ति में अलग-अलग यादृच्छिक संख्या के साथ एक कॉलम उत्पन्न और अद्यतन करें

  4. Oracle DataReader 1 पंक्ति देता है लेकिन विधि पढ़ें झूठी वापसी करता है

  5. चलाने पर कोड jdbc कनेक्शन खोलता है लेकिन यह टेबल डेटा को प्रिंट नहीं कर रहा है। इस कोड में क्या गलत है?